#!/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
.b
else
문제는 입력이 유효한 값과 다를 경우 실패를 보고한다는 것입니다. 하지만어느입력은 최소 두 개의 유효한 값과 다릅니다(잘못된 입력은 세 가지 모두와 다릅니다). 입력이 유효한 값과 같으면 성공을 보고하고, 그렇지 않으면 실패를 보고해야 합니다.
이를 수행하는 방법은 더 큰 그림에 따라 다릅니다. 입력을 읽고 확인하면모두당신이 원하는 것은 현재 코드를 약간 재배치하는 것입니다.
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
코드로 스크립트가 종료됩니다.