.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
強力ですgrep
。case "$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
シェルに。