내 Red Hat Linux 시스템에 /bin/sh
링크가 있습니다.bash
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 27 13:17 /bin/sh -> bash
이 고안된 테스트 프로그램을 직접 실행하면 예상한 답변을 얻을 수 있었습니다.
$ cat ./test.sh
#!/bin/sh
# Just a test program to illustrate an issue
case "b" in
(a) echo "a"; break;;
(b) echo "b"; break;;
(c) echo "c"; break;;
esac
$ ./test.sh
b
하지만 명시적으로 실행 bash
하거나 호출할 초기 줄을 변경하면 bash
오류가 발생합니다. 나는 이것이 아마도 실제 bash
버그라는 것을 알고 있습니다. 그런데 왜 이런 차이가 있습니까?
$ /bin/bash ./test.sh
b
./test.sh: line 5: break: only meaningful in a `for', `while', or `until' loop
$ sed -e 's/sh/bash/' test.sh > test1.sh
$ chmod 777 test1.sh
$ ./test1.sh
b
./test1.sh: line 5: break: only meaningful in a `for', `while', or `until' loop
답변1
man
페이지 에서 bash
:
이름으로 bash를 호출하면쉿, 기록 버전의 시작 동작을 모방하려고 시도합니다.쉿POSIX 규격을 유지하면서 최대한 가깝습니다.
하지만 그렇게 말하면서,POSIX 정의of에는 블록 내에서의 사용이 break
포함되지 않습니다 .case
이 man
페이지에는 다음과 같은 내용도 나와 있습니다(의 정의에 따라 case
).
만약에;;연산자를 사용하면 첫 번째 패턴 일치 이후 후속 일치가 더 이상 시도되지 않습니다.
그리고POSIX 정의말했다 case
:
조건부 구성 사례는 다음에 해당하는 복합 목록을 실행해야 합니다.첫 번째여러 패턴
따라서 결론은 첫 번째 게임이 끝난 후 멈출 필요가 없다는 것입니다 break
.case
답변2
Bash 매뉴얼 페이지에서:
bash가 sh 이름으로 호출되면 POSIX 표준을 준수하면서 sh의 이전 버전의 시작 동작을 최대한 가깝게 모방하려고 시도합니다.
break
C/C++와 달리 쉘 스크립트에서는 스위치/케이스 문을 사용할 필요가 없습니다 .