use*_*614 9 bash directory array
我想编写一个 Bash 脚本,它检查存储在数组中的所有目录是否存在。如果没有,脚本应该创建它。这是一个正确的方法吗?
array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
if [ ! -d “$array1” ]; then
mkdir $array1
else
break
fi
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 54
只需使用:
mkdir -p -- "${array1[@]}"
Run Code Online (Sandbox Code Playgroud)
如果需要,这还将创建中间目录组件,因此您的数组也可以缩短为仅包含叶目录:
array1=(
/apache/bin
/apache/conf
/apache/lib
/www/html
/www/cgi-bin
/www/ftp
)
Run Code Online (Sandbox Code Playgroud)
你也可以写:
array1=(
/apache/{bin,conf,lib}
/www/{html,cgi-bin,ftp}
)
Run Code Online (Sandbox Code Playgroud)
这种[[ -d ... ]] || mkdir ...
方法类型通常会引入TOCTOU 竞争条件,并且最好尽可能避免(尽管在这种特殊情况下不太可能成为问题)。
dar*_*urf 11
你必须在你的数组中循环,然后我会建议,在 bash
array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
for dir in "${array1[@]}"; do
[[ ! -d "$dir" ]] && mkdir "$dir"
done
Run Code Online (Sandbox Code Playgroud)