Как включить тире (или другие специальные символы) в конкатенации строк? - PullRequest
0 голосов
/ 10 апреля 2019

Так что это может быть простой и тривиальный вопрос, но я борюсь с использованием тире / минус (-) в конкатенации строк.(На самом деле с другими символами, такими как низкий бар и т. Д. Тоже.)

Скажем, у меня есть 3 переменные:

var1="${otherstring:0:4}"
var2="${otherstring:4:2}"
var3="${otherstring2:6:2}"

И я хотел бы объединить их в следующемпуть:

datap1="$var1$var2"-"$var3"

с чертой, вставленной между ними.

Проблема в том, что мой вывод обрезается после тире:

var1var2-

Что я делаю неправильно?


РЕДАКТИРОВАТЬ - добавив код:

#! /bin/sh -

find . -type f -mtime -7 | sed "s|^\./||" | xargs -n1 gunzip
var1=$(ls -t *.log | head -n1 | sed 's/.log$//' | egrep -o '.{1,8}$')
var2=$(ls -t *.log | tail -n1 | sed 's/.log$//' | egrep -o '.{1,8}$')
any1="${var1:0:4}"
any2="${var2:0:4}"
mes1="${var1:4:2}"
mes2="${var2:4:2}"
dia1="${var1:6:2}"
dia1="${var2:6:2}"
if [ "$any1" == "$any2" ]; then
    if [ "$mes1" == "$mes2" ]; then
        datap1="$any1$mes1$dia1"-"$dia2"
    else
        datap1="$any1$mes1$dia1"-"$mes2$dia2"
    fi
else
    datap1="$any1$mes1$dia1"-"$any2$mes2$dia2"
fi
/usr/local/exim/bin/eximstats -nr -t0 -nt -xls *.log > stats_01_"$datap1".xls
find . -type f -name "*.log" | sed "s|^\./||" | xargs -n1 gzip

И я запускаю это как .sh файл.

[Первыйчасть кода предназначена только для того, чтобы получить необходимую часть для манипулирования строками, журналы содержат дату в конце своего имени.Файлы журналов имеют вид "foo_bar_foo_20190410.log" .Цикл if - это просто сравнение / сортировка дат.]

1 Ответ

2 голосов
/ 10 апреля 2019

Ваш код работает для меня как ожидалось.

Вам даже не нужно ставить тире вне кавычек, это также работает:

datap1="$var1$var2-$var1"

Случай, когда вам нужно сделать что-то особенное, это если символ разделителя разрешен как часть имени переменной, например, нижнее подчеркивание. Если ты пишешь

datap1="$var1$var2_$var1"

попытается найти переменную с именем var2_ и потерпит неудачу, поэтому ничего не будет подставлено; значение будет var1var1. Вы можете поставить скобки вокруг имени переменной, чтобы разделить ее:

datap1="$var1${var2}_$var1"
...