(...)
скобки указывают на под-оболочку. То, что находится внутри них, не является выражением, как во многих других языках. Это список команд (как и вне скобок). Эти команды выполняются в отдельном подпроцессе, поэтому любое перенаправление, присвоение и т.д., выполненное внутри круглых скобок, не имеет эффекта за пределами круглых скобок.
$(...)
- это подстановка команды: внутри круглых скобок находится команда, и вывод команды используется как часть командной строки (после дополнительных расширений, если подстановка не находится между двойными кавычками, но это другая история). { ... }
скобки похожи на круглые скобки тем, что группируют команды, но они влияют только на синтаксический разбор, а не на группировку. Программа x=2; { x=4; }; echo $x
печатает 4, тогда как x=2; (x=4); echo $x
печатает 2. (Также скобки, являющиеся ключевыми словами, должны быть разграничены и находиться в командной позиции (отсюда пробел после {
и ;
перед }
), тогда как круглые скобки - нет. Это просто причуда синтаксиса).
${VAR}
- это расширение параметра, расширяющееся до значения переменной, с возможными дополнительными преобразованиями. Оболочка ksh93
также поддерживает ${ cmd;}
как форму подстановки команды, которая не порождает под-оболочку. ((...))
двойные скобки окружают арифметическую инструкцию, то есть вычисления над целыми числами, с синтаксисом, напоминающим другие языки программирования. Этот синтаксис в основном используется для присваиваний и в условных выражениях. Он существует только в ksh/bash/zsh, но не в обычном sh.
$((...))
, которые расширяются до целочисленного значения выражения. [ ... ]
одинарные скобки окружают условные выражения. Условные выражения в основном строятся на операторах, таких как -n "$variable"
для проверки пустоты переменной и -e "$file"
для проверки существования файла. Обратите внимание, что вокруг каждого оператора нужен пробел (например, [ "$x" = "$y" ]
, а не [ "$x"="$y" ]
;
как внутри, так и вне скобок (например. например, [ -n "$foo" ]
, а не [-n "$foo"]
[[ ... ]]
двойные скобки - это альтернативная форма условных выражений в ksh/bash/zsh с несколькими дополнительными возможностями, например, вы можете написать [[ -L $file && -f $file ]]
для проверки, является ли файл символической ссылкой на обычный файл, тогда как одинарные скобки требуют [ -L "$file" ] && [ -f "$file" ]
. Подробнее об этом см. в Почему расширение параметров пробелами без кавычек работает внутри двойных скобок [[, но не одинарных скобок [?. В оболочке каждая команда является условной командой: каждая команда имеет статус возврата, который либо равен 0, что означает успех, либо целое число от 1 до 255 (и потенциально больше в некоторых оболочках), что означает неудачу. Команда [ ... ]
(или [[ ... ]]
) - это определенная команда, которая также может быть написана как test ...
, и достигает успеха, если файл существует, или если строка непустая, или если число меньше другого и т. д. Синтаксическая форма ((...))
приводит к успеху, если число ненулевое. Вот несколько примеров условных выражений в сценарии оболочки:
Проверьте, содержит ли myfile
строку hello
:
if grep -q hello myfile; then ...
Если mydir
- это каталог, перейдите в него и сделайте что-нибудь:
if cd mydir; then
echo "Создается mydir/myfile"
echo 'some content' >myfile
else
echo >&2 "Фатальная ошибка. Этот сценарий требует, чтобы mydir существовал."
fi
Проверка наличия файла с именем myfile
в текущем каталоге:
if [ -e myfile ]; then ...
То же самое, но с учетом висячих символических ссылок:
if [ -e myfile ] || [ -L myfile ]; then ...
Проверьте, что значение x
(которое предполагается числовым) не меньше 2, переносимо:
if [ "$x" -ge 2 ]; then ...
Проверьте, является ли значение x
(которое предполагается числовым) не менее 2, в bash/ksh/zsh:
if ((x >= 2)); then ...