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报告成功并继续循环。然后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)

PS 你不需要"${site}"在这种情况下说;"$site"很好。

答案2

一个简单的正则表达式测试,例如

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

可能就足够了。不过,您可能希望防止误报。

而且,按照您评估确认的方式,如果您输入yYyes任何大写/小写组合,它将退出脚本并显示错误退出代码。

相关内容