Мне нужно объединить две переменные, чтобы создать имя файла с подчеркиванием. Позволяет вызвать мои переменные $FILENAME
и $EXTENSION
где имя файла читается из файла.
FILENAME=Hello
EXTENSION=WORLD.txt
В настоящее время...
Я попробовал следующее без успеха:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Я всегда получаю какой-то странный вывод. Обычно подчеркивание первое.
Мне нужно чтобы это было
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
источник
источник
Ответы:
Вы можете использовать что-то вроде этого:
Это работает также:
источник
echo
не может помочь. Вторая команда уже была дана в вопросе.Твой:
все в порядке, так будет:
(но , конечно , не
так он используетNAME=$(echo ${FILENAME}_${EXTENSION})
echo
и оператор ).split+glob
было бы так же, как:
as
_
(вопреки\
или'
) является допустимым символом в имени переменной.Ваша проблема в том, что у вас были строки, разделенные CRLF, а не просто LF, что означало, что содержимое этой переменной заканчивалось символом CR.
Символ CR при записи в терминал говорит терминалу переместить курсор в начало строки. Таким образом,
Hello<CR>_WORLD.TXT<CR>
при отправке в терминал будет отображаться как_WORLD.TXT
(переопределениеHello
).источник
Я перешел на использование
${FILENAME}_${EXTENSION}
синтаксиса, упомянутого выше.Я использовал,
$()
когда мне нужно было объединить две переменные с подчеркиванием. Например,$YYYYMMDD$()_$HHMMSS
чтобы сгенерировать имя файла, содержащее метку времени в формате ГГГГММДД_ЧЧММСС. Середина$()
ничего не возвращает и разбивает две переменные.Я использовал
time
для измерения назначений, используя$YYYYMMDD$()_$HHMMSS
метод и некоторые из них выше, и все они сообщили 0 мс на старом сервере, на котором я использую это. Производительность не кажется проблемой.источник
$()
разворачивает подоболочку в несколько оболочек (некоторые оптимизируют ее). Он также угоняет оператора за то, для чего он не предназначен.${x}_y
это то, что вы хотите.Вы должны использовать переменные в нижнем регистре (это лучшая практика).
Итак, я буду использовать имя файла и расширение вместо FILENAME и EXTENSION
Поскольку вы говорите, что «имя файла читается из файла», я предполагаю, что скрипт:
И что вы хотите объединить обе переменные $ filename и $ extension с подчеркиванием
_
.Примеры, которые вы предоставляете (кроме: no double \), работают правильно:
Как и некоторые другие:
Итак, ваша проблема не в том, как переменные слипаются, а в содержимом переменных. Кажется разумным думать, что это:
будет читать завершающий возврат каретки
\r
при чтении из файла Windows.Одним из простых решений (для ksh, bash, zsh) является удаление всех управляющих символов из переменной чтения:
Это может быть смоделировано со значением, которое имеет возврат каретки:
Или, заменив значение
filename
:Заключение.
Итак, это:
name
Получит правильное значение, даже если другие переменные содержат управляющие символы.источник
Ответ Стефана Шазела ,
это, конечно, лучший ответ, и должен быть принятым ответом. Но, в духе ответа пользователя 208145 , вот альтернатива:
источник
Вы также можете использовать это: разделите отдельные переменные пробелами и объедините их, используя tr для удаления пробела.
источник