针对数组的每个元素测试一个字符串

时间:2011-10-28 06:14:27

标签: bash shell

我是bash shell脚本的新手,这是我第一次在stackoverflow中发布问题。我已经搜索了存档无济于事。我希望有人可以帮助我。

我有一个像这样的数组

declare -a SID=("mydb1" "mydb2" "mydb3")

在我的脚本中,系统会提示用户输入一个字符串,它将存储在$DBNAME变量中。

例如,用户输入“mydb2”(不带引号),这将存储在$DBNAME变量中。

我想创建一个循环,我希望针对${SID[@]}变量的每个元素测试用户的输入。

当找到匹配项时,它将退出循环并继续执行脚本中的下一个命令。

请帮我创建一个脚本,使字符串值与数组变量的每个元素相匹配。

任何帮助都将受到高度赞赏。谢谢!

3 个答案:

答案 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中的任何条目包含空格,则此操作将失败 其他奇怪的人物无疑也会引起问题。