Так что это может быть простой и тривиальный вопрос, но я борюсь с использованием тире/минус (-) в конкатенации строк. (На самом деле с другими символами, такими как низкая полоса и т. д.)
Скажем, у меня есть 3 переменные:
var1 = "${otherstring:0:4}"
var2 = "${otherstring:4:2}"
var3 = "${otherstring2:6:2}"
И я хотел бы объединить их следующим образом:
datap1 = "$var1$var2"-"$var3"
с тире, вставленным между ними.
Проблема в том, что мой вывод обрезается после тире:
var1var2-
Что я делаю неправильно?
EDIT - добавление кода:
#! /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
И я запускаю это как файл .ш.
[Первая часть кода предназначена только для получения необходимой части для манипуляций со строками, журналы содержат дату в конце своего имени. Файлы журнала имеют вид "foo_bar_foo_20190410.log". Цикл if — это просто сравнение/сортировка дат.]
Ну, в переменной shell
усечение не работает таким образом, поэтому вы используете bash
, а не shell
. А в bash
работает нормально...
Используете ли вы окончания строк Windows? CRLF? Тогда первый var1
на самом деле может быть вторым, перезаписывающим первый.
@muru, если бы это было так, var2
перезаписал бы var1
@kvantour не обязательно, они являются подстроками какой-то другой строки, и в этой другой строке может быть CRLF.
Можете ли вы дать нам минимальный воспроизводимый пример, каковы значения otherstring
и otherstring2
Я добавил весь код, который запускаю как скрипт .sh.
У вас опечатка: dia1 = "${var2:6:2}"
должно быть dia2 = "${var2:6:2}"
Ваш код работает так, как я ожидал.
Вам даже не нужно ставить тире вне кавычек, это тоже работает:
datap1 = "$var1$var2-$var1"
Случай, когда вам нужно сделать что-то особенное, заключается в том, что символ-разделитель разрешен как часть имени переменной, например. подчеркивать. Если вы пишете
datap1 = "$var1$var2_$var1"
он попытается найти переменную с именем var2_
, но ничего не подставится; значение будет var1var1
. Вы можете поместить имя переменной в фигурные скобки, чтобы разграничить его:
datap1 = "$var1${var2}_$var1"
Это странно, я уже пробовал два способа конкатенации, и ни один из них не работает, мой вывод все еще обрезается после тире/полосы.
Что вы увидите, если сделаете echo "$datap1" | od -c
? Вы видите \r
в выводе?
У меня получилось следующее: 0000000 2 0 1 9 0 4 0 3 - \n 0000012
Вы никогда не ставите $dia2
, вы ставите $dia1
дважды.
Спасибо! Вот и все!
Почему вы приняли этот ответ? Это совсем не связано с реальной проблемой, которая у вас была.
Потому что это в первую очередь проясняет вопрос, даже если моя проблема была другой. Я не был очень уверен, что конкатенация была правильной, это было просто предположение, и, поскольку я не получал правильного вывода, я не мог иметь ни малейшего представления об использовании тире/черты/и т. д. в строке.
Я не могу воспроизвести проблему. См. ideone.com/eU8Wil, он печатает
var1var2-var1