$ 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
이것은 bash
under 및 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