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?