6 votes

Comment vérifier si la saisie de l'utilisateur est égale à un élément d'un tableau ?

Imaginons que nous ayons un tableau comme celui-ci :

declare -a array=( "one" "two" "three" "four" "five" )

for i in "${all[@]}"; do
        echo "$i"
done

Et nous pouvons donner une entrée de l'utilisateur comme ceci :

read -p "Enter a number: " number

J'ai besoin de quelque chose pour vérifier si l'entrée de l'utilisateur correspond à l'un des éléments de ce tableau. Si ce n'est pas le cas, cela doit s'exécuter :

echo "Try again: " 

Ce processus doit être répété jusqu'à ce que la saisie de l'utilisateur corresponde à l'un des éléments du tableau.

5voto

bac0n Points 4841

Vous pouvez transformer le tableau en un tableau associatif.

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

3voto

pa4080 Points 27038

Il n'est pas nécessaire de parcourir le tableau en boucle pour vérifier si une valeur lui appartient. De plus, dans ce cas, j'utiliserais un appel récursif à une fonction plutôt qu'une autre boucle. Si je comprends bien, vous recherchez quelque chose comme ceci :

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

Avec la [[ test commande nous recherchons une correspondance exacte == entre une chaîne de caractères (côté gauche) et une expression régulière (côté droit).

  • L'expression " ${array[*]} " développera notre tableau comme une chaîne de caractères, entourée de deux espaces, de sorte que chaque élément (même le premier et le dernier) seront entourés d'espaces. echo '^'" ${array[*]} "'$' .

  • L'expression régulière *" ${number} "* correspondra à toute chaîne composée de la valeur de la variable $number entouré d'espaces, entouré d'autres caractères quelconques * .

Nous pouvons effectuer ce test à l'aide d'autres outils tels que grep (avec stdout supprimé) -q et la recherche d'une correspondance exacte \<...\> ). Voici une version amusante :

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

Si nous voulons appeler le numéro correspondant à chaque élément du tableau tableau au lieu d'insérer des mots comme ''un'' ou ''deux'', que pouvons-nous faire ? que pouvons-nous faire ? par exemple : Entrez le nombre : 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'

3voto

BeastOfCaerbannog Points 8327

Toutes les autres réponses sont probablement plus efficaces que celle-ci, mais je pense que celle-ci est plus adaptée aux débutants :

declare -a all=( "one" "two" "three" "four" "five" )

read -p "Enter a number: " number

while true; do

    for i in "${all[@]}"; do
        if [[ "$number" = "$i" ]]; then
            exit 0
        fi
    done

    read -p "Try again: " number

done

2voto

#!/bin/bash

declare -a array=("one" "two" "three" "four" "five")

number="wrong"

while [[ ! "${array[@]}" =~ "${number}" ]]; do
  [[ "${number}" != "wrong" ]] && echo "Incorrect"
  read -p "Insert number: " number
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X