我们如何检查用户输入是否等于数组的一个元素?

msn*_*ndm 4 bash

想象一下我们有一个这样的数组:

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)

应重复此过程,直到用户输入与数组元素之一匹配。

bac*_*c0n 5

您可以将数组改为关联数组。

#!/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)


pa4*_*080 3

您不需要循环遍历数组来检查某个值是否属于它。另外,在这种情况下,我将使用函数的递归调用而不是另一个循环。据我正确理解,您正在寻找这样的东西:

#!/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)