![명령으로 사용되지만 쉘 스크립트로는 사용되지 않습니다. 왜?](https://linux55.com/image/65997/%EB%AA%85%EB%A0%B9%EC%9C%BC%EB%A1%9C%20%EC%82%AC%EC%9A%A9%EB%90%98%EC%A7%80%EB%A7%8C%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C%EB%8A%94%20%EC%82%AC%EC%9A%A9%EB%90%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%99%9C%3F.png)
$ 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