Bach скобки: (), {}, $(), [], [[]]

Эта шпаргалка поможет быстро вспомнить, как работают разные типы скобок в Bash - они используются для команд, массивов, условий, циклов и подстановок.

$(commands)

Выполняет команду и сохраняет вывод. Позволяет сохранить в переменной результат команды.

log_file="/var/log/syslog"
keyword="error"
output=$(grep "$keyword" "$log_file")

{ list; }

Выполняет группу команд в том же процессе оболочки. Фигурные скобки объединяют команды для последовательного выполнения в текущем окружении.

{
  sudo apt install exa
  echo exa
  echo "Listed files using exa"
}

( list )

Выполняет список команд в отдельном подпроцессе (subshell). Команды выполняются изолированно от основной оболочки.

(
  cd /home/user
  ls
  whoami
)

( a b c )

Создает массив значений. Позволяет хранить несколько элементов в одной переменной.

files=(log.txt log2.txt log3.txt)
for file in "${files[@]}"; do
  echo "Processing $file"
done

{range}

Создает последовательности строк. Позволяют генерировать наборы строк или чисел, удобно для пакетных операций.

for file in backup_{1..4}.tar.gz; do
  mv "$file" /var/oldbackups
done

${variable}

Доступ к значению переменной. Обычно используется, если нужно добавить к значению текст или символы.

username="John"
greeting="Hello, ${username}!"
echo "$greeting"

${expression}

Изменяет содержимое переменной. Расширение параметров позволяет менять значение переменной, например, расширение файла .txt на .bak.

filename="report.txt"
backup_file="${filename%.txt}.bak"
echo "Backup file: $backup_file"

$((expression))

Выполняет арифметические операции. Двойные круглые скобки используются для вычислений: сложение, умножение и т.п.

num1=5
num2=3
result=$((num1 * num2 + 1))

[ expression ]

Проверяет условие. Классическая команда test. Это встроенная утилита POSIX, работающая во всех шеллах (sh, bash, zsh). Она НЕ поддерживает логические операторы &&, || и шаблоны == *.txt, только простые проверки: существует ли файл, равны ли строки, больше ли число и т.п.
Все аргументы должны быть разделены пробелами, иначе будет ошибка синтаксиса.

file="/etc/passwd"
if [ -f "$file" ]; then
  echo "File exists"
fi
if [ "$a" = "$b" ]; then
  echo "Equal"
fi

[[ expression ]]

Проверяет условие. Современный, улучшенный вариант в Bash и Zsh.

  • безопаснее в кавычках (не ломается при пустых значениях);
  • поддерживает логические операторы && и ||;
  • понимает шаблоны (== *.log) и регулярные выражения (=~ regex);
  • не требует кавычек вокруг переменных (ошибки не будет, если переменная пуста).
user=$USER
if [[ $user == "root" ]]; then
  echo "You are the root user"
fi
if [[ $file == *.txt && -f $file ]]; then
  echo "Text file exists"
fi
  • [ ... ] — старый POSIX-совместимый синтаксис, безопасен для скриптов, работающих в разных шеллах.
  • [[ ... ]] — современный синтаксис Bash, безопаснее и мощнее для сложных условий.