
여러 줄의 텍스트를 출력하는 명령을 실행하는 스크립트가 있습니다.
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 -e
if
배쉬 문서-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