想象一下我们有一个这样的数组:
declare -a array=( "one" "two" "three" "four" "five" )
for i in "${all[@]}"; do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
我们可以像这样提供来自用户的输入:
read -p "Enter a number: " number
Run Code Online (Sandbox Code Playgroud)
我需要一些东西来检查用户输入是否与该数组的元素之一匹配。如果没有,这应该运行:
echo "Try again: "
Run Code Online (Sandbox Code Playgroud)
应重复此过程,直到用户输入与数组元素之一匹配。
您可以将数组改为关联数组。
#!/bin/bash
declare -A array=([one]=1 [two]=1 [tree]=1 [four]=1 [five]=1)
m="Guess? "
while true; do
read -r -p "$m" i
[[ ${array[$i]} == 1 ]] && break || m="Guess again? "
done
echo "Good guess!"
Run Code Online (Sandbox Code Playgroud)
您不需要循环遍历数组来检查某个值是否属于它。另外,在这种情况下,我将使用函数的递归调用而不是另一个循环。据我正确理解,您正在寻找这样的东西:
#!/bin/bash
array=( "one" "two" "three" "four" "five" )
function get_input() {
read -p "${1}: " number
if [[ " ${array[*]} " == *" ${number} "* ]]
then
echo 'true';
else
get_input 'Try again' # a recursive call of the function
fi
}
get_input 'Enter a number' # the initial call of the function
Run Code Online (Sandbox Code Playgroud)
通过[[
测试命令,我们搜索==
一个字符串(左侧)和一个正则表达式(右侧)之间的精确匹配。
该表达式" ${array[*]} "
会将我们的数组扩展为字符串,并由两个空格包围,因此每个元素(甚至第一个和最后一个)都将被空格包围 - try echo '^'" ${array[*]} "'$'
。
正则表达式*" ${number} "*
将匹配由变量值组成的任何字符串$number
,该字符串由空格包围,无论被其他字符包围*
。
我们可以通过其他一些工具执行此类测试,例如grep
(使用抑制的 stdout -q
,并搜索完全匹配\<...\>
)。这是一个有趣的版本:
#!/bin/bash
array=( "one" "two" "three" "four" "five" )
function get_input() {
read -p "${1}: " nm
echo "${array[*]}" | grep -q "\<${nm}\>" && echo 'true' || get_input 'Try again'
}
get_input "Enter a number"
Run Code Online (Sandbox Code Playgroud)
如果我们想调用数组中每个元素对应的数字,而不是插入“一”或“二”这样的单词,我们该怎么办呢?例如:输入数字:2
#!/bin/bash
array=( "one" "two" "three" "four" "five" )
# Get the lenght of the array
array_lenght="${#array[*]}"
function get_input() {
read -p "${1}: " number
# Test whether the variable $number has a value &and&
# test whether as integer this value is less or equal to the $array_lenght
if [[ ! -z ${number} ]] && (( number <= array_lenght && number > 0 ))
then
# Outpit the value of the cerain array element
# Note the first array element has number 0
echo "${array[$(( number - 1 ))]}"
else
get_input 'Try again'
fi
}
get_input 'Enter an integer number'
Run Code Online (Sandbox Code Playgroud)