Список переключателей «если» где-нибудь?

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

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

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

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


person Danijel-James W    schedule 29.09.2013    source источник
comment
gnu.org/software/bash/manual/bashref.html   -  person Mike Makuch    schedule 29.09.2013
comment
[ — это краткое название команды test. Попробуйте man test.   -  person Barmar    schedule 29.09.2013
comment
@ Бармар, ты имеешь в виду help test. man test — это документация для /bin/test, и она поддерживает параметры, отличные от встроенной test.   -  person SheetJS    schedule 29.09.2013
comment
-z является опцией [ или test; он не имеет (напрямую) ничего общего с if.   -  person Keith Thompson    schedule 30.09.2013


Ответы (5)


Посмотрите справочную страницу 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 `['.
person SheetJS    schedule 29.09.2013
comment
Электронное руководство: Условные выражения Bash - person Nick Tsai; 04.07.2017

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

Прочтите раздел 6.4 Условные выражения Bash документа < href="http://www.gnu.org/software/bash/manual/bashref.html" rel="noreferrer">Справочное руководство по Bash, содержащее список всех этих переключателей и их использование.

person Johnsyweb    schedule 29.09.2013
comment
Одна страница: 6.4 Условные выражения Bash - person Nick Tsai; 04.07.2017

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

person Dolda2000    schedule 29.09.2013

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

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

Вы назвали их if Switches, но это не совсем правильно. Это тесты, и они не имеют ничего общего с командой 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/[. Однако они по-прежнему связаны друг с другом.

person David W.    schedule 30.09.2013
comment
[ не является псевдонимом test. синоним — это слово, используемое на странице руководства. Псевдоним имеет особое значение (на странице руководства bash см. раздел ALIASES) - person SheetJS; 30.09.2013
comment
Хорошо. Я изменю это. Я просто искал слово, которое объяснило бы, как они связаны. - person David W.; 30.09.2013

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

person icktoofay    schedule 29.09.2013
comment
-1: test является одновременно командой /bin/test и встроенной функцией bash. man test дает вам документ для команды, но [ является синонимом встроенной команды. В качестве примера расходящегося поведения в OSX встроенная функция bash поддерживает тест -N, но /bin/test нет. - person SheetJS; 29.09.2013