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

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

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

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

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

6 ответов

Решение

Посмотрите на страницу руководства 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 `['.

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

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

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

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

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

Они не являются переключателями для if заявление, но для test команда ([ это синоним test встроено в него). Увидеть help test в Баш для полного списка.

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

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

Руководство LDP Bash для начинающих: 7.1.1.1 Выражения, используемые с if

Другие вопросы по тегам