在bash中检测文件中的现有字符串

时间:2018-12-14 16:48:12

标签: bash concatenation

我正在为项目创建bash安装程序脚本。在其中,我需要修改文件描述符数。我通过修改文件/etc/security/limits.conf/etc/pam.d/common-session/etc/pam.d/common-session-noninteractive来做到这一点。

这是bash installer script

中的代码
echo "
*    soft nofile 64000
*    hard nofile 64000
root soft nofile 64000
root hard nofile 64000
" >> /etc/security/limits.conf
echo "session required pam_limits.so" >> /etc/pam.d/common-session
echo "session required pam_limits.so" >> /etc/pam.d/common-session-noninteractive

问题是,如果由于某种原因项目安装失败并且通过了此检查点,则重新运行它会随后将此字符串再次添加到文件中。

有没有一种方法可以检测每个文件中是否已经存在字符串,如果不是,则执行添加。

我是bash中级用户,但这超出了我的技能范围,我不相信自己可以做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用此实用程序功能搜索给定文件,并且仅在文件中找不到字符串时才追加:

searchAppend() { grep -qF "$2" "$1" || echo "${3:-$2}" >> "$1"; }

并将其用作:

str="
*    soft nofile 64000
*    hard nofile 64000
root soft nofile 64000
root hard nofile 64000
"
searchAppend /etc/security/limits.conf 'root soft nofile 64000' "$str"
searchAppend /etc/pam.d/common-session 'session required pam_limits.so'
searchAppend /etc/pam.d/common-session-noninteractive 'session required pam_limits.so'

根据man bash

  

${parameter:-word}                 使用默认值。如果参数未设置或为null,则替换单词的扩展名。否则,将替换参数的值。

Shell Parameter Expansion Reference