programing

[ : 셸 프로그래밍에서 예기치 않은 연산자

telecom 2023. 6. 4. 10:18
반응형

[ : 셸 프로그래밍에서 예기치 않은 연산자

내 코드:

    #!/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

반응형