我有一个文件,我想向其中附加一些内容(包括下面代码中可见的第一个、第二个和第三个空格):
### 我是文本 1 ### 我是文本 2
(我附加的实际文本比这 5 行长得多)。
为了简单地将内容附加到文件中,我这样做:
cat <<-"EOF" >> myPath/myFile
content...
EOF
但是,我如何确保仅当文件中尚不存在该内容时,heredocument 才会附加该内容,否则操作将被中止?
如果文件中仅存在部分块内容,则整个操作也应中止。
答案1
如果仅在不存在此处文档的情况下添加此处文档,则可以使用grep
:
cat <<-"EOF1" > myPath/myFile.append
content...
EOF1
if ! grep -F -q -f myPath/myFile{.append,}; then
cat myPath/myFile.append >> myPath/myFile
fi
要理解这一点,请考虑以下内容。
grep -F -q -f myPath/myFile{.append,}
由 shell 扩展为grep -F -q -f myPath/myFile.append myPath/myFile
.该
grep
命令搜索myPath/myFile
(如有必要,应添加文本的文件)-F
包含在myPath/myFile.append
(包含要添加的文本的文件)中的任何固定字符串 ( ),每行读取一个模式 (-f
),并仅通过以下方式指示是否找到任何固定字符串( ):它是退出代码,没有输出 (-q
)。然后将结果取反
!
,以便仅在找不到任何内容时才运行该if
块的部分。then
grep
答案2
请不要点赞这个答案,但斯蒂芬的答案我已标记为正确。这只是一个对我来说更容易阅读的变体。
如果模板文件的内容仅应附加到最终文件(如果最终文件中尚不存在),则可以使用grep
:
cat <<-"EOF1" > myPath/myTemplate
content...
EOF1
if ! grep -F -q -f myPath/myFile myPath/myTemplate; then
cat myPath/myTemplate >> myPath/myFile
fi
该grep
命令搜索中包含的myPath/endFile.sh
任何固定字符串 ( -F
) myPath/myTemplate
,每行 ( -f
) 读取一个模式,并仅通过其退出代码,没有输出 ( -q
)。
然后结果被取反!
,这样只有在与最终文件中的任何内容都不匹配时才会执行then
该块的块。if-then
grep
附录 - 退出代码:
当进程退出时,它会返回一个退出代码,这是一个小整数。按照约定,退出代码 0 表示成功,非零表示失败或错误:
grep
找到匹配项时返回 0,未找到匹配项时返回 1。if
使用其参数的退出代码来决定要做什么;如果为 0,则处理该then
块,否则处理该else
块(如果有)。标点符号 (
!
) 可以翻转;该then
块仅在 grep 不匹配任何内容(或遇到错误)时运行。