繁体   English   中英

尝试将命令传递给if语句

[英]Trying with piping commands into an if statement

我有一个bash脚本,可将一堆命令放入目录以生成文本文件。 然后cat s文件到sh运行命令。 我想做的是仅在目录不存在时才运行命令。

这是我所拥有的:

具有以下内容的文本文件:

mkdir /path/to/a/directory
mkdir /path/to/another/directory
mkdir /path/to/yet/another/directory

在我的脚本中,我有这样一行

cat /path/to/my/file.txt | sh

但是有办法做这样的事情吗?

cat /path/to/my/file.txt | if path already exists then go to the next, if not | sh

换句话说,如果路径已经存在,我想跳过创建目录的尝试。

更新 :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 -pmkdir -p确保目标目录存在,无论该目录是否存在。 已经存在或必须创建。 mkdir -p仍然可能失败,例如,当目标路径是文件而不是目录时,或者您没有足够的权限创建目录时。)

然后,您可以简单地将文件传递给sh (不需要cat和pipe,效率较低):

sh /path/to/my/file.txt    

如果您不控制输入文件的创建,则可以使用sed插入-p选项:

sed 's/^mkdir /&-p /' /path/to/my/file.txt | sh

我不清楚您是否要检查文件或目录的存在..但是这是如何做到的:

如果文件存在,请运行命令:

[ -f /path/to/my/file.txt ] && cat /path/to/my/file.txt | sh

或检查目录:

[ -d /path/to/my/directory ] && cat /path/to/my/file.txt | sh

编写自己的mkdir函数。

假设您的文件在任何可行的地方都没有使用mkdir -p

mkdir() {
    for dir; do
        [ -d "$dir" ] || mkdir "$dir"
    done
}
export -f mkdir

sh < file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM