我是bash shell脚本的新手,这是我第一次在stackoverflow中发布问题。我已经搜索了存档无济于事。我希望有人可以帮助我。
我有一个像这样的数组
declare -a SID=("mydb1" "mydb2" "mydb3")
在我的脚本中,系统会提示用户输入一个字符串,它将存储在$DBNAME
变量中。
例如,用户输入“mydb2”(不带引号),这将存储在$DBNAME
变量中。
我想创建一个循环,我希望针对${SID[@]
}变量的每个元素测试用户的输入。
当找到匹配项时,它将退出循环并继续执行脚本中的下一个命令。
请帮我创建一个脚本,使字符串值与数组变量的每个元素相匹配。
任何帮助都将受到高度赞赏。谢谢!
答案 0 :(得分:5)
@Flimzy的方法很好。使用for循环的正确方法是
for db in "${SID[@]}"; do
if [[ $db = $DBNAME ]]; then
echo yes
break
fi
done
答案 1 :(得分:1)
如果您只想检查用户是否输入了有效的dbname,请执行以下操作:
declare -a SID=("mydb1" "mydb2" "mydb3")
case " ${SID[*]} " in
*\ $DBNAME\ *)
echo Entered a correct DB name! Good job, pal!
;;
*)
echo Try again
;;
esac
在允许包含空格的用户输入的情况下,这可能会导致误报。如果这是一个问题,您可以通过使用用户输入中不允许的非空格分隔符来解决问题。例如:
case ".mydb1.mydb2.mydb3." in
*.$DBNAME.*)
如果您的用户输入完全开放且未经验证,那么for循环可能是您最好的选择,如@ glennjackson的回答中所述。
答案 2 :(得分:0)
如果您只想检查$ DBNAME是$ SID的条目,最简单的事情可能是:
if echo ${SID[@]} | grep -wq "$DBNAME"; then # DBNAME is in SID array fi
请注意,-w和-q是grep的非标准选项,因此您可能需要:
if echo ${SID[@]} | grep "\<$DBNAME\>" > /dev/null; then # DBNAME is in SID array fi
如果SID中的任何条目包含空格,则此操作将失败 其他奇怪的人物无疑也会引起问题。