Подтвердить что ты не робот

Как отобразить "$ x_ $ y" в скрипте Bash?

Очень интересно, что если вы намереваетесь отобразить 0_1 с помощью Bash, используя код

x=0
y=1
echo "$x_$y"

тогда будет отображаться только

1

Я попробовал echo "$x\_$y", и он не работает.

Как я могу повторить форму $x_$y? Я собираюсь использовать его в строке имени файла.

4b9b3361

Ответ 1

Поскольку имена переменных имеют в них символы подчеркивания, команда:

echo "$x_$y"

пытается эхо ${x_} (что, вероятно, пуст в вашем случае), а затем ${y}. Причина этого заключается в том, что расширение параметра является жадной операцией - после создания $ для создания имени переменной потребуется как можно больше допустимых символов.

Соответствующая часть управляющей страницы bash гласит:

Символ $ вводит расширение параметра, подстановку команд или арифметическое расширение.

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

Когда используются фигурные скобки, согласованная конечная скобка является первой }, не выполняемой обратным слэшем или внутри строки с кавычками, а не внутри встроенного арифметического расширения, подстановки команды или расширения параметра.

Следовательно, решение состоит в том, чтобы гарантировать, что _ не рассматривается как часть первой переменной, что можно сделать с помощью:

echo "${x}_${y}"

Я предпочитаю делать все мои переменные bash, как это, даже автономные, например:

echo "${x}"

поскольку он более явный, и я так много раз укусил в прошлом: -)

Ответ 2

Таким образом:

$ echo "${x}_${y}"
0_1

Ответ 3

оберните его в фигурные скобки:

echo "${x}_${y}"

Ответ 4

Только для того, чтобы выиграть тренд, вы также можете сделать это:

echo $x'_'$y

Вы можете иметь процитированные и некотируемые части рядом друг с другом без пробелов между ними. А поскольку ' не является юридическим символом для имени переменной, bash будет заменять только $x.:)