$(var)
является подстановкой команды - она выполнит команду с именем var
и поместит вывод в текущую команду.пример:
getent passwd $(whoami)
"$(var)"
- то же самое, что и выше, за исключением кавычек, вывод команды будет заменен на текущую команду как одно слово.Рассмотрим разницу между
printf "%s\n" $(uname -a)
и
printf "%s\n" "$(uname -a)"
$(( var ))
- это арифметическое расширение, в котором вычисляется арифметическое выражение, содержащееся в переменной var
.Пример:
var='6*7'
echo "$((var))"
В общем, если вам не нужны определенные побочные эффекты, всегда заключайте в кавычки расширения: Последствия для безопасности, связанные с забыванием заключить в кавычки переменную в оболочке bash / POSIX
Для while
(а также if
) следующая часть - это команда .Условное ветвление будет определяться статусом выхода команды: 0 - «истина», все остальное - «ложь».
Бывает, что [
является псевдонимом длякоманда test
(при условии, что последний аргумент [
должен быть ]
)
Эти два цикла while эквивалентны по своей бесконечности:
while true; do ...
while [ 1 -eq 1 ]; do
while [ $(id -u root) = "0" ]; do ...
Использование одиночногоВ скобках командный конвейер, следующий за while
, помещается в подоболочку.Изменения, которые вы вносите в оболочку в подоболочке, исчезают после ее завершения.Например, чтобы зациклить, когда в / tmp более 10 файлов, мы могли бы сделать:
while (cd /tmp; n=(*); [ "${#n[@]}" -gt 10 ]); do ...
При выходе из подоболочки текущий каталог больше не является / tmp, а переменная n не существует.
Двойные скобки обозначают арифметическое выражение:
while (( x * y < 100 )); do ...