środa,
Bash: Konstrukcja [[ ]]
W Bashu [[ ]]
to ulepszona wersja konstrukcji warunkowej w porównaniu do tradycyjnych [ ]
. Została wprowadzona, by zapewnić bardziej intuicyjną składnię i rozszerzoną funkcjonalność.
Cechy konstrukcji [[ ]]
Rozszerzone dopasowanie wzorców
Pozwala na użycie operatorów takich jak ==
i !=
z dodatkowymi możliwościami dopasowania wzorców, np. używając *
i ?
jako symboli wieloznacznych.
Bezpieczniejsza składnia
Zapobiega niektórym typowym błędom składniowym jak np. rozdzielenie ciągu znaków na słowa na skutek rozwijania zmiennej, czy błędne interpretowanie ciągów znaków jako operatorów.
Operator dopasowania wyrażeń regularnych =~
Umożliwia używanie wyrażeń regularnych w warunkach.
Operatory logiczne && i || wewnątrz warunku
Umożliwia używanie operatorów logicznych bez konieczności ich osadzania w podwójnych nawiasach.
Przykłady
Dopasowanie wzorców
if [[ $filename == *.txt ]]; then
echo "Plik ma rozszerzenie txt."
fi
Użycie wyrażeń regularnych
if [[ $string =~ ^[a-zA-Z]+$ ]]; then
echo "Łańcuch zawiera tylko litery."
fi
Połączenie warunków logicznych
if [[ $num -gt 10 && $num -lt 20 ]]; then
echo "Liczba jest większa niż 10 i mniejsza niż 20."
fi
Testowanie łańcuchów znaków
if [[ -z $string ]]; then
echo "String jest pusty."
fi
Uwagi
[[ ]]
jest bardziej elastyczny i bezpieczny niż[ ]
, ale jest też mniej przenośny, ponieważ nie jest obsługiwany przez wszystkie powłoki. Na przykład, nie będzie działać w starszych wersjach sh lub w niektórych innych shellach, takich jakdash
.- W
[[ ]]
, rozdzielenie słów (word splitting) i rozwijanie znaków wieloznacznych (filename expansion) nie zachodzi, co czyni je bezpieczniejszymi w użyciu, szczególnie gdy manipulujesz zmiennymi, które mogą zawierać spacje, znaki wieloznaczne lub inne specjalne znaki. - Warto pamiętać, że
[[ ]]
jest konstrukcją specyficzną dla Bash i nie należy jej mylić z[ ]
, która jest w większym stopniu przenośna i zgodna z POSIX.