#!/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
問題は、入力が有効な値と異なる場合に失敗を報告することです。しかし、どの入力は少なくとも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
コードで終了します。