if 语句 - 简单的 bash 脚本

if 语句 - 简单的 bash 脚本

我正在编写一个简单的脚本,检查是否存在 .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

在我添加了这个附加选项之后,脚本开始正常工作。

非常感谢您的帮助,帮助我发现一些新的东西,例如行尾!

亲切的问候,

贝尔菲戈尔

相关内容