更新:该OP自澄清,使用mkdir
只是一个例子,而他需要一个通用机制,有条件地从一个文本文件,其中包含shell命令,根据命令是否指的是现有目录或不执行行:
while read -r cmd dir; do [[ -d $dir ]] || eval "$cmd $path"; done < /path/to/my/file.txt
- 的
while
循环读取包含文本文件shell命令一行一行。
read -r cmd dir
将每一行解析为第一个标记 - 假定为命令(示例输入中的mkdir
) - 其余的,假定为目录路径。
[[ -d $dir ]]
测试目录路径的存在,并且只有||
如果测试失败,即执行其RHS,如果该目录不存在。
eval "$cmd $path"
然后执行该行;注意在这里使用eval
的安全性不如管道到sh
安全 - 在这两种情况下,您都必须信任代表命令的字符串。 (从当前的Bash shell使用eval
意味着Bash将执行该命令,而不是sh
,但我认为这不是问题。)
原来的答复,基于该mkdir
实际使用的假设:
你的情况,最简单的方法是将-p
选项添加到您的mkdir
调用,这会悄悄地忽略尝试创建一个已经存在的目录:
mkdir -p /path/to/a/directory
mkdir -p /path/to/another/directory
mkdir -p /path/to/yet/another/directory
换句话说:mkdir -p
确保存在目标目录,不管该目录是否存在。已经存在或必须创建。 (mkdir -p
仍然可能失败,例如当目标路径是文件,而不是一个目录,或者如果你没有足够的权限来创建目录。)
然后,您可以简单地将文件传递给sh
(无需cat
和管道,这是低效率):
sh /path/to/my/file.txt
如果你不控制输入文件的创建,您可以使用sed
插入-p
选项:
sed 's/^mkdir /&-p /' /path/to/my/file.txt | sh
无法将命令输入到“if”中。你的项目听起来过于雄心勃勃。获得更简单的版本,并确定它是否真的值得重建shell脚本范例;-)。对于dir存在的传统测试是'if! [[-d“$ dir”]];那么mkdir -p“$ dir”; fi'。祝你好运。 – shellter
问题不是你不能通过管道传递一个'if'语句(你可以),这就是你真的需要一个循环。 – chepner
@chepner:你*可以*管道到'if'语句!?酷,你可以在这里作为评论给出一个1/2内胆的例子吗?谢谢 – shellter