Вы должны использовать переменные в нижнем регистре (это лучшая практика).
Так, я буду использовать filename и extension вместо FILENAME и EXTENSION
Поскольку вы говорите, что "имя файла считывается из файла", я предположу, что сценарий таков:
read -r filename <file.txt
extension=World.txt
И что вы хотите объединить обе переменные $filename и $extension со знаком подчеркивания _
Примеры, которые вы приводите (кроме: без двойного \), работают правильно:
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
Как и некоторые другие:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
Таким образом, ваша проблема не в том, как переменные склеены вместе, а в содержимом переменных. Кажется разумным предположить, что при чтении из файла windows:
read -r filename <file.txt
будет считываться возврат каретки \r
.
Одно из простых решений (для ksh, bash, zsh) - удалить все управляющие символы из переменной read:
filename=${filename//[[:cntrl:]]/}
Это можно имитировать значением, содержащим возврат каретки:
$ filename=$'Hello\r'
$ echo "starting<$filename>end"
>endting<Hello ### note the return to the start of line.
$ echo "starting<${filename//[[:cntrl:]]/}>end"
starting<Hello>end
Или, заменив значение filename
:
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
Таким образом:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
Будет получено правильное значение для name
, даже если другие переменные содержат управляющие символы.
Вам не нужно захватывать вывод ls
, вам нужно найти команду search
в grub
.
Search devices by file ('-f', '--file'), filesystem label ('-l', '--label'), or filesystem UUID ('-u', '--fs-uuid').
По сути, это позволяет вам искать ваш SSD либо по какому-либо файлу, присутствующему на SSD, либо по метке файловой системы или UUID.