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に設定されているかどうかを知りたいと思います。値が7以外の0の場合は、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

コマンドが機能するには、バックティック( `)を使用する必要があります。質問で提供されたコードで2つの静的文字列を比較します。 `!='

関連情報