명령 오류 후 bash 스크립트가 종료되지 않도록 방지

명령 오류 후 bash 스크립트가 종료되지 않도록 방지

여러 줄의 텍스트를 출력하는 명령을 실행하는 스크립트가 있습니다.

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system

출력:

Registration state: 'registered'
    CS: 'detached'
    PS: 'detached'
    Selected network: 'unknown'
    Radio interfaces: '1'
            [0]: 'none'
    Data service capabilities: '0'
    Detailed status:
            Status: 'none'
            Capability: 'cs-ps'
            HDR Status: 'none'
            HDR Hybrid: 'yes'
            Forbidden: 'yes'

첫 번째 줄에서 따옴표로 묶인 문자열을 확인하고 싶습니다. 문자열이 "등록됨"과 같으면 뭔가를 하고 싶습니다. 그래서 처음에는 이것을 스크립트에 넣었습니다.

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system | grep "'registered'"
if [ $? -eq 0 ]; then
    #do stuff
fi

qmicli 명령이 가끔씩 버그가 발생하는 것을 제외하고는 작동합니다(외부 장치에 연결되고 때로는 하드웨어가 응답해야 할 때 응답하지 않는 경우도 있음). 이런 일이 발생하면 전체 스크립트가 무너집니다. 그래서 true오류가 발생하지 않도록 qmicli 명령을 OR로 연결했습니다 .

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system || true | grep "'registered'"

하지만 지금은 $?언제나0이므로 내가 설정한 if 조건을 사용할 수 없습니다.

명령이 오류를 반환하는 경우 스크립트가 종료되는 것을 방지하면서 명령의 여러 줄 출력에서 ​​문자열을 검사하는 더 좋은 방법이 있습니까?

답변1

set -e스크립트에 이와 동등한 것이 있다고 가정하므로 명령이 실패하면 종료됩니다.

이제 이것은 일관적입니다.

some command
if [ $? -eq 0 ]; then ...

이는 불필요한 우회 접근 방식입니다.

if some command; then ...

명령문의 테스트 부분에 있는 명령이 실패하면 명령문의 요점이 무효화되므로 명령 이 if실행되지 않습니다 . ~에서set -eif배쉬 문서-e:

실패한 명령이 while또는 키워드 바로 다음의 명령 목록의 일부인 경우 until, 명령문의 테스트의 일부, if또는 목록에서 실행된 명령의 일부(마지막 또는 후속 명령 제외), 부분 내의 모든 명령, 셸 종료되지 않습니다. 파이프가 마지막 파이프이거나 명령의 반환 상태가 .&&||&&||!

그렇다면 다음과 같이 하세요.

if qmicli -d /dev/cdc-wdm0 --nas-get-serving-system | grep "'registered'"; then
    #do stuff
fi

qmicli실패는 트리거되지 않습니다 set -e.


qmicli(또한 문제를 일으킨 것이 실패 라고 생각하지 않습니다 . 명령이 실패 qmicli하는 방식으로 실패하여 문제가 발생했습니다.)grep

관련 정보