OR 연산자가 $1에 작동하지 않는 문제가 있습니다. 예를 들어:
if [[ "$1" != '1' || '2' ]]
then
echo "BAD"
else
echo "OK"
fi
이 테스트를 실행하면 $1이 무엇이든 항상 BAD가 발생합니다.
1달러를 1이나 2로 어떻게 묶을 수 있나요?
답변1
표준 sh
구문 사용(따라서 bash
다른 모든 POSIX 호환 셸에서 인식됨):
case $1 in
(1 | 2) echo OK;;
(*) echo BAD;;
esac
또는:
if [ "$1" = 1 ] || [ "$1" = 2 ]; then
echo OK
else
echo BAD
fi
(이것은 문자열의 바이트 간 비교입니다. 01, 1e0, 1.0, 20/20, 0x1도 수치상으로는 와 동일하다고 간주될 수 있지만 불량으로 간주됩니다 1
.)
생성자 =
(복사본)의 / 연산자는 실제로 항등 연산자가 아닌 패턴 일치 연산자입니다. 따라서 이 특별한 경우 단일 문자를 일치시키려는 경우 해당 항목에 사용된 표준 구문처럼 이를 수행할 수도 있습니다. 방법.!=
bash
[[...]]
ksh
[[ $1 != [12] ]]
case $1 in ([12])
sh
답변2
BAD
항상 진술로 분기하는 이유 if
는 테스트가
[[ "$1" != '1' || '2' ]]
먼저 $1
그렇지 않은지 테스트 1
하고 그렇지 않은 경우 BAD
인쇄하십시오. 그렇다면 2
테스트로 평가됩니다. 이와 같은 문자열은 2
항상 true이며 BAD
인쇄됩니다.
대신에:
if [ "$1" != '1' ] && [ "$1" != '2' ]; then
또는 산술 테스트를 통해
if [ "$1" -ne 1 ] && [ "$1" -ne 2 ]; then
또는 산술 평가를 사용하여
if (( $1 != 1 )) && (( $1 != 2 )); then
답변3
if [[ "$1" != '1' || "$1" != '2' ]]
then
echo "BAD"
else
echo "OK"
fi
그런 다음 2와 1이 같지 않은 경우 != 문을 반복해야 합니다.
답변4
논리에 ($1 != 1) OR ($1 != 2)
결함이 있습니다.
그렇다면 $1
그것은 1
이다아니요같음 2
이므로 테스트는 참입니다.
게다가 그렇다면 $1
그렇죠 2
.아니요같으 1
므로 테스트도 유지됩니다. 즉, 테스트는 항상 옳습니다.
($1 == 1) or ($1 == 2)
다음과 같이 동등성을 테스트해야 합니다 .
if [[ ($1 == '1') || ($1 == '2') ]]; then
echo "$1 OK"
else
echo "$1 BAD"
fi
또는 더 간단합니다(ksh, bash 또는 zsh).
[[ $1 == [12] ]] && echo "$1 OK" || echo "$1 BAD"
또는 sh 구문을 사용하십시오(모든 POSIX 쉘에 이식 가능).
if [ "$1" = '1' ] || [ "$1" = '2' ]; then
echo "$1 OK"
else
echo "$1 BAD"
fi
또는 사례 관용구를 사용하여:
case $1 in
(1 | 2) echo "$1 OK" ;;
(*) echo BAD "$1 BAD" ;;
esac
위의 내용은 모두 문자열 비교입니다. 숫자 비교를 원할 경우 다음을 수행할 수 있습니다.
if [ "$1" -eq 1 ] || [ "$1" -eq 2 ]; then
echo "$1 OK"
else
echo "$1 BAD"
fi
$1
그러나 이 방법은 다른 숫자 값이 1.0
과 1e0
같거나 같은 경우에는 작동하지 않습니다 1
. 01
또는 함께 작동합니다 0001
.