
Мне было интересно, кто-нибудь может мне помочь:
if [ -z $1 ]; then
user=$(whoami)
else
if [ ! -d "/home/$1" ]; then
echo "Requested $1 user home directory doesn't exist."
exit 1
fi
user=$1
fi
Я изучал некоторые команды bash, когда увидел две команды: -z
и -d
. Я знаю, что они делают (сначала проверяют на пустую переменную, а затем проверяют на существование каталога). Мой вопрос в том, как мне найти описания этих команд (например, man page -d/-z). Их можно использовать только с оператором if-else?
решение1
И -d
— -z
это не команды, а опции для утилит test
и [
. Эти утилиты встроены bash
и документированы в bash
руководстве. Эти утилиты и эти флаги также стандартизированы POSIX, поэтому они доступны в любой оболочке POSIX, а не только bash
.
Если вы находитесь в интерактивном bash
сеансе, вы можете получить документацию по встроенным вариантам этих утилит, введя help test
( help [
тоже работает, но ее текст просто ссылается на документацию по test
).
man test
и man [
должно работать тоже. Эти руководства описываютвнешнийутилиты, вероятно , /bin/test
и /bin/[
, а не те, которые вы используете по умолчанию в bash
.
Так, например,
! test -z "$dir" && test -d "$dir" && printf '%s is a directory' "$dir"
точно эквивалентно
! [ -z "$dir" ] && [ -d "$dir" ] && printf '%s is a directory' "$dir"
или, если хотите,
if ! test -z "$dir" && test -d "$dir"; then
printf '%s is a directory' "$dir"
fi
и
if ! [ -z "$dir" ] && [ -d "$dir" ]; then
printf '%s is a directory' "$dir"
fi
( ! [ -z "$dir" ]
вероятно, более распространено будет писать [ ! -z "$dir" ]
или [ -n "$dir" ]
, и я использовал -z
тест выше только потому, что он был упомянут в вопросе, -d
тест на пустой строке в любом случае не будет пройден).
Смотрите также: