Как по-разному используются различные типы связей, используемые для условных выражений в сценариях оболочки? - PullRequest
0 голосов
/ 18 февраля 2012

Мне известно как минимум 4 способа проверки условий в сценариях оболочки.

  • [ <cond> ];
  • [[ <cond> ]];
  • (( <cond> ));
  • test <cond>;

Я хотел бы получить исчерпывающий обзор о различиях между этими методами, а также о том, когда и какие методы использовать.

IЯ пытался найти резюме в Интернете, но ничего хорошего не нашел.Было бы здорово иметь приличный список где-нибудь (переполнение стека для спасения!).

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Давайте опишем их здесь.

Прежде всего, есть в основном 3 различных метода испытаний

  • [ EXPRESSION ], что в точности совпадает с test EXPRESSION
  • [[ EXPRESSION ]]
  • (( EXPRESSION )), что в точности совпадает с let "EXPRESSION"

Давайте углубимся в детали:

test

Это дедушка тестовых команд.Даже если ваша оболочка не поддерживает ее, практически все команды Unix по-прежнему имеют команду /usr/bin/test.Таким образом, вызов test запустит встроенный или двоичный файл как запасной вариант.Введите $ type test, чтобы увидеть, какая версия используется.Аналогично для [.

В большинстве основных случаев этого должно быть достаточно для проведения тестирования.

if [ "$a" = test -o "$a" = Test ];
if test "$a" = test -o "$a" = Test;

Если вам нужно больше энергии, тогда есть ...

[[]]

Это специальное предложение для bash.Не каждая оболочка должна поддерживать это, и нет двоичного отступления.Он предоставляет более мощный механизм сравнения, в частности сопоставление с шаблоном и сопоставление с регулярным выражением.

if [[ "$a" == [Tt]es? ]]; # pattern
if [[ "$a" =~ ^[Tt]es.$ ]]; # RE

(())

Это специальная программа bash, используемая для арифметических выражений,и верно, если результат вычисления не равен нулю.Не каждая оболочка должна поддерживать это, и здесь нет двоичного отступления.

if (( x * (1 + x++) ));
if let "x * (1 + x++)";

Обратите внимание, что вы можете опустить знак $ при ссылке на переменные в (( ... )) или let.

1 голос
/ 18 февраля 2012

На сайте, связанном здесь , если вы прокрутите вниз до специального символа [, вы увидите отдельную запись для [[ со ссылкой на обсуждение различий между ними. Также есть запись для (( ниже. Надеюсь, это поможет!

...