[
Команда звичайна команда. Хоча більшість оболонок забезпечує це як вбудований для ефективності, він підкоряється нормальним синтаксичним правилам оболонки. [
точно рівнозначний test
, за винятком випадків, коли [
потрібен ]
як останній аргумент, і test
не.
Подвійні дужки - [[ … ]]
це особливий синтаксис. Вони були введені в ksh (через кілька років [
), тому що [
правильно використовувати правильно і [[
дозволяють отримати нові приємні доповнення, які використовують спеціальні символи оболонки. Наприклад, можна писати
[[ $x = foo && $y = bar ]]
тому що весь умовний вираз аналізується оболонкою, тоді як [ $x = foo && $y = bar ]
спочатку він буде розділений на дві команди [ $x = foo
і $y = bar ]
розділений &&
оператором. Аналогічно подвійні дужки дозволяють такі речі, як синтаксис відповідності шаблону, наприклад, [[ $x == a* ]]
перевірити, чи починається значення x
з a
; в окремих дужках це розшириться a*
до списку файлів, імена яких починаються з a
поточного каталогу. Подвійні дужки вперше були введені в ksh і доступні лише у ksh, bash та zsh.
Усередині поодинокі дужки, ви повинні використовувати подвійні лапки підстановок змінних, як і в більшості інших місць, тому що вони тільки аргументи команди (що трапляється, [
команда). Усередині подвійних дужок вам не потрібні подвійні лапки, тому що оболонка не робить розбиття слів або глобулювання: це розбір умовного виразу, а не команди.
Виняток є, [[ $var1 = "$var2" ]]
коли вам потрібні цитати, якщо ви хочете порівняти рядки байт-байт, інакше $var2
це буде зразок, який повинен відповідати $var1
.
Одне з чого ви не можете зробити [[ … ]]
- це використовувати змінну в якості оператора. Наприклад, це цілком законно (але рідко корисно):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
У вашому прикладі
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
команда всередині if
є [
з 4 -х аргументів -d
, /home/mazimi/VirtualBox
, VMs
і ]
. Оболонка розбирає, -d /home/mazimi/VirtualBox
а потім не знає, що з цим робити VMs
. Вам потрібно не допустити поділу слів, ${dir}
щоб отримати добре сформовану команду.
Взагалі кажучи, завжди використовуйте подвійні лапки навколо підстановок змінних та команд, якщо ви не знаєте, що хочете виконати розбиття слів і глобалізацію результату. Основні місця, де безпечно не використовувати подвійні лапки, - це:
- у призначенні:
foo=$bar
(але зауважте, що вам потрібні подвійні лапки в export "foo=$bar"
присвоєннях або в масиві на зразок array=("$a" "$b")
);
- у
case
заяві case $foo in …
:;
- в подвійних дужках , за винятком на правій стороні
=
або ==
оператора (якщо ви не хочете робити зіставлення з зразком): [[ $x = "$y" ]]
.
У всьому цьому правильним є використання подвійних лапок, тож ви можете також пропустити розширені правила та користуватися цитатами весь час.