为什么这个 bash 脚本会创建一个新目录?

Why does this bash script create a new directory?

我刚开始使用 bash 脚本(我只是在过去的几个小时里作为一个更大项目的一部分学习它),我正在尝试理解 [=] 中的这段代码20=] 脚本:

for newDir in `cat tempfile.list` ; do
        dir=/Tree/Apples/$newDir
        [ -d $dir ] || mkdir -p $dir/{log,err}
done

[-d $dir] 有什么作用?这段代码是否会在 Apples 目录中创建一个名为 dirName 的新目录?如果是这样,它为什么要这样做?我没有看到 mkdir dirName 的声明。有人可以大体解释一下语句 [ -d $dir ] || mkdir -p $dir/{log,err} 的作用吗?非常感谢您的帮助!

command1 || command2

是简写法

if ! command1
then
    command2
fi

||是逻辑测试带短路,类似于大多数编程语言;如果左操作数成功,则不执行右操作数。

[ -d $dir ] 测试名为 $dir 的目录是否已经存在。所以如果这个测试失败,它会执行 mkdir -p $dir/{log,err}.

mkdir 创建目录,当它被赋予 -p 选项时,它将创建创建目标目录所需的任何中间目录。

逗号分隔列表两边的大括号用于自动重复命令的一部分,因此 $dir/{log,err}$dir/log $dir/err 的快捷方式。所以完整的 mkdir 命令扩展为

mkdir -p $dir/log $dir/err

因此,此脚本所做的是创建 tempfile.list 中列出的所有尚不存在的目录,并在其创建的目录中创建 logerr 子目录。