반응형
[ : 셸 프로그래밍에서 예기치 않은 연산자
내 코드:
#!/bin/sh
#filename:choose.sh
read choose
[ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0
[ "$choose" == "n" -o "$choose" == "N" ] && echo "No" && exit 0
echo "Wrong Input" && exit 0
하지만 내가 실행할 때
sh ./choose.sh
terminal 프롬프트를 표시합니다.
[: 4: n: :Unexpected operator
[: 5: n: :Unexpected operator
제 bash 스크립트에 오류가 있습니까?감사합니다!
당신의 bash 스크립트에는 실수가 없습니다.하지만 당신은 덜 광범위한 구문을 가진 sh로 그것을 실행하고 있습니다 ;)
자, 달려라bash ./choose.sh
대신 :)
POSIX sh는 이해하지 못합니다.==
끈 평등을 위해, 그것은 배시주의이기 때문입니다.사용하다=
대신.
괄호가 share wrong에 의해 지지되지 않는다고 말하는 다른 사람들, btw.
Bash와 함께 실행하려면 #!/bin/bash를 사용하고 chmodit을 실행 가능으로 사용합니다.
./choose.sh
if/esac 대신 case/esac을 사용할 수 있습니다.
case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
대신 bash를 사용하거나 표준 sh를 사용하여 스크립트를 다시 작성해야 합니다.
sh -c 'test "$choose" = "y" -o "$choose" = "Y"'
실제로 "[""] 정사각형 오프닝 브래킷은 테스트 명령의 내부 셸 별칭일 뿐입니다.
그래서 이렇게 말할 수 있습니다.
test -f "/bin/bash" && echo "This system has a bash shell"
또는
[ -f "/bin/bash" ] && echo "This system has a bash shell"
그들은 sh 또는 bash에서 동등합니다."[] 명령에는 닫는 "] 브래킷이 있어야 하지만 "[]" 이외에는 "테스트"와 동일합니다."man test"는 읽기에 좋은 것입니다.
변수 이름의 시작으로 예약된 키워드를 사용하지 마십시오. 예를 들어 HOSTNAME {TYPE|NAME}이(가) 예약되어 있으면 HOSTNAME이 실패합니다.
언급URL : https://stackoverflow.com/questions/3411048/unexpected-operator-in-shell-programming
반응형
'programing' 카테고리의 다른 글
데카르트 제품을 할 수 있는 좋은 LINQ 방법이 있습니까? (0) | 2023.06.09 |
---|---|
과부하 상태에서 스레드 풀 부족 문제 해결 (0) | 2023.06.04 |
레일즈에서 플럭과 수집의 차이점은 무엇입니까? (0) | 2023.06.04 |
iOS: UTC NSDate를 로컬 표준시로 변환 (0) | 2023.06.04 |
오류(ORA-00923: FROM 키워드를 찾을 수 없습니다.) (0) | 2023.06.04 |