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로 평가됩니다.y
n
또는if
true), 이는 true이고 내부 명령을 실행합니다.
ifif , $value
그것y
예은 와 같지만 y
와 같지 않으므로 n
다음과 같이 평가됩니다. (false또는맞습니다), 여기서그건 진실이야, 내부 명령이 if
다시 실행됩니다.
if
내부 명령이 실행되지 않는 유일한 경우는 두 테스트가 모두 false인 경우입니다 . 즉, 같음 과 같음이 $value
모두 필요합니다 .y
n
기본적으로 당신이 원하는 것은 이것입니다
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" ]]
등을 사용하십시오.)[[
또한보십시오: