while 문의 Bash 또는 조건

while 문의 Bash 또는 조건

사용자 입력이 "stringA" 또는 "stringB"와 같은지 확인하고 이 문자열 중 하나와 같으면 사용자 입력을 인쇄해야 하는 스크립트를 bash에 작성하고 싶습니다. 내 코드는 다음과 같습니다

#!/bin/bash

echo "Please enter your choice (stringA or stringB): "
read result

while [[ (${result,,} != 'stringa') || (${result,,} != 'stringb') ]]; do
        echo Please enter only stringA or stringB:
        read result
done

echo "You have selected $result!"

exit

불행하게도 이 코드는 작동하지 않고 무한 반복됩니다. while 루프의 두 번째 부분을 제거하는 문자열 중 하나와 동일한 경우에만 비교할 수 있습니다 $result. 교체 를 ||시도했지만 다음 오류가 발생합니다.||-o

./chk.sh: line 12: syntax error in conditional expression
./chk.sh: line 12: syntax error near `-o'
./chk.sh: line 12: `while [[ (${result,,} != 'stringa') -o (${result,,} != 'stringb') ]]; do' 

답변1

를 사용 하고 싶기 때문입니다 &&.||

결과가 stringA도 아니고 stringB도 아닌 경우 루프를 반복해야 합니다. 어떤 문자열도 둘 다와 동일할 수 없으므로 루프가 종료됩니다.

다음에서 패턴을 사용할 수도 있습니다 [[ ... ]].

while [[ ${result,,} != string[ab] ]]

답변2

#!/bin/bash

echo "Please enter your choice (stringA or stringB): "
read result

while ! [ "${result,,}" = 'stringa' -o "${result,,}" = 'stringb' ]; do
        echo Please enter only stringA or stringB:
        read result
done

echo "You have selected $result!"

exit

TTS(text-to-speech)에서는 결과가 stringa가 아니거나 결과가 stringb이지만...

"변수 에 주의를 기울이십시오 . 그렇지 않으면 $resultvar가 비어 있으면 오류 메시지가 표시됩니다.

답변3

코드의 문제는 while 루프입니다 $result.둘 다 stringA그리고 stringB(동시에). 당신은 사용하고 싶을 수도 있습니다

while [[ "${result,,}" != 'stringa' ]] && [[ "${result,,}" != 'stringb') ]]

또는

until [[ "${result,,}" == 'stringa' ]] || [[ "${result,,}" == 'stringb') ]]

사용자가 여러 옵션 중 하나를 선택할 수 있도록 하려면 긴 문자열을 입력하도록 하지 마세요. 대신 선택할 수 있는 간단한 메뉴를 제공하세요.

제안:

#!/bin/bash

PS3='Your choice: '
select result in 'stringA' 'stringB'; do
    case $REPLY in
        [12])
            break
            ;;
        *)
            echo 'Invalid choice' >&2
    esac
done

printf 'You picked %s!\n' "$result"

이것을 실행하세요:

$ bash script.sh
1) stringA
2) stringB
Your choice: 3
Invalid choice
Your choice: 2
You picked stringB!

답변4

sh로케일 설정을 사용하여 문자열을 변환하는 것과 관련된 문제를 제거하는 변형입니다 (예: 소문자는 모든 사람에게 작동하지 않습니다).${var,,}Ii

#! /bin/sh -
while true; do
  printf %s "Please enter your choice (stringA or stringB): "
  IFS= read -r result || exit # exit on EOF
  case $result in
    ([sS][tT][rR][iI][nN][gG][aAbB]) break
  esac
  echo >&2 Invalid choice.
done

관련 정보