Kiedy wymagane są nawiasy kwadratowe w instrukcji Bash if?

Zwykle używam nawiasów kwadratowych w wyrażeniu if:

if [ "$name" = 'Bob' ]; then ...

Ale gdy sprawdzam czygrep się udało nie używam nawiasów kwadratowych:

if grep -q "$text" $file ; then ...

Kiedy konieczne są nawiasy kwadratowe w deklaracji if?

Author: codeforester, 2012-01-20

3 answers

Nawiasy kwadratowe są synonimem polecenia test. Polecenie if sprawdza status zakończenia polecenia w celu podjęcia decyzji, którą gałąź ma przejąć. grep -q "$text" jest poleceniem, ale "$name" = 'Bob' nie jest-to tylko wyrażenie. test jest poleceniem, które pobiera wyrażenie i ocenia je:

if test "$name" = 'Bob'; then ...

Ponieważ nawiasy kwadratowe są synonimem polecenia test, możesz go przepisać jako oryginalną instrukcję:

if [ "$name" = 'Bob' ]; then ...
 96
Author: chepner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-19 23:06:17

[ jest w rzeczywistości poleceniem, równoważnym (prawie, patrz poniżej) do polecenia test. To nie jest część składni powłoki. (Zarówno [, jak i test, w zależności od powłoki, są często wbudowanymi poleceniami, ale to nie wpływa na ich zachowanie, może poza wydajnością.)

Instrukcja if wykonuje polecenie i wykonuje then część, jeśli polecenie powiedzie się, lub else część (jeśli istnieje), jeśli zawiedzie. (Polecenie zakończy się sukcesem, jeśli zakończy się ze statusem ($?) równym 0, nie powiedzie się, jeśli wychodzi z niezerowym statusem.)

W

if [ "$name" = 'Bob' ]; then ...

Komenda

[ "$name" = 'Bob' ]

(możesz wykonać tę samą komendę bezpośrednio, bez if.)

W

if grep -q "$text" $file ; then ...

Komenda

grep -q "$text" $file

man [ lub man test aby uzyskać więcej informacji.

Przypis: cóż, [ komenda jest prawie równoważna komendzie test. Różnica polega na tym, że [ wymaga ] jako ostatniego argumentu, a test nie -- i w rzeczywistości nie pozwala to. (To nie musi być zaimplementowane w ten sposób, ale [ bez dopasowania ] spowodowałoby, że wiele osób bardzo się zdenerwuje.)

 26
Author: Keith Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-28 20:20:12

Najlepszym sposobem na myślenie o składni [ ... ] jest uznanie [ za program - którym jest!

Zobacz:

~ $ ls /usr/bin/\[ 
/usr/bin/[

Z drugiej strony, prawdopodobnie nie używasz tej wersji, ponieważ bash dostarcza również [ jako wbudowaną powłokę.

W każdym razie, aby odpowiedzieć na twoje pytanie: co robi if, Uruchom polecenie, które podasz i zobaczysz, że zwracana wartość to 0 lub nie. Używasz [ do wykonywania innych, ciekawszych porównań, takich jak porównania łańcuchów. Zobacz też man [ i man bash.

 8
Author: cha0site,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-19 22:07:37