Выполните следующие действия:
$ ls -i /bin/test
54008404 /bin/test
$ ls -i /bin/[
54008404 /bin/test
Это 54008404
inode номер. Это настоящее имя файла./bin/test
просто указывает на inode
, а inode
содержит всю информацию о файле.
Следует отметить, что /bin/[
и /bin/test
такие же inode. Это означает, что они - одна и та же команда.
Таким образом:
if [ -f "$foo" ]
так же, как:
if test -f "$foo"
Команда if
выполняет команду, а затем выполнит пункт if
, если команда возвращает истину и не выполняет предложение, если команда false.
Например:
if grep -q "foo" $foo
then
echo "File $foo contains the regular expression /foo/"
fi
полностью действительным. grep -q
команда (во многих вариантах grep
означает поиск регулярного выражения, и если регулярное выражение в файле, возвращает код выхода 0
(что означает, что команда успешно и верно).
Примечания есть нет квадратных скобок.
команды test
(или [...]
) просто выполняет тест, как указано, и возвращается с кодом выхода из 0
(таким образом, команда имеет успех), если тест верно. это все, что он делает.
Вы также можете увидеть эту конструкцию:
[ "$foo" = "$bar" ] && echo "$foo is equal to $bar"
&&
означает, что следующая команда (и возвращает код выхода), если первая команда возвращает код выхода из нуля. В противном случае просто верните код выхода первой команды.
Таким образом:
if [ -e ./blah ] && [ ! -L ./blah ];
говорит пробег test -e ./blah
и если это верно (то есть, файл существует) выполнить test ! -L ./blah
и если это также верно, запустите пункт заявления if
.
Обратите внимание, что [ -e ./blah]
и [ ! -L ./blah ]
- это две отдельные команды. В &&
строки вместе две команды:
[ "$foo" = "$bar" ] && some_command;
Это говорит, запустить test "$foo" = "$bar"
и если это так, то выполните команду some_command
. Обратите внимание, что это эквивалентно:
if [ "$foo" = "$bar" ]
then
some_command
fi
Другая структура список является ||
. Это означает, что если первая команда завершится успешно, верните код выхода 0
и не запустите вторую команду.Таким образом:
[ "$foo" = "$bar" ] || some_command;
То же самое, как:
if [ "$foo" = "$bar" ]
then
:
else
some_command
fi
Давайте вернемся к вашему _original вопрос:
if [ -e ./blah ] && [ ! -L ./blah ];
then
exit 1
fi
То же самое, как:
if test -e ./blah && test ! -L ./blah
then
exit 1
fi
Который является то же, что и
test -e ./blah && test ! -L ./blah && exit 1
Это означает: Если test -e ./blah
истинно (./blah файл), а затем выполнить команду после оператора &&
списка. Это test -! -L ./blah
. Если этот тест также верен, снова запустите команду после оператора списка &&
.
Это также может быть переписано в виде:
test -e ./blah && test -L ./blah || exit 1
Это говорит о том, что если test -e ./blah
верно, выполните команду после оператора &&
списка. Если test -L ./blah
неверно, запустите команду после оператора ||
.