web-dev-qa-db-fra.com

Comment vérifier si un nombre est compris dans une plage en shell

Je veux juste insérer un nombre entre deux valeurs, sinon le script est répété jusqu'à ce que le nombre soit correct.

Ceci est mon script et il ne fonctionne pas correctement:

validation(){
read number
if [ $number -ge 2 && $number -ls 5 ]; then
    echo "valid number"
    break
else
    echo "not valid number, try again"
fi

}

echo "insert number"
validation
echo "your number is" $number
5
jack

Si vous utilisez Bash, il vaut mieux utiliser l'expression arithmétique, ((...)), pour la lisibilité et la flexibilité:

if ((number >= 2 && number <= 5)); then
  # your code
fi

Pour lire en boucle jusqu'à ce qu'un nombre valide soit entré:

#!/bin/bash

while :; do
  read -p "Enter a number between 2 and 5: " number
  [[ $number =~ ^[0-9]+$ ]] || { echo "Enter a valid number"; continue; }
  if ((number >= 2 && number <= 5)); then
    echo "valid number"
    break
  else
    echo "number out of range, try again"
  fi
done

((number >= 2 && number <= 5)) peut également être écrit en tant que ((2 <= number <= 5)).


Voir également:

4
codeforester

Votre déclaration if:

if [ $number -ge 2 && $number -ls 5 ]; then 

devrait être: 

if [ "$number" -ge 2 ] && [ "$number" -le 5 ]; then

Modifications effectuées:

  • Citer les variables est considéré/ bonne pratique .
  • ls n'est pas un opérateur de comparaison valide, utilisez le.
  • Séparez les expressions conditionnelles avec un seul crochet avec &&.

Aussi, vous avez besoin d’un Shebang dans la première ligne de votre script: #!/usr/bin/env bash 

2
Sergio

2 changements nécessaires.

  1. Proposé par Sergio.

    if [ "$number" -ge 2 ] && [ "$number" -le 5 ]; then

  2. Il n'y a pas besoin de break. only meaningful in a for, while, or until loop

0
Jayesh Dhandha
if [ $number -ge 2 && $number -ls 5 ]; then

devrait être

if [[ $number -ge 2 && $number -le 5 ]]; then

voir help [[ pour plus de détails

0