我想检查工作目录中是否存在多个目录,例如dir1
、dir2
和。dir3
我有以下内容
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
但我认为还有更优雅的方法。不要假设目录名称中存在某种模式。
目标是检查一些目录是否存在以及其他目录是否不存在。
我使用的是 Bash,但首选可移植代码。
答案1
我会循环:
result=True
for dir in \
"$PWD/dir1" \
"$PWD/dir2" \
"$PWD/dir3"
do
if ! [ -d "$dir" ]; then
result=False
break
fi
done
echo "$result"
这break
会导致环路短路,就像您的链条一样&&
答案2
如果您已经期望它们是目录并且只是检查它们是否全部存在,则可以使用ls
实用程序的退出代码来确定是否有一个或多个“发生错误”:
ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there
我将输出和 stderr 重定向到/dev/null
以使它消失,因为我们只关心 的退出代码ls
,而不关心它的输出。写入的任何内容都会/dev/null
消失 - 它不会写入您的终端。
答案3
循环可能更优雅:
arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
for d in "${arr[@]}"; do
if [ -d "$d"]; then
echo True
else
echo False
fi
done
这是巴什。更便携的是Sh。在那里你可以使用位置数组:
set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"
然后循环使用"$@"
.
答案4
根据问题,有两个可移植 shell 函数测试多个目录是否存在:
# Returns success if all given arguments exists and are directories.
ck_dir_exists () {
for dir do
[ -d "$dir" ] || return 1
done
}
# Returns success if none of the given arguments are existing directories.
ck_dir_notexists () {
for dir do
[ ! -d "$dir" ] || return 1
done
}
例子:
$ mkdir dir1 dir2
$ ck_dir_exists dir1 dir2; echo $?
0
$ ck_dir_exists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir3 dir4; echo $?
0