尝试使用管道命令进入if语句

时间:2015-12-18 02:24:15

标签: linux bash if-statement pipe sh

我有一个bash脚本,它将一堆命令放入文本文件中。然后它cat将文件导入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

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

3 个答案:

答案 0 :(得分:3)

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

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

sh /path/to/my/file.txt    

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

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

答案 1 :(得分:1)

我不清楚你是否要检查是否存在文件或目录..但是这里是如何实现的:

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

[ -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

答案 2 :(得分:0)

编写自己的mkdir函数。

假设您的文件在任何地方都不使用mkdir -p,这应该可以。

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

sh < file