
既存のファイルの一部のデータを確認するスクリプトを作成しようとしています。例:
#!/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つの静的文字列を比較します。 `!='