if then else 语句问题

if then else 语句问题

我正在尝试编写一个脚本来检查现有文件中的某些数据。例子:

#!/bin/bash

set -x
if [ 'grep PASS_WARN_AGE /etc/login.defs' == 'PASS_WARN_AGE    7' ]; then
        echo "RHEL-06-000054 not a finding"

elif [ 'grep PASS_WARN_AGE /etc/login.defs' == 'PASS_WARN_AGE    0' ]; then
        sed -ie 's/PASS_WARN_AGE\s\s\s\s0/PASS_WARN_AGE    7/g' /etc/login.defs

else echo "Needs further review"
fi

该脚本忽略了 if 和 elif 字符串,仅回显“需要进一步审查”字符串。本质上,我希望这个脚本告诉我当前值是否设置为 7。如果该值是 0 而不是 7,则它执行 sed 命令,更改文件 /etc/login.defs 中的值。如果出现一些未知的输出,它会告诉用户需要进一步检查。感谢所有帮助。

答案1

我想到了。

    #!/bin/bash
set -x
grep -q 'PASS_WARN_AGE    7' /etc/login.defs
if [ ${?} -eq 0 ]; then
        echo "RHEL-06-000054 not a finding"

grep -q 'PASS_WARN_AGE    0' /etc/login.defs
elif [ ${?} -eq 0 ]; then
        sed -ie 's/PASS_WARN_AGE\s\s\s\s0/PASS_WARN_AGE    7/g' /etc/login.defs; echo "RHEL-06-000054 patched"

else echo "needs further review"
fi

答案2

如果您愿意,您可以无条件地运行sed该文件:

sed -i .bak -Ee 's/^PASS_WARN_AGE\s+0/PASS_WARN_AGE    7/' /etc/login.defs

我会谨慎使用类似的模式,\s\s\s\s因为空白的数量可能会有所不同。我不认为\s这是标准的,但我想如果上下文是 RHEL,无论如何你都会有 GNU sed。

答案3

您需要使用反引号(`)来让命令工作,在您的问题中提供的代码中您比较两个静态字符串。 `!='

相关内容