我尝试将字符串附加到文件中(如果该文件存在,并且该文件尚未存在)。否则,创建包含字符串的文件。
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
任何人都可以帮我找到最甜蜜的语法吗?
答案 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将附加到文件中。