쉘 스크립트: if [닫기]에서 여러 또는 연산자 조건이 동일하지 않음

쉘 스크립트: if [닫기]에서 여러 또는 연산자 조건이 동일하지 않음

cattest.sh

read value
if [ $value != "y" ] || [ $value != "n" ]
then
echo "invalid"
exit 1
fi 

런타임에 "n", "m", "y" 같은 값을 전달해 보았습니다. "m"을 전달하면 스크립트가 종료되기를 원합니다. 하지만 예상대로 작동하지 않습니다.

참고: 위 코드는 Bash 셸용입니다.

나는 성공하지 못한 채 여러 구문을 시도했습니다.

if [ $value != "y" || $value != "n" ]

if [[ $value != "y" ] || [ $value != "n" ]]

if [[ $value != "y" ]] || [[ $value != "n" ]]

if [[ $value != "y" || $value != "n" ]]

조건이 충족되지 않는 경우도 있습니다

이 문제를 해결하도록 도와주세요

답변1

"m"을 전달하면 스크립트가 종료되기를 원합니다. 하지만 예상대로 작동하지 않습니다.

좋습니다. 조건은 다음과 같습니다.

if [ $value != "y" ] || [ $value != "n" ]; then
    echo "invalid"
    ...

이면 와 $value같지도 않고 와 같지도 m않으므로 (true로 평가됩니다.yn또는iftrue), 이는 true이고 내부 명령을 실행합니다.

ifif , $value그것y은 와 같지만 y와 같지 않으므로 n다음과 같이 평가됩니다. (false또는맞습니다), 여기서그건 진실이야, 내부 명령이 if다시 실행됩니다.

if내부 명령이 실행되지 않는 유일한 경우는 두 테스트가 모두 false인 경우입니다 . 즉, 같음 과 같음이 $value모두 필요합니다 .yn

기본적으로 당신이 원하는 것은 이것입니다

if [ $value = "y" ] || [ $value = "n" ]; then
    echo ok
else
    echo invalid
fi

그러나 쓸모없는 "ok" 분기가 없으므로 조건이 반대가 됩니다.

if ! ( [ $value = "y" ] || [ $value = "n" ] ); then
    echo invalid
fi

이제 (A또는B)는 (아니요아니면나), 하지만 (아니요그리고 아니요B) 그것이 바로 귀하의 사건에서 말해야 할 내용입니다.

또한 변수 확장을 인용하고 싶습니다. 그렇지 않으면 내용의 공백으로 인해 $value명령이 해석되는 방식이 엉망이 되기 때문입니다.

if [ "$value" != "y" ] && [ "$value" != "n" ]; then
    echo invalid
fi

(또는 특수하고 공백으로 인해 분할이 발생하지 않는 몇 안 되는 경우 중 하나이므로 [[ $value != "y" ]]등을 사용하십시오.)[[

또한보십시오:

관련 정보