Одиночные квадратные скобки ([ ... ]
) являются синонимом команды 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
[
— это краткое название командыtest
. Попробуйтеman test
. - person Barmar   schedule 29.09.2013help test
.man test
— это документация для/bin/test
, и она поддерживает параметры, отличные от встроеннойtest
. - person SheetJS   schedule 29.09.2013-z
является опцией[
илиtest
; он не имеет (напрямую) ничего общего сif
. - person Keith Thompson   schedule 30.09.2013