busybox 쉘 스크립트 - 알 수 없는 피연산자 오류 메시지

busybox 쉘 스크립트 - 알 수 없는 피연산자 오류 메시지

Python 스크립트를 실행하고 결과를 얻으려면 작은 쉘 스크립트를 작성해야 합니다.

이 방법으로 실행하려고 하면 작동합니다.

#!/bin/sh
/usr/bin/python /etc/scripts/backup.py
result=$?

if [ $result -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi

하지만 이렇게 하려고 하면 실패합니다.

#!/bin/sh
if [ $(/usr/bin/python /etc/scripts/backup.py) -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi

다음을 반환합니다.

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK

결과가 잘못되었습니다. "OK" 대신 "PROBLEM"이 인쇄되어야 합니다.

나는 지금까지 무엇을 시도했는가

if [ $(/usr/bin/python /etc/scripts/backup.py) -ne 0 ];

반품

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK

나는 또한 이것을 시도했습니다 :

if [ "$(/usr/bin/python /etc/scripts/backup.py)" -gt 0 ];

다음을 반환합니다.

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: out of range
OK

누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

감사해요.

답변1

$?이 명령은 표준 출력에 종료 상태( )를 반환 하지 않습니다 . 명령 대체( $(...))는 표준 출력을 캡처합니다.

대신 그냥 하세요

#!/bin/sh

if ! /usr/bin/python /etc/scripts/backup.py; then
   echo 'PROBLEM'
else
   echo 'OK'
fi

PROBLEMPython 스크립트가 0이 아닌 종료 상태로 종료되면 첫 번째 분기가 선택되어 인쇄됩니다.

if이 말은 "스크립트가 성공하지 못한 경우"로 이해할 수 있습니다 .

제거하고 싶다면 !:

#!/bin/sh

if /usr/bin/python /etc/scripts/backup.py; then
   echo 'OK'
else
   echo 'PROBLEM'
fi

if이 명령문은 "스크립트가 성공할 경우"로 해석 할 수 있습니다 .


이것실수당신이 얻는 결과는 스크립트가 아무것도 출력하지 않는다는 사실에서 비롯됩니다. 이는 명령 대체가 비어 있음을 의미합니다. 인용되지 않았기 때문에 쉘이 실행하려고 하는 명령은 다음과 같습니다.

if [ -gt 0 ]

구문 오류입니다.

명령 대체를 인용하면 기본적으로 다음을 실행하려고 합니다.

if [ "" -gt 0 ]

그리고 쉘은 빈 문자열을 정수로 비교할 수 없습니다.

답변2

Kusalananda가 보여준 것처럼, 당신은 단지 다음을 사용해야 합니다.

if cmd; then
    echo "command succeeded"
else
    echo "command failed: $?"
fi

보다 예시적인 예에서는 이와 같은 명령을 실행하여 0이 아닌 종료 코드가 "false"인 이유와 'if', 'while' 및 기타 논리적 비교에 대한 0 종료 코드가 셸 명령 구조인 이유를 확인할 수 있습니다. 사실인가요?

$ if (exit 3); then echo succeeded ; else echo failed $?;fi
failed 3
$ if (exit 0); then echo succeeded ; else echo failed $?;fi
succeeded
$ 

while 루프는 다음과 같이 작동합니다.

$ i=3;while ! (exit $i); do echo failed $i; ((i--));done
failed 3
failed 2
failed 1
$ 

연결에 실패한 명령을 다시 시도하거나 성공할 때까지 다시 시도해야 하는 데 사용할 수 있습니다.

(exit ...)을 사용하여 명령을 별도의 프로세스로 실행합니다. 내장 셸 명령의 경우 이는 스크립트를 실행하는 셸 인스턴스가 종료되는 것을 방지하는 데 필요합니다. 대신, 쉘은 종료 코드가 $? 값을 제공하는 하위 프로세스를 생성합니다. 쉘 매뉴얼 페이지에 표시된 대로.

관련 정보