我使用 .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 shell 中,没有内置方法可以使用条件 ( [ … ]
) 进行子字符串检查,但有一种使用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
外壳中。