Список переключателей "если" в любом месте?

Есть ли список всех переключателей if для использования в bash скриптах? Иногда я вижу, что кто-то использует его, и мне интересно, какой именно переключатель они используют.

Пример: -z в этом. Я знаю, как использовать его, но я не знаю, откуда он был получен.

if [ -z "$BASH_VERSION" ]; then
    echo -e "Error: this script requires the BASH shell!"
    exit 1
fi

Любые ссылки, руководства, сообщения, ответы будут оценены.

Ответ 1

Посмотрите на man-страницу bash (man bash). Параметры указаны в разделе CONDITIONAL EXPRESSIONS:

CONDITIONAL EXPRESSIONS
       Conditional expressions are used by the [[  compound  command  and  the
       test  and [ builtin commands to test file attributes and perform string
       and arithmetic comparisons.  Expressions are formed from the  following
       unary  or  binary  primaries.   If any file argument to one of the pri-
       maries is of the form /dev/fd/n, then file descriptor n is checked.  If
       the  file  argument  to  one  of  the  primaries  is one of /dev/stdin,
       /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2,  respectively,
       is checked.

       Unless otherwise specified, primaries that operate on files follow sym-
       bolic links and operate on the target of the link, rather than the link
       itself.

       -a file
              True if file exists.
       ... more options ...

Это также объясняется в справке:

$ help [ [: [ arg... ]
    This is a synonym for the "test" builtin, but the last
    argument must be a literal `]', to match the opening `['.

Ответ 2

Да. Они называются условные выражения, и они используются [[ составная команда и test и [ встроенные команды ([ является просто синонимом для test).

Читать раздел 6.4 Bash Условные выражения Bash Справочное руководство, в котором содержится список всех этих переключателей и их использование.

Ответ 3

Они не являются переключателями для оператора if, но для команды test ([ является синонимом встроенного test). См. help test в bash для полного списка.

Ответ 4

На самом деле это не if, который предоставляет те - это [, более известный под именем test. help test должен предоставить вам список всех возможных вариантов. Вы также можете посмотреть стандарт, если вам это нравится.

Ответ 5

Единые квадратные скобки ([ ... ]) являются синонимом команды test. Если вы посмотрите на manpage для теста, вы увидите почти все (BASH может иметь несколько дополнительных не упомянутых здесь) различных if как вы их называли. Все в одном удобном месте.

Если вы используете двойные квадратные скобки ([[ ... ]]), вы используете расширенный набор тестов BASH. В основном это связано с регулярным соответствием выражению и сопоставлением glob (и расширенным сочетанием glob, если у вас есть этот набор тоже). Для этого вам нужно будет прочитать эту BASH manpage.

Вы вызывали их, если переключатели, но это не совсем правильно. Это тесты и не имеют ничего общего с командой if.

Команда if просто выполняет команду, которую вы ей даете, а затем, если эта команда вернет код выхода 0, запустит часть if оператора if. В противном случае он будет запускать часть else (если она присутствует).

Посмотрите на это:

$ rm foo.test.txt   # Hope this wasn't an important file
$ if ls foo.test.txt
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
ls: foo.test.txt: No such file or directory
I can't find it anywhere..

Оператор if запускает команду ls foo.test.txt, а команда ls возвращает ненулевое значение, потому что файл не существует. Это приводит к тому, что оператор if выполняет предложение else.

Повторите попытку...

$ touch foo.test.txt   # Now this file exists.
$ if ls foo.test.txt   # Same "if/else" statement as above
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
foo.test.txt
This file exists

Здесь команда ls вернула статус завершения 0 (поскольку файл существует и файл существует и может быть установлен командой ls.

Обычно вы не должны использовать команду ls для проверки файла. Я просто использовал его здесь, чтобы показать, что оператор if выполняет команду, а затем выполняет предложение if или else в зависимости от статуса выхода этой команды. Если вы хотите проверить, существует ли файл, вы должны использовать команду test -e вместо команды ls:

if test -e foo.test.txt  # Same as above, but using "test" instead of "ls"
then
    echo "This file exists"
else
    echo "I can't find it anywhere.."
fi

Если файл существует, test -e вернет статус выхода 0. В противном случае он вернет ненулевой статус выхода.

Если вы это сделаете:

$ ls -i /bin/test /bin/[
10958 /bin/[    10958 /bin/test

Это 10958 является inode. Файлы с тем же inode - это два разных имени для одного и того же файла. Таким образом, команда [ и test является мягкой связью 1. Это означает, что вы можете использовать [ вместо test:

if [ -e foo.test.txt ]
then
    echo "This file exists"
else
    echo "I can't find it anywhere.."
fi

Выглядит знакомо?


1. В BASH встроены test и [, поэтому при выполнении этих команд в BASH он не работает /bin/test или /bin/[. Однако они все еще связаны друг с другом.