if 문이 예상대로 작동하지 않는 이유는 무엇입니까?

if 문이 예상대로 작동하지 않는 이유는 무엇입니까?
#!/bin/bash

if ! [[ "$1" =~ ^(dsm_print|dsm_label)$ ]] && ! [[ "$2" =~ ^(jqm_print|jqm_label)$ ]]
then
echo "wrong parameters"
exit 1
fi

echo "still runs"

이것은 실행되지만 sh -x ./test.sh dsm_label jqm_labe종료되지 않고 두 번째 인수에 대한 확인을 무시하는 것 같습니다. 두 매개변수를 모두 확인한 다음 종료해야 합니다.

+ [[ dsm_label =~ ^(dsm_print|dsm_label)$ ]]
+ echo 'still runs'
still runs

답변1

두 매개변수를 모두 확인하려는 경우에는 ||필요하지 않습니다 &&. 현재로서는 제공한 오류가 모두 거짓인 경우에만 스크립트가 실패합니다.

$  foo.sh dsm_print wrong
still runs
$  foo.sh wrong jqm_label
still runs
$  foo.sh wrong wrong
wrong parameters

if ! [[ condition1 ]] && ! [[ condition2 ]]두 조건이 모두 거짓인 경우에만 참이 되기 때문입니다 . 당신이 원하는 것은 ||다음 중 하나라도 거짓이면 실패한다는 것입니다.

#!/bin/bash

if ! [[ "$1" =~ ^(dsm_print|dsm_label)$ ]] || ! [[ "$2" =~ ^(jqm_print|jqm_label)$ ]]
then
echo "wrong parameters"
exit 1
fi

echo "still runs"

이는 예상대로 작동합니다.

$  foo.sh dsm_print wrong
wrong parameters
$  foo.sh wrong jqm_label
wrong parameters
$  foo.sh wrong wrong
wrong parameters

관련 정보