我正在编写一个简单的脚本,检查是否存在 .vimrc 文件以及该文件中的配置:
if [ "$(ls -a /root | grep .vimrc)" = ".vimrc" ]; then
echo "The .vimrc file exists"
if [ "$(cat /root/.vimrc | grep "colorscheme desert")" = "colorscheme desert" ]; then
echo "colorscheme is already added in the .vimrc file"
else
echo "The file does not have colorscheme added"
fi
第一个 if 语句运行正常,.vimrc = .vimrc
因此我得到了回声"The .vimrc file exists"
但是,第二个 if 语句仅打印“该文件没有添加配色方案”,但如果我检查该文件,它已添加该部分:
cat /root/.vimrc | grep "colorscheme desert"
colorscheme desert
先感谢您!
答案1
您的grep
测试只有在以下情况下才会成功:1)该行完全存在一次,并且 2)如果该行匹配确切地– 例如,如果文本前后有空格,则不会匹配。(出于同样的原因,如果 .vimrc 文件使用 CRLF 行尾,它也不会匹配,因为 grep 只处理 LF,因此 CR 将作为结果的一部分返回。)
作为编程实践,这两种测试都是不好的。该[
运算符可以做的不仅仅是字符串比较——它已经能够检查文件是否存在:
if [ -e /root/.vimrc ]; then
该if
语句不仅可以执行调用[
,还可以检查任何命令的结果:
if grep -q "colorscheme desert" /root/.vimrc; then
答案2
你是对的! .vimrc 文件确实使用 CRLS 行尾,而 grep 处理 LF,因此我遇到了这个问题:
cat -A /root/.vimrc
M-oM-;M-?colorscheme desert$
在我的脚本中,这将是:
M-oM-;M-?colorscheme desert$ = colorscheme desert
您说得也对,我应该使用更简单的脚本配置,就像您编写的一样,但我想坚持使用这个,因为我在脚本世界中还很陌生,所以为了学习,我会坚持使用我的脚本配置。
我-o
在 grep 之后添加了仅打印匹配行的匹配部分
if [ "$(cat /root/.vimrc | grep -o "colorscheme desert")" = "colorscheme desert" ]; then
在我添加了这个附加选项之后,脚本开始正常工作。
非常感谢您的帮助,帮助我发现一些新的东西,例如行尾!
亲切的问候,
贝尔菲戈尔