[Команда звичайна команда. Хоча більшість оболонок забезпечує це як вбудований для ефективності, він підкоряється нормальним синтаксичним правилам оболонки. [точно рівнозначний 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" ]].
У всьому цьому правильним є використання подвійних лапок, тож ви можете також пропустити розширені правила та користуватися цитатами весь час.