Как включить тире (или другие специальные символы) в конкатенацию строк?

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

Скажем, у меня есть 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 — это просто сравнение/сортировка дат.]

Я не могу воспроизвести проблему. См. ideone.com/eU8Wil, он печатает var1var2-var1

Barmar 10.04.2019 11:13

Ну, в переменной shell усечение не работает таким образом, поэтому вы используете bash, а не shell. А в bash работает нормально...

samthegolden 10.04.2019 11:17

Используете ли вы окончания строк Windows? CRLF? Тогда первый var1 на самом деле может быть вторым, перезаписывающим первый.

muru 10.04.2019 11:18

@muru, если бы это было так, var2 перезаписал бы var1

kvantour 10.04.2019 11:21

@kvantour не обязательно, они являются подстроками какой-то другой строки, и в этой другой строке может быть CRLF.

muru 10.04.2019 11:23

Можете ли вы дать нам минимальный воспроизводимый пример, каковы значения otherstring и otherstring2

kvantour 10.04.2019 11:23

Я добавил весь код, который запускаю как скрипт .sh.

stonebird 10.04.2019 11:27

У вас опечатка: dia1 = "${var2:6:2}" должно быть dia2 = "${var2:6:2}"

Barmar 10.04.2019 11:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
905
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код работает так, как я ожидал.

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

datap1 = "$var1$var2-$var1"

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

datap1 = "$var1$var2_$var1"

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

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

Это странно, я уже пробовал два способа конкатенации, и ни один из них не работает, мой вывод все еще обрезается после тире/полосы.

stonebird 10.04.2019 11:28

Что вы увидите, если сделаете echo "$datap1" | od -c? Вы видите \r в выводе?

Barmar 10.04.2019 11:35

У меня получилось следующее: 0000000 2 0 1 9 0 4 0 3 - \n 0000012

stonebird 10.04.2019 11:40

Вы никогда не ставите $dia2, вы ставите $dia1 дважды.

Barmar 10.04.2019 11:43

Спасибо! Вот и все!

stonebird 10.04.2019 11:52

Почему вы приняли этот ответ? Это совсем не связано с реальной проблемой, которая у вас была.

Barmar 10.04.2019 11:55

Потому что это в первую очередь проясняет вопрос, даже если моя проблема была другой. Я не был очень уверен, что конкатенация была правильной, это было просто предположение, и, поскольку я не получал правильного вывода, я не мог иметь ни малейшего представления об использовании тире/черты/и т. д. в строке.

stonebird 10.04.2019 12:29

Другие вопросы по теме