posix shell .shスクリプト(bashではない)でサブストリングをテストする

posix shell .shスクリプト(bashではない)でサブストリングをテストする

.shスクリプトを使用してコントローラにインストールされているファームウェアを読み、それを利用可能なファームウェアと比較します(必要に応じてコントローラによって更新されます)。

読み取り値が有効であることを確認するために、サブストリング「ERROR」に対する応答文字列(コントローラーが読み取る別のスクリプトで生成されたもの)をテストしたいと思います。

部分文字列をテストするためにいくつかの方法を試しましたが、これまで何も機能しませんでした。私が見つけたほとんどのソースはbashを使用するので、検索は複雑です。

編集:「すべて」関連コード

MCU_VER=$($PRG)
echo "SubMCU Firmware version readout:" >> /tmp/version_test_log.txt
echo $MCU_VER >> /tmp/version_test_log.txt
case "$MCU_VER" in
    *"ERROR"*)
        echo "Error" >> /tmp/version_test_log.txt
        FW_READ=0;;
    *)
        echo "Success" >> /tmp/version_test_log.txt
        FW_READ=1;;
esac
let LOOP_CNT=LOOP_CNT+1
echo "Loop count:" >> /tmp/version_test_log.txt
echo $LOOP_CNT >> /tmp/version_test_log.txt
echo "Readout state:" >> /tmp/version_test_log.txt
echo $FW_READ >> /tmp/version_test_log.txt

ログファイルは次のとおりです。

SubMCU Firmware version readout:
ERROR: Failed to init GPIO output pin 77
Success
Loop count:
1
Readout state:
1

編集:これでコードが機能します。解決策はケース構成です。

答え1

Bourne / POSIXシェルには、条件付き()を使用して部分文字列チェックを実行する組み込みの方法はありませんが、条件付き()ステートメントを[ … ]使用する方法があります。case

case "$MCU_VAR" in
  *"ERROR"*)
    echo "Error" >> /tmp/version_test_log.txt
    FW_READ=0;;
  *)
    echo "Success" >> /tmp/version_test_log.txt
    FW_READ=1;;
esac

これは、呼び出しより高速でgrep破損する可能性がある特殊文字に対してよりecho強力ですgrepcase "$foo" in *"$bar"*) …値にfoo値が部分文字列として含まれていることをテストし、改行、barバックスラッシュ、アスタリスクなどが含まれている場合でも、すべての文字列に適用されます。

答え2

何が必要です:

if printf '%s\n' "$MCU_VAR" | grep -q "ERROR"; then
    printf '%s\n' "Error" >> /tmp/version_test_log.txt
    FW_READ=0
else
    printf '%s\n' "Success" >> /tmp/version_test_log.txt
    FW_READ=1
fi

[[ ]]エイリアスを使用しないでくださいksh/bash/zsh/...テストPOSIXシェルに。

関連情報