UNIX에서 동일한 변수에 대해 여러 값을 설정하는 방법은 무엇입니까?

UNIX에서 동일한 변수에 대해 여러 값을 설정하는 방법은 무엇입니까?

여러 단어와 단어 변형에 대한 출력을 제공하는 스크립트를 얻으려고 합니다. 변수에 -o를 추가하고, 단어를 인용하고, 함께 연결해 보았습니다. varname의 각 단어는 나에게 출력하려는 ​​표시 단어입니다. 이 문제를 해결할 수 있는 방법이 있습니까? 아니면 각 변수를 개별적으로 설정해야 합니까? 예: varname1=even varname2=Even varname3=EVEN 등.

#!/bin/bash

varname1=even -o Even -o EVEN
varrname2=odd -o Odd -o ODD
varname3=zero -o Zero -o ZERO
varname4=negative -o Negative -o NEGATIVE

# Ask the user for one of four select words
echo "Type one of the following words:"
echo "even, odd, zero, negative"
read varword
if [[ ("$varword" = $varname1 ) || ("$varword" = $varname2 ) || ("$varword" = $varname3 ) || ("$varword" = $varname4 ) ]]
then
    echo "The approved word you have selected is $varword, great work! "
else
    echo "The unapproved word you have selected is $varword, Please try again."
fi

답변1

echo "Type one of the following words:"
echo "even, odd, zero, negative"
while :; do
  read varword
  varword="${varword,,}" #downcase it
  case "$varword" in
    even|odd|zero|negative)
      echo "The approved word you have selected is $varword, great work! "; break;;
    *)
      echo "The unapproved word you have selected is $varword, Please try again.";;
  esac
done

답변2

변수에 여러 값을 저장하는 한 가지 방법은 배열입니다.이것은 bash에서 배열 변수를 사용하는 방법에 대한 문서입니다.

그러나 당신이 원하는 것은 대소 문자를 구분하지 않는 일치 인 것 같습니다. 이는 에 의해 달성될 수 있습니다 grep -iq. igrep에게 대소문자를 구분하지 않고 qtrue 또는 false만 반환해야 한다고 grep에게 지시합니다. 또한 \|grep 절에서 or 연산자를 사용하여 여러 단어를 일치시킬 수 있습니다. 마지막으로 이 문자열 표기법 <<<을 사용하여 변수를 grep에 직접 제공합니다. 이렇게 하면 스크립트가 크게 단순화됩니다.

#!/bin/bash

# Ask the user for one of four select words
echo "Type one of the following words:"
echo "even, odd, zero, negative"
read varword
if grep -iq "even\|odd\|zero\|negative" <<< "$varword"
then
    echo "The approved word you have selected is $varword, great work! "
else
    echo "The unapproved word you have selected is $varword, Please try again."
fi

관련 정보