Bash 检查目录是否存在。如果不是用数组创建

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 竞争条件,并且最好尽可能避免(尽管在这种特殊情况下不太可能成为问题)。

  • 或者只使用没有数组的 [brace expand](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html):`mkdir -p /apache/{bin,conf,lib } /www/{html,cgi-bin,ftp}` (4认同)

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)

  • 您可能希望使用 `mkdir -p` 一次创建所有子目录。 (7认同)
  • @user3573614 为了进一步理解:`bash` 数组默认从索引 0 开始。如果在没有指定元素(或元素范围)的情况下调用数组,它将默认为索引为 0 的元素,即 `${array}` 与 `${array[0]}` 相同 (3认同)