如果目标文件不存在,如何退出 shell 脚本?

新手上路,请多包涵

鉴于下面的脚本,如果文件不存在,我想避免执行管道。

如果找不到文本文件,如何立即退出脚本?

 ls */*.txt | grep ab1 | awk '{print $1, $1}' | sed "s/\"/\"\"/g" | xargs -L1 mv

原文由 amine 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您可以通过以下方式检查文件是否存在:

 if [[ -f x.txt ]] ; then
    echo file exists.
fi

如果 没有退出, 这样的事情就足够了:

 if [[ ! -f x.txt ]] ; then
    echo 'File "x.txt" is not there, aborting.'
    exit
fi

-f <file> 只是您可以使用的众多条件表达式 _之一_。如果您查看 --- 下的 CONDITIONAL EXPRESSIONS bash 手册页,您会看到一大堆。


如果(如问题更新中所述)您希望检查通配符是否导致文件,您可以简单地展开它,丢弃错误。如果没有,你最终会得到一个空字符串,可以用 -z 检测到:

 if [[ -z "$(ls -1 */*.txt 2>/dev/null | grep ab1)" ]] ; then
    echo 'There are no "*/*.txt" files.'
    exit
fi

请注意,我使用 -1 强制每行一个文件,即使 Linux ls 如果输出设备不是终端(来自内存)默认情况下会这样做。那是为了以防万一您在这种情况下 强制每行一个的机器上尝试这个。


但是请记住,如果您的文件名中有空格,则使用 ls 然后 awk 提取第 1 列效果不会很好。例如,文件 abc ab1.txt 将导致仅提取 abc 位。

Using find with -print0 , combined with xargs with -0 is the usual way to properly process files which may have “special” characters in他们。您可以为 find 提供许多其他选项,以确保仅处理所需的文件,例如 -maxdepth 以限制您进入目录树的位置,以及 -name 正确过滤文件名。

但是,如果您 知道 您永远不会拥有这些类型的文件,那么使用 ls 解决方案可能没问题,只要确保您对它的缺点感到满意。

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 test

一种快速而简短的测试存在性的方法:

 test -e $FILENAME || exit

您可以通过以下方式链接它:

 test -e $FILENAME && something | something-else

在这种情况下 somethingsomething-else 仅在文件存在时才会执行。

例如:

 ➤ test -e ~/.bashrc && echo True || echo False
True
➤ test -e ./exists-not && echo True || echo False
False

另外: 请注意 [test 的别名。 [[ 的语义由 bash 定义,可以 在 bash 手册页上 找到

然而…

…您最好使用 find 来获取您的文件:

 find ./ -maxdepth 2 -name "*ab1*.txt" -exec do-something-to-filename '{}' \;

由于 ls 的输出无法可靠解析。如果文件名存在,这也只会执行命令 do-something-to-filename ,这是我认为你正在尝试做的。

{} 将被每次调用 do-something-to-filename 的文件名替换。

原文由 brice 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题