GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Prüfen, ob $reply in einem Zahlenbereich liegt?

Ich schreibe ein Shell-Skript für Linux mit Bash, um jede Videodatei in eine MP4-Datei zu übersetzen. Dafür verwende ich avconv mit libvorbis für Audio.

In meinem Skript habe ich eine Frage an den Benutzer:

read -p "- Audio Quality [scale from -2 to 10] ? "
    if [ -n "$REPLY" ] ; then
    ABITRATE="-aq $REPLY"
    fi

Mein „ABITRATE“-String geht in den abschließenden avconv Befehlszeile.

Aber ich möchte dem Benutzer die Möglichkeit geben, diese Frage mit einem Wert in Kb (Kilobit) zu beantworten und in die Skala zu übersetzen, die libvorbis hat verwendet.
Die „Skala von -2 bis 10“ ist diese:

Quality Kbit/s  Normalization
-----------------------------
 -2      ~32        y
 -1      ~48        y
  0      ~64        y
  1      ~80        y
  2      ~96        y
  3     ~112        y
  4     ~128        n
  5     ~160        n
  6     ~192        n
  7     ~224        n
  8     ~256        n
  9     ~320        n
 10     ~500        n

Ich würde gerne wissen, wie ich überprüfen kann, ob meine $ ANTWORT in einem Zahlenbereich liegt. Zum Beispiel möchte ich, dass mein Skript so etwas tut:

if [ $REPLY is a number between 1 and 32 ] ; then 
 REPLY="-2"
elif [ $REPLY is a number between 33 and 48 ] ; then 
 REPLY="-1"
fi

Ist das möglich (ich bin bereit zu sagen „Ja, natürlich, sollte nicht schwer sein“, aber ich kenne die zu verwendende Syntax nicht)?

Akzeptierte Antwort:

Der [ Command/Shell eingebaut hat Vergleichstests, also können Sie einfach tun

if [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then REPLY=-2;
elif [ "$REPLY" -ge 33 ] && [ "$REPLY" -le 48 ]; then REPLY=-1; fi

wobei -ge bedeutet größer oder gleich (und so weiter). Der [ command ist nur ein Befehl, keine spezielle Syntax (es ist eigentlich dasselbe wie test :Sehen Sie sich man test an ), also BENÖTIGT es das Leerzeichen danach. Wenn Sie [$REPLY schreiben es wird versuchen, einen Befehl namens [$REPLY zu finden und ausführen, was nicht funktioniert. Dasselbe gilt für das Schließen von ] .

Hier verwenden wir den && Shell-Operator, den zweiten Befehl nur auszuführen, wenn der erste erfolgreich ist. [ unterstützt auch -a zu und zwei Tests, aber es ist veraltet und von seiner Verwendung sollte abgeraten werden, da es dazu führt, dass Argumente nicht zuverlässig geparst werden können.

Bearbeiten:Um zu testen, ob die Zahl eine Ganzzahl ist (falls dies in Ihrem Code passieren kann), führen Sie zuerst den Test durch

if [[ "$REPLY" =~ ^[0-9]+$ ]]; then
   existing code
else echo "$REPLY is not an integer" >&2 && exit 1; fi

Natürlich liefern alle diese Klammerausdrücke 0 (wahr) oder 1 (falsch) und können kombiniert werden. Sie können nicht nur alles in dieselbe Klammer stecken, sondern auch

if [[ "$REPLY" =~ ^[0-9]+$ ]] && [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then ...

oder ähnliches.

Verwandte:Dhcpd:Gibt es eine Möglichkeit, den Status des DHCP-Pools zu überprüfen?
Linux
  1. So überprüfen Sie die Redhat-Version

  2. So überprüfen Sie die Zeitzone in Linux

  3. So überprüfen Sie die Syntax von Sudoers

  4. Datenbank auf Beschädigung prüfen

  5. So überprüfen Sie die CentOS-Version

Bash-Sequenzausdruck (Bereich)

So überprüfen Sie die Java-Version

Überprüfen Sie die Zeitzone in Linux

Wie überprüfe ich die OpenGL-Version?

Überprüfen Sie den Rackspace Cloud-Status

Rechtschreibprüfung in Rstudio