【问题标题】:Why does this bash script create a new directory?为什么这个 bash 脚本会创建一个新目录?
【发布时间】:2020-05-22 19:34:42
【问题描述】:

我是使用 bash 脚本的新手(我只是在过去几个小时内作为一个更大项目的一部分才学习它),我正在尝试理解 bash 脚本中的这段代码:

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}的声明吗?非常感谢您的帮助!

【问题讨论】:

  • 见:help test | grep -- -d
  • @Cyrus 是否有与您希望我查看的内容相关的问题的链接?
  • 这可能会有所帮助:explainshell.com/…

标签: bash boolean-logic mkdir


【解决方案1】:
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 子目录。

【讨论】: