it-swarm.com.de

So prüfen Sie, ob sich eine Zahl innerhalb eines Bereichs in der Shell befindet

Ich möchte nur eine Zahl zwischen zwei Werten einfügen, und ansonsten wird das Skript wiederholt, bis die korrekte Zahl erreicht ist.

Dies ist mein Skript und es funktioniert nicht richtig:

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

Wenn Sie Bash verwenden, sollten Sie den arithmetischen Ausdruck ((...)) verwenden, um die Lesbarkeit und Flexibilität zu verbessern:

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

So lesen Sie eine Schleife ein, bis eine gültige Nummer eingegeben ist:

#!/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)) kann auch als ((2 <= number <= 5)) geschrieben werden.


Siehe auch:

4
codeforester

Ihre if-Aussage:

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

sollte sein: 

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

Änderungen vorgenommen:

  • Das Zitieren von Variablen wird als gute Praxis betrachtet.
  • ls ist kein gültiger Vergleichsoperator, verwenden Sie le.
  • Trennen Sie bedingte Ausdrücke für einzelne Klammern mit &&.

Außerdem benötigen Sie einen Shebang in der ersten Zeile Ihres Skripts: #!/usr/bin/env bash 

2
Sergio

2 Änderungen erforderlich.

  1. Vorgeschlagen von Sergio.

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

  2. break ist nicht erforderlich. only meaningful in a for, while, or until loop

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

sollte sein

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

siehe help [[ für Details

0