gpt4 book ai didi

linux - 尝试将管道命令放入 if 语句

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:25 25 4
gpt4 key购买 nike

我有一个 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

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

最佳答案

更新: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 ]] 测试目录路径是否存在,|| 仅在测试失败,即如果目录存在。
  • 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

关于linux - 尝试将管道命令放入 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com