测试 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 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健壮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外壳中。

相关内容