명령으로 사용되지만 쉘 스크립트로는 사용되지 않습니다. 왜?

명령으로 사용되지만 쉘 스크립트로는 사용되지 않습니다. 왜?
$ grep "apple" fruits.txt
apple
$ if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
A

위의 명령을 실행하면 잘 작동하지만 이 명령을 쉘 스크립트로 실행하면 오류가 발생하고 B가 인쇄됩니다. 왜 이런 일이 발생합니까?

$ sh temp.sh 
apple
temp.sh: 3: [: 0: unexpected operator
B

답변1

문제는 bash가 지원하는 항등 연산자를 사용하고 있지만 ==이를 지원하지 않는 스크립트를 실행하고 있다는 것입니다. sh해결책은 다음을 교체하는 것입니다.

if [ $? == 0 ] ; then echo "A"; else echo "B"; fi

그리고:

if [ $? = 0 ] ; then echo "A"; else echo "B"; fi

이것은 bashunder 및 plain 에서 작동 합니다 sh.

이 특별한 경우에는 아무런 차이가 없을 수도 있지만 =문자열 비교입니다. 수치적 동등성을 테스트하려면 다음을 사용해야 합니다 -eq.

if [ $? -eq 0 ] ; then echo "A"; else echo "B"; fi

예는 다음과 같습니다==

다음 스크립트 파일을 고려해보세요.

$ cat script.sh
grep "apple" fruits.txt
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi

bash에서 실행됩니다.

$ bash script.sh
apple
A

대시에서는 실패합니다(대시는 데비안 계열 시스템의 기본 sh입니다).

$ dash script.sh
apple
script.sh: 2: [: 0: unexpected operator
B

이 오류 메시지는 줄 번호를 제외하고 현재 표시되는 내용과 일치하는 것을 볼 수 있습니다.

단순화하다

$?직접 액세스가 필요하지 않습니다 . 코드는 다음과 같이 단순화될 수 있습니다.

$ if grep "apple" fruits.txt; then echo "A"; else echo "B"; fi
apple
A

또는 논리 AND &&및 논리 OR, ||, 연산자를 사용합니다.

grep "apple" fruits.txt && echo A || echo B

위의 코드는 echo A실행되면 항상 성공을 반환하기 때문에 작동합니다.

답변2

한 가지 옵션은 비교하려는 로컬 환경과 마찬가지로 bash 스크립트로 실행하는 것입니다.

bash에서 스크립트를 실행하려면 다음을 프로그램의 첫 번째 줄로 만드세요.

#!/usr/bin/env bash

관련 정보