Список "если" переключается где-нибудь?
Есть ли список всех 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