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강력합니다 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껍질 에 .

관련 정보