cron - 終了コードと grep に関する if ステートメントを含む bash スクリプト

cron - 終了コードと grep に関する if ステートメントを含む bash スクリプト

私は Linux と bash の世界では比較的「初心者」なので、これを理解できません。

とりわけ、iptables に「文字列」が存在しない場合に修正したいのですが、うまくいかないようです。これが if ステートメント、終了コード、構文、sudo 権限などによるものかはわかりません。

スクリプトがcron経由で自動的に実行される場合、探している文字列が含まれていifても節が実行されます。これは次のように検証されます。iptables

  1. スケジュールされた実行の前後数秒のiptablesをターミナルに印刷する
  2. echo "this" >>/log/file.logif 節に を追加します。

テイク1:

#!/bin/bash
iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then
    command-to-perform
fi

テイク2:

#!/bin/bash
iptablesvar=$(iptables -L -v -n)
if [[ $iptablesvar != *"8.8.8.8"* ]]; then
    command-to-perform
fi

私は、次の行を含む (sudo) crontab によってトリガーされた両方を試しました。

*/1 * * * * /bin/bash /home/username/path/to/script-file.sh

私を困惑させるのは、上記の両方のオプションが、次のようにターミナルに直接入力すると機能するように見えることです。

sudo iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then echo "not found" ;fi
if [ $? == 0 ]; then echo "found" ;fi

var=$(sudo iptables -L -n -v)
if [[ $var != *"8.8.8.8"* ]]; then echo "n" ;fi
if [[ $var == *"8.8.8.8"* ]]; then echo "y" ;fi

何が起こったのですか?

関連する場合、私のシステムは新しいLinux Mint 19.3 Triciaです

答え1

では、私自身が答えます。スチールドライバーコメント:
iptablesは cron にありませんPATH。コマンドをフルパスを含めるように変更しました/sbin/iptables

関連情報