Linux 命令行中 if 的语法

Linux 命令行中 if 的语法

这个命令行有什么问题(Centos 7):

if (grep ssl_certificate /etc/nginx/conf.d/platform.conf)
then echo $(grep ssl_certc /etc/nginx/conf.d/file.conf) > /etc/nginx/conf.d/file-certs.conf
fi

在 file.conf 中有 2 行包含 ssl_certificate 和 ssl_certificate_key。它应该将现有的 SSL 证书从 /etc/nginx/conf.d/file.conf 移动到 /etc/nginx/conf.d/file-certs.conf。

答案1

没有什么句法上代码片段有错误,但很不寻常。

要使用 测试是否在文件中找到字符串grep,如果是的话执行某些操作,请使用

if grep -qwF ssl_certificate /etc/nginx/conf.d/platform.conf; then

选项-q,-w-F将使grep安静 ( -q) 并将给定模式作为固定字符串而不是正则表达式 ( -F) 进行匹配。此外,-wgrep寻找完整的单词。在这种情况下,该字符串ssl_certificate3不是匹配模式。

grep如果在文件中找到该字符串,将返回零退出状态,并且语句的主体if将被执行。

该声明

echo $(somecommand)

有点没用。

命令替换$(somecommand)将被 的输出替换somecommand,并且 shell 将对结果字符串执行分词和文件名生成(这可能是不需要的)。使用它echo是没有用的,因为你本来可以这样做

somecommand

完整的if声明:

if grep -qwF ssl_certificate /etc/nginx/conf.d/platform.conf; then
    grep -wF ssl_certc /etc/nginx/conf.d/file.conf >/etc/nginx/conf.d/file-certs.conf
fi

(这假设这ssl_certc是一个完整的单词。否则-w从该单词中删除grep

或者,使用短路语法,

grep -qwF ssl_certificate /etc/nginx/conf.d/platform.conf &&
grep  -wF ssl_certc /etc/nginx/conf.d/file.conf >/etc/nginx/conf.d/file-certs.conf

请注意,这将覆盖/etc/nginx/conf.d/file-certs.conf该文件是否存在的内容。更改>>>附加如果不打算覆盖,则改为写入文件。

相关内容