检查文件是否存在,并在同一if语句中使用grep

时间:2015-04-01 19:06:33

标签: 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

任何人都可以帮我找到最甜蜜的语法吗?

3 个答案:

答案 0 :(得分:4)

这个

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

答案 1 :(得分:2)

你可以这样做:

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

答案 2 :(得分:0)

这也可以这样做:

[ ! -f PATH_TO_FILE ] || ! grep -q PATTERN PATH_TO_FILE && echo STRING >> PATH_TO_FILE
  

说明:

首先检查现有文件。如果它不存在,则第一个条件为true,因此跳过miidle部分(grep)并执行echo部分,即使用STRING创建文件。 如果文件存在,则第一个条件为假,因此执行第二个条件,echo部分仅在grep部分为true时执行。因此,如果PATTERN匹配,则echo部分将被执行,即如果PATTERN匹配,则STRING将不会被写入文件中。

  

示例:

[ ! -f PATH_TO_FILE ] || ! grep -q STRING PATH_TO_FILE && echo STRING >> PATH_TO_FILE
[ ! -f PATH_TO_FILE ] || ! grep -q STRING PATH_TO_FILE && echo STRING >> PATH_TO_FILE

这将创建一个名为PATH_TO_FILE的文件并在其中写入STRING。即使执行两次相同的代码,它也不会写两次STRING。因为第二次在PATH_TO_FILE中找到了STRING。

如果你用第二个STRING和PATTERN执行它,它会写入它:

[ ! -f PATH_TO_FILE ] || ! grep -q STRING2 PATH_TO_FILE && echo STRING2 >> PATH_TO_FILE

STRING2将附加到文件中。