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。ループの最初の繰り返しで成功を報告しますitemaそしてルーピングを続ける。その後、そのセクションに入り、失敗を報告して終了しますitembelse

問題は、入力が有効な値と異なる場合に失敗を報告することです。しかし、どの入力は少なくとも2つの有効な値とは異なります(誤った入力は3つすべてとは異なります)。入力が有効な値と等しい場合は成功を報告し、そうでない場合は失敗を報告する必要があります。

これを行う方法は、大きな画像によって異なります。入力を読んで確認するとみんなあなたが望むのは、現在のコードを少し再配置することです。

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}"PS:この場合、そう言う必要はありません"$site"

答え2

次の簡単な正規表現テスト

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

それで十分だと思います。しかし、誤検出を防止したい場合があります。

そして、確認を評価する方法で を入力するか、大文字/小文字の組み合わせを入力すると、スクリプトがy無効なY終了yesコードで終了します。

関連情報