2015-04-01 58 views
2

我试图追加一个字符串到一个文件,如果该文件存在,如果它不在其中。否则,创建包含字符串的文件。检查文件的存在和grep在相同的if语句

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 

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

回答

2

你可以这样做:

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

感谢您的帮助! – fab 2015-04-02 13:47:16

+0

不客气,很高兴帮助 – anubhava 2015-04-02 13:47:37

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 
+0

感谢您的技巧! – fab 2015-04-02 13:46:33

0

这可以这样做太:

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

说明:

起初它检查现有的文件。如果它不存在,则第一个条件是true,因此将跳过miidle部分(grep),并执行echo部分,即使用STRING创建文件。 如果文件存在,则第一个条件为false,因此执行第二个条件,并且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 

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

如果你有第二STRING和模式执行它将会写入它:

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

STRING2将被添加到该文件。

+0

如果文件不存在,则不会创建该文件。 – 2015-04-01 19:16:49

+0

现在它会...... – Jahid 2015-04-01 19:20:50

+0

现在,如果文件存在但没有该文本,它不会这样做......:-) – 2015-04-01 21:34:49

相关问题