[
- та же команда, что и test
. В некоторых системах * nix одна ссылка на другую. Например, если вы запустите:
strings /usr/bin/test
strings /usr/bin/[
, вы увидите тот же результат.
Большинство sh-shells / posix-shells включают встроенные команды [
и test
.
То же самое верно и для echo
. В большинстве оболочек есть как команда / bin / echo
, так и встроенная
. Вот почему иногда кажется, что, например, echo
не работает одинаково в разных системах.
test
или [
возвращают только код выхода 0
или 1
. Если проверка прошла успешно, код выхода равен 0.
# you can use [ command but last argument must be ]
# = inside joke for programmers
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write
# [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2 && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no
Вы также можете использовать [
с if
:
if [ -f file.txt ] ; then
echo "file exists"
else
echo "file does not exist"
fi
# is the same as
if test -f file.txt ; then
echo "file exists"
else
echo "file does not exist"
fi
Но вы можете использовать if
с каждая команда, , если
предназначена для проверки кода выхода.
Например:
cp x y 2>/dev/null && echo cp x y OK || echo cp x y not OK
Или, используя if
:
if cp x y 2>/dev/null ; then
echo cp x y OK
else
echo cp x y not OK
fi
Вы можете получить тот же результат, используя только команду test
для проверки сохраненного кода выхода. в переменную stat
:
cp x y 2>/dev/null
stat=$?
if test "$stat" = 0 ; then
echo cp x y OK
else
echo cp x y not OK
fi
Вы также можете использовать [[]]
и (())
для тестирования, но это не то же самое, что [
и test
, несмотря на почти одинаковый синтаксис:
Наконец, чтобы узнать, что такое команда, вы можете использовать:
type -a command
Для каталога вы можете использовать команду pwd
или переменную $PWD
.
Пример
$ DIRECTORY=.
$ TRUEDIR=$(cd -- "$DIRECTORY" && pwd)
$ echo $TRUEDIR
/home/steve
$
Вы можете добавить проверку абсолютного пути:
read DIRECTORY
[ "${DIRECTORY:0:1}" = "/" ] || DIRECTORY="$PWD/$DIRECTORY"
echo "$DIRECTORY"
Абсолютный путь начинается с /
, относительный — нет. Вы можете превратить относительный путь в абсолютный, добавив путь к текущему каталогу и косую черту перед относительным путем.
case $DIRECTORY in
/*) DIRECTORY="$PWD/$DIRECTORY";;
esac
Это переносимый код :он работает в простом sh, а не только в bash.
Результирующий путь может содержать символические ссылки. Это почти всегда правильно, но если вы хотите канонизировать символические ссылки, см. Преобразование относительного пути в абсолютный путь без символической ссылки
realpath (принятый ответ )устарел и недоступен в большинстве установок. Я бы использовал его замену:
readlink -f "$DIRECTORY"
Он также обрабатывает ~и./ и будет следовать символическим ссылкам.
Если вы хотите разрешить пользователю вводить несуществующий $DIRECTORY, используйте:
readlink -m "$DIRECTORY"