bash는 배열을 정의하고 입력을 저장된 배열 값과 비교합니다.

bash는 배열을 정의하고 입력을 저장된 배열 값과 비교합니다.
#!/bin/bash

declare -a all=("a" "b" "c")

echo -n  "Please enter one value ${all[@]} [ENTER]: "
read site
echo "You entered $site as site"
read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1


for item in "${all[@]}"; do
echo $item
 if [[ "${site}" == "${all[@]}" ]]; then
  echo "Site Name validated"
 else
  echo "No Match For Site Name" && exit 1
 fi
done

입력에 a, b, c를 입력하더라도 마찬가지입니다. 정의된 배열에 대해 입력을 확인할 수 없으며 if 문을 만족시킬 수 없습니다. 미리 감사드립니다.

답변1

if [[ "${site}" == "${all[@]}" ]] ( 로  변경하신 것으로 추정됩니다 if [[ "$site" == "$item" ]].)

루프가 어떻게 실행되는지 상상해보세요. 입력을 가정합니다  b. 루프의 첫 번째 반복은 item와 동일하게  설정됩니다 a. 당신은 b비교합니다  a. 동일하면 유효성 검사를 보고합니다. 하지만 동일하지 않으므로 실패를 보고하고 종료합니다.

당신의 타이핑은 더 나아지지 않습니다  a. 루프의 첫 번째 반복에서 성공을 보고합니다 item.a그리고 계속 루핑을 하세요. 그러면 해당 절에 들어가서 실패를 보고하고 종료됩니다 item.belse

문제는 입력이 유효한 값과 다를 경우 실패를 보고한다는 것입니다. 하지만어느입력은 최소 두 개의 유효한 값과 다릅니다(잘못된 입력은 세 가지 모두와 다릅니다). 입력이 유효한 값과 같으면 성공을 보고하고, 그렇지 않으면 실패를 보고해야 합니다.

이를 수행하는 방법은 더 큰 그림에 따라 다릅니다. 입력을 읽고 확인하면모두당신이 원하는 것은 현재 코드를 약간 재배치하는 것입니다.

for item in "${all[@]}"; do
    echo "$item"
    if [[ "$site" == "$item" ]]; then
        echo "Site Name validated" && exit 0
    fi
done
echo "No Match For Site Name" && exit 1

그러나 (아마도) 스크립트를 계속 진행하고 싶다면뭔가를 해라좋은 접근 방식은 입력이 유효한 경우 플래그를 사용하는 것입니다.

valid=
for item in "${all[@]}"; do
    echo "$item"
    if [[ "$site" == "$item" ]]; then
        echo "Site Name validated" && valid=1
    fi
done
if ! [ "$valid" ]
then
    echo "No Match For Site Name" && exit 1
fi
# (script continues with valid input)

"${site}"추신: 이 경우에는 그렇게 말할 필요가 없습니다 "$site".

답변2

다음과 같은 간단한 정규식 테스트

[[ " ${all[@]} " =~ " $site " ]] && echo in || echo out

그거면 충분할 것 같아요. 그러나 오탐지를 방지하고 싶을 수도 있습니다.

그리고 확인을 평가하는 방식으로 를 입력하거나 대문자/소문자 조합을 입력하면 y잘못된 Y종료 yes코드로 스크립트가 종료됩니다.

관련 정보