我想检查用户输入值是否存在于数组中,然后停止检查输入。
var=( one two three ) while true; do read -p "Choose value: " val for i in "${var[@]}";do [ "$i" = "$val" ] && exit 0; done done echo SUCCESS
脚本将退出,但我希望脚本继续并打印SUCCESS。我尝试了break指令,但while循环只是继续,并没有中断。
wkftcu5l1#
在break语句中使用level,如下所示:
var=( one two three ) while true; do read -p "Choose value: " val for i in "${var[@]}";do [ "$i" = "$val" ] && break 2; done done echo SUCCESS
它将中断外部循环(当处于级别2时)。
kyks70gy2#
避免嵌套循环,需要从@Renaud Pacalet使用 * 关联 * 数组方法,另一种方法是格式化数组并使用[[...]]而不是[...],类似于:
@Renaud Pacalet
[[...]]
[...]
#!/usr/bin/env bash var=( one two three ) pattern=$(IFS='|'; printf '@(%s)' "${var[*]}") while read -rp "Choose value: " val; do [[ "$val" = $pattern ]] && { printf "SUCCESS\n" && break } done
bashv 4.1
[[ ... ]]
extglob
shopt -s extglob
=~
#!/usr/bin/env bash var=( one two three ) pattern=$(IFS='|'; printf '%s' "${var[*]}") while read -rp "Choose value: " val; do [[ "$val" =~ $pattern ]] && { printf "SUCCESS\n" && break } done
cygmwpex3#
你应该把exit 0替换为break 2(也就是说,中断两个循环级别)。另一个选择是打印成功消息并退出:
exit 0
break 2
var=( one two three ) while true; do read -p "Choose value: " val for i in "${var[@]}";do [ "$i" = "$val" ] && echo "SUCCESS" && exit 0; done done
最后,如果你的bash支持它,一个以你的值作为键的关联数组会简化一点,只需要一个循环级别:
declare -A var=( ["one"]= ["two"]= ["three"]= ) while true; do read -p "Choose value: " val [[ -v var["$val"] ]] && break done echo "SUCCESS"
3条答案
按热度按时间wkftcu5l1#
在break语句中使用level,如下所示:
它将中断外部循环(当处于级别2时)。
kyks70gy2#
避免嵌套循环,需要从
@Renaud Pacalet
使用 * 关联 * 数组方法,另一种方法是格式化数组并使用[[...]]
而不是[...]
,类似于:bashv 4.1
开始,默认情况下,[[ ... ]]
的extglob
功能/支持是打开的,任何较低版本都需要shopt -s extglob
来启用它。=~
运算符的正则表达式:cygmwpex3#
你应该把
exit 0
替换为break 2
(也就是说,中断两个循环级别)。另一个选择是打印成功消息并退出:最后,如果你的bash支持它,一个以你的值作为键的关联数组会简化一点,只需要一个循环级别: