bash - 在同一个 if 语句中检查文件是否存在和 grep

标签 bash shell

我正在尝试将一个字符串追加到一个文件中,如果该文件存在并且它不在其中。否则,创建包含该字符串的文件。

if [ -f PATH_TO_FILE ]; then
  if ! grep -q PATTERN PATH_TO_FILE; then
    echo STRING >> PATH_TO_FILE
  fi
else
  echo STRING >> PATH_TO_FILE
fi

我想在 if 语句中使用 AND/OR 条件对其进行优化,但在语法上遇到困难。

我尝试执行以下操作,但如果文件不存在,它就不起作用。

grep -q PATTERN PATH_TO_FILE || echo STRING >> PATH_TO_FILE

谁能帮我找到最甜美的语法?

最佳答案

这个

grep -q PATTERN PATH_TO_FILE || echo STRING >> PATH_TO_FILE

执行与 if ..else 语句等效的功能。

因此,如果您不想在文件不存在时看到错误消息,您可以将 stderr 重定向到 /dev/null

grep -q PATTERN PATH_TO_FILE 2>/dev/null || echo STRING >> PATH_TO_FILE

关于bash - 在同一个 if 语句中检查文件是否存在和 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29398815/

相关文章:

bash - 当 shell 脚本被杀死时终止正在运行的命令

linux - 将 sh 脚本输出重定向到两个日志,一个带 -x,一个不带

linux - 如果不是当前文件,则重命名文件

shell - 重定向不起作用

bash - 从 Bash 中的行中删除中间的 n 个字符

linux - 在 BASH 中使用特殊字符从文件名中批量删除子字符串

Bash 脚本 - 如何仅调整最近未修改的图像大小?

node.js - 在 npm-scripts 中传递环境变量

shell - "&!"(与号和感叹号)在linux shell中是什么意思

linux - 如何在awk中将文件的列名作为变量传递