Я думаю, что это говорит само за себя, поэтому я действительно не знаю, какая часть звучит для вас неоднозначно ... Давайте посмотрим на примере:
$ mkdir /tmp/realdir
$ mkdir /tmp/subdir
$ ln -s /tmp/realdir /tmp/subdir/link
$ cd /tmp
$ readlink -f ./subdir/link/nonexistentdir/
/tmp/realdir/nonexistentdir
$ readlink -f ./subdir/link/nonexistentfile.txt
/tmp/realdir/nonexistentfile.txt
Каким бы ни был варианты: readlink
будет:
- преобразовать относительный путь в абсолютный путь
- преобразовать имя символической ссылки в реальный путь
И, как вы можете видеть выше, с -f
, readlink
не заботится о том, существует ли последняя часть этого пути (здесь nonexistentfile.txt
) или нет.
Если другая часть этого пути не существует, readlink
ничего не выведет и будет иметь код возврата, отличный от 0 (что означает, что произошла ошибка). См .:
$ readlink -f /tmp/fakedir/foo.txt
$ echo $?
1
Если вы попробуете то же самое с -e
:
$ readlink -e ./subdir/link
/tmp/realdir
$ readlink -e ./subdir/link/nonexistentfile.txt
$ echo $?
1
С -e
, в случае, если какой-либо компонент пути не t существует, readlink
ничего не выведет и будет иметь код возврата, отличный от 0.
-m
параметр является противоположностью -e
. Не будет проводиться проверка, чтобы проверить, существуют ли компоненты пути:
$ readlink -m ./subdir/link/fakedir/fakefile
/tmp/realdir/fakedir/fakefile
$ ln -s /nonexistent /tmp/subdir/brokenlink
$ readlink -m ./subdir/brokenlink/foobar
/nonexistent/foobar
Для нескольких И используйте
if [ condition ] && [ condition ] && [ condition ]
then
code
fi
Это работает и с ИЛИ (||
), например
if [ "$1" = "normal" ] || [ "$1" = "beta" ] || [ "$1" = "stable" ]
then
printf 'Site: %s\n' "$1"
else
echo 'Error, type parameter mode version: normal, beta, stable' >&2
exit 1
fi
В вашем случае вы также можете использовать:
case "$1" in
normal|beta|stable)
printf 'Site: %s\n' "$1" ;;
*)
echo 'error' >&2
exit 1
esac