[...]
означает, что программа /usr/bin/test
выполняется с ...
в качестве аргументов и проверяется ее возвращаемое значение (0
означает true
, а x != 0
означает false
(да, 0
действительно означает true
здесь, потому что 0
- это код выхода OK
в UNIX)). Так
if [ -e $1 ]; then
echo "ok"
fi
правильно. Это так же, как
if test -e $1; then
echo "ok"
fi
Единственная проблема в том, что $1
может содержать пробелы. Если так, то /usr/bin/test
запутывается, так как получает 3 или более аргументов. Первый (-e
) - унарный оператор (требуется один аргумент). Так как вы дали ему 2 или более (один /usr/bin/test
аргумент - сам -e
), он жалуется так:
...: binary operator expected
Итак, просто используйте
if [ -e "$1" ];then
echo "ok"
fi
Это будет работать, даже если $1
содержит пробелы. Другая возможность заключается в использовании
if [[ -e $1 ]]; then
echo "ok"
fi
Это будет делать то же самое, но оно оценивается самим bash, и /usr/bin/test
программа не получает разветвления.
Соединения, как обычно, но -a
означает and
, а -o
означает or
. Так
if [ -e /etc/fstab -a -e "$1" ]; then
echo "ok"
fi
будет отображаться нормально, если /etc/fstab
и файл, указанный в качестве первого аргумента командной строки, существует.