#!/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)
︙
PS 你不需要"${site}"
在这种情况下说;"$site"
很好。
答案2
一个简单的正则表达式测试,例如
[[ " ${all[@]} " =~ " $site " ]] && echo in || echo out
可能就足够了。不过,您可能希望防止误报。
而且,按照您评估确认的方式,如果您输入y
、Y
或yes
任何大写/小写组合,它将退出脚本并显示错误退出代码。