Я пробую команду
$ b=5; echo `$b`;
-bash: 5: command not found
но он не печатает 5, как это должно быть. Что мне здесь не хватает?
Что `(backquote / backtick) означает в командах? кажется, говорит, что `
оценивает команды внутри и заменяет их выводом.
bash
shell
command-substitution
coolcric
источник
источник
Ответы:
Текст между обратными чертами выполняется и заменяется выводом команды (за исключением завершающих символов новой строки, и имейте в виду, что поведение оболочки меняется, когда в выводе присутствуют символы NUL). Это называется заменой команды, потому что она заменяется выводом команды. Поэтому, если вы хотите напечатать 5, вы не можете использовать обратные метки, вы можете использовать кавычки, например,
echo "$b"
или просто отбросить любую цитату и использоватьecho $b
.Как вы можете видеть, поскольку
$b
содержит 5, при использовании backticksbash
пытается выполнить команду5
и, поскольку нет такой команды, он завершается с сообщением об ошибке.Чтобы понять, как работают обратные пометки, попробуйте запустить это:
cat /etc/passwd |head -n1
должен напечатать первую строку/etc/passwd
файла. Но так как мы используем обратные пометки, он не печатает это на консоли. Вместо этого он хранится вA
переменной. Вы можете повторить$A
это. Обратите внимание, что более эффективный способ печати первой строки - использование команды,head -n1 /etc/passwd
но я хотел отметить, что выражение внутри обратных кавычек не должно быть простым.Так что если первая строка в / etc / passwd
root:x:0:0:root:/root:/bin/bash
, первая команда будет динамически заменена на bashA="root:x:0:0:root:/root:/bin/bash"
.Обратите внимание, что этот синтаксис имеет оболочку Bourne. Цитирование и экранирование быстро превращаются в кошмар, особенно когда вы начинаете их вкладывать. Ksh представил
$(...)
альтернативу, которая теперь стандартизирована ( POSIX ) и поддерживается всеми оболочками (даже оболочкой Bourne из Unix v9). Таким образом, вы должны использовать$(...)
вместо этого в настоящее время, если вам не нужно быть переносимым на очень старые оболочки Борна.Также обратите внимание, что выходные данные
`...`
и$(...)
подвергаются разделению слов и генерации имени файла точно так же, как расширение переменных (в zsh, только разделение слов), поэтому обычно нужно заключать в кавычки в контекстах списка.источник
you can use quotation marks, like echo "$b"
=> "" делает что-нибудь особенное? Кажется,echo $b
будет работать так же хорошо.echo
команда не заботится о количестве аргументов, которые она получает, поэтому, еслиb
внутри есть несколько пробелов, она получит несколько аргументов и все равно их напечатает. Это может быть не так для других команд (особенно когда переменная не установлена), поэтому я склонен всегда заключать переменные в кавычки.(POSIX)
бы была ссылка на актуальный стандарт.Обратный удар делает именно то, что вы говорите, он делает. Вы установили переменную в целое число. Когда вы помещаете эту переменную в обратные галочки, bash попытается выполнить ее как команду. Поскольку это не команда, вы получите ошибку, которую вы видели.
То, что вы хотите сделать, это просто:
Чтобы лучше понять обратные трюки, сравните с:
источник
Идя шаг за шагом, ваша линия должна объяснить это.
b
на 5$b
(эффективно работает5
)echo
Если результат оценки выше.Так что да, вы получите ожидаемый результат. Вы оцениваете содержимое переменной, а не фактическую команду, о которой думали. Все, что вы помещаете в обратные метки, просто оценивается (выполняется) в новой (под) оболочке.
источник