AND 또는 OR의 몇 가지 기본 사항에 대한 도움이 필요합니다.

AND 또는 OR의 몇 가지 기본 사항에 대한 도움이 필요합니다.

제가 당황한 것 같은 몇 가지 질문이 있습니다. 이것은 Bash의 논리를 따르는 것 같습니다.

if [ "$argument" = "Y" -o "$argument" = "YES" ];
  then
fi

이 문을 두 번 사용하지 않고 만들 수 있는 방법이 있나요 "$argument"? 예, 알았어와 같은 답변을 3~4개 추가하려면 어떻게 이것을 확장할 수 있나요?

두번째,

while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] || [ "$argument" != "N" ] || [ "$argument" != "NO" ]; do
   echo "Not a valid selection"
done

여기서 내가 무엇을 잘못하고 있는지 잘 모르겠지만 어떤 문을 입력하더라도 $argument항상 Not a valid selectionY, YES, N 또는 NO를 허용하지 않는다는 메시지를 받습니다.

답변1

귀하의 예에서는 항상 대답이 유효하지 않다고 표시됩니다. 이는 귀하가 작성한 논리가 작동하는 실제 예가 없기 때문입니다. 그 가치가 무엇 이든 간에 $argument그럴 것이다.언제나Y은(는 ) 또는 와 같지 않습니다 YES. 마치 이 값 중 하나인 것처럼할 수 없다다른 사람이 되십시오.

다음 내용을 검토해 보세요 case.

valid=0
while [[ valid -eq 0 ]]; do
    read -p 'Really? > ' argument
    case "$argument" in
        Y*|y*)
            valid=1
            : handle 'yes' cases
            ;;
        N*|n*)
            valid=1
            : handle 'no' cases
            ;;
        *)
            printf 'Invalid input "%s".  Please say "yes" or "no".\n' "$argument" 1>&2
            ;;
    esac
done

답변2

if [ "$argument" = "Y" -o "$argument" = "YES" ]; then

"$argument"를 두 번 사용하지 않고 이 문을 생성하는 방법이 있나요?

표준 쉘에는 다음이 있습니다 case.

case $argument in
    Y|YES) echo "it's 'Y' or 'YES'";;
    *) echo "it's something else";;
esac

Bash/Ksh/Zsh에서는 정규식을 사용합니다.

if [[ $argument =~ Y|YES ]]; then
    ...

Bash/Ksh(또는 가 있는 Zsh setopt kshglob)에서는 Ksh 스타일 확장 글로브를 사용합니다.

if [[ $argument = @(Y|YES) ]]; then
    ...

물론 regex ^Y(ES)?$또는 또는 (포함 ) 로 시작하는 항목 ^[yY]과 일치하는 등 다양한 다른 옵션이 있습니다.yYyuck, no!


while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] ... 

내가 여기서 뭘 잘못하고 있는지 잘 모르겠습니다.

이 경우 논리를 수동으로 완료하는 것이 도움이 될 수 있습니다. argumentyes라고 가정 Y하면 [ "$argument" != "Y" ]거짓이고 [ "$argument" != "YES" ]참이므로 결과는 다음과 같습니다.또는그건 진실이야. 다른 값에 대해서도 이를 반복하면 비교 중 적어도 하나가 항상 참임을 알 수 있습니다.

관련 정보