Домівка > Uncategorized > Відмінності між одинарними ([ ]) і подвійними ([[ ]]) скобами у bash

Відмінності між одинарними ([ ]) і подвійними ([[ ]]) скобами у bash

[ і [[ використовуються для обчислення виразів. [[ працює лише в Bash, Zsh і Korn оболонках, і вона більш потужна; [ доступна в усіх POSIX оболонках.

Одинарна скоба [ насправді це те саме, що команда test, тобто це не синтаксис.

Подвійні скоби [[ ]] – це синтаксис. Вони дозволяють C-подібний синтаксис із >, <, >=, <=, !=, ==, &&, || операторами.

Усередині одинарних скоб, вам потрібно використовувати подвійні лапки навколо змінних, як і в більшості інших місць, оскільки це запобігає тлумаченню всіх спеціальних символів усередині рядка в лапках окрім $, `, \. Усередині подвійних скоб, вам не потрібні подвійні лапки, оскільки оболонка не виконує розбиття на слова чи глобування (globbing): вона розбирає умовний вираз, а не команду.

Хоча є виняток – [[ $var1 == "$var2" ]] де необхідно використати лапки, якщо ви бажаєте виконати побайтове порівняння рядків, інакше, $var2 був би шаблоном для порівняння з $var1.

Дещо ви таки не можете зробити з [[ ... ]], а саме використати змінну як оператор. Наприклад, наступне повністю легально, але рідко використовуване:

if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …

Хоча [ і [[ мають багато спільного і мають багато спільних операторів як-от -f, -s, -n, -z існує багато помітних відмінностей. Ось порівняльний список:

Порівняння рядків:

[[ [ Приклад
> \>*)
[[ a > b ]] || echo "a не після b"
< \<*
[[ az < za ]] && echo "az після za"
= або == =
[[ a = a ]] && echo "a дорівнює a"
!= !=
[[ a != b ]] && echo "a не дорівнює b"

Порівняння цілих:

[[ [ Приклад
-gt -gt;
[[ 5 -gt 10 ]] || echo "5 не більше ніж 10"
-lt -lt
[[ 8 -lt 9 ]] && echo "8 менше ніж 9"
-ge -ge
[[ 3 -ge 3 ]] && echo "3 більше або рівне 3"
-le -le
[[ 3 -le 8 ]] && echo "3 менше або рівне ніж 8"
-eq -eq
[[ 5 -eq 05 ]] && echo "5 дорівнює 05"
-ne -ne
[[ 6 -ne 20 ]] && echo "6 не дорівнює 20"

Обчислення умовних виразів:

[[ [ Приклад
&& -a**
[[ -n $var && -f $var ]] && echo "$var є файлом"
|| -o**
[[ -b $var || -c $var ]] && echo "$var є пристроєм"

Групування виразів:

[[ [ Приклад
( … ) \( … \)**
[[ $var = img* && ($var = *.png || $var = *.jpg) ]] &&
echo "$var починається з img і закінчується .jpg або .png"

Зіставляння із взірцем:

[[ [ Приклад
= або == нема
[[ $name = a* ]] || echo "ім'я не починаєтся з 'a': $name"

Регулярні вирази:

[[ [ Приклад
=~ нема
[[ $(date) =~ ^Fri\ ...\ 13 ]] &&
echo "Нарешті п'ятниця 13те!"

(*) Розширення стандарту POSIX.

(**) Оператори -a і -o і групування ( ... ) означені POSIX, але не рекомендовані, натомість використовуйте декулька команд [.

Advertisements
Категорії:Uncategorized Позначки:
  1. Коментарів ще немає.
  1. No trackbacks yet.

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: