Ich schreibe ein Shell-Skript für Linux und verwende Bash, um jede Videodatei in ein MP4-Format 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
Meine "ABITRATE" Zeichenfolge wird in die endgültige avconv
Befehlszeile eingegeben .
Ich möchte dem Benutzer jedoch die Möglichkeit geben, diese Frage mit einem Wert in Kb (Kilobit) zu beantworten und in die verwendete Skala zu übersetzen libvorbis
. Die "Skala von -2 bis 10" lautet wie folgt:
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 möchte wissen, wie ich überprüfen kann, ob sich mein $ REPLY in einem Zahlenbereich befindet. Ich möchte beispielsweise, dass mein Skript Folgendes ausführt:
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 dies möglich (ich bin bereit zu sagen, "Ja, sollte nicht schwer sein", aber ich kenne die zu verwendende Syntax nicht)?
quelle
Antworten:
Der
[
Befehl / die eingebaute Shell verfügt über Vergleichstests, so dass Sie dies einfach tun könnenwo
-ge
bedeutet größer oder gleich (und so weiter). Das-a
ist logisch "und". Der[
Befehl ist nur ein Befehl, keine spezielle Syntax (es ist eigentlich dasselbe wietest
: check outman test
), daher BRAUCHT er den Raum danach. Wenn Sie schreiben[$REPLY
, wird versucht, einen Befehl mit dem Namen zu finden[$REPLY
und auszuführen, was nicht funktioniert. Gleiches gilt für das Schließen]
.Bearbeiten: Um zu testen, ob die Zahl eine Ganzzahl ist (falls dies in Ihrem Code vorkommen kann), führen Sie zuerst den Test durch
Natürlich geben alle diese Klammerausdrücke 0 (wahr) oder 1 (falsch) zurück und können kombiniert werden. Sie können nicht nur alles in dieselbe Klammer setzen, sondern auch
oder etwas ähnliches.
quelle
>=
?[
Klammern, die wie in gezeigt funktionierenman test
. Diese sind traditionell und narrensicher. Dann haben Sie viele Bash-Buildins. Sie haben[[
ähnliche, aber nicht genau dieselben, da diese Pfadnamen nicht erweitern (dort bedeuten <=> Zeichenfolgenvergleiche und Ganzzahlvergleiche dasselbe wie in[
). Beide haben auch eine Menge Tests für die Existenz von Dateien, Berechtigungen und so weiter. Dann haben Sie in @ devnulls Antwort single(
und double((
verwendet. Check outman bash
unterCompound Commands
.foo='a'; [[ "$foo" -lt 32 ]] && echo yes
Man könnte einfach sagen:
Zitat aus dem Handbuch :
quelle
((
? Ich habe versucht, sie sofort zu verwenden, und es scheint zu funktionieren,if [ ] ; then
aber ich wusste nicht, dass es sie gibt.if [ condition ]; then foo; fi
gleichbedeutend mit Sprechencondition && foo
.a=08; (( a > 1 ))
wird fehler da 08 als oktal gilt. Sie können auch die Dezimalzahl mit erzwingen10#$REPLY
.cmd && cmd
ist nicht ganz das Gleiche wieif cmd; then ...
Wenn Sie einelse
Teil benötigen , wird die Verkettung logisch&&
und||
kann subtile Fehler verursachen.Sie könnten so etwas tun:
quelle
Testen Sie zunächst, ob die Eingabe numerisch ist. Verwenden Sie beispielsweise den Übereinstimmungsoperator für reguläre Ausdrücke für bedingte Bash-Ausdrücke :
Um numerische Bereiche zu testen, haben Sie zwei Möglichkeiten:
-gt
Operator für bedingte Ausdrücke innerhalb von[ … ]
oder[[ … ]]
(beachten Sie, dass der Operator<
und>
einen Zeichenfolgenvergleich durchführen, nicht einen Vergleich numerischer Werte, also[[ 10 < 9 ]]
ist dies wahr);((…))
.Somit:
(Möglicherweise möchten Sie andere Approximationsregeln verwenden. Ich weiß nicht, ob die von mir ausgewählten hier die besten sind.)
quelle
Um richtig zu erkennen, ob eine Zeichenfolge eine (Dezimal-) Zahl ist, müssen Sie zunächst definieren, was eine dezimale Ganzzahl ist. Eine einfache und doch recht vollständige Definition lautet:
Und diese Schritte sind nötig:
Nur ein regulärer Ausdruck erledigt das meiste:
Der Code zum Verarbeiten mehrerer Zahlen lautet:
Welches wird drucken:
Sobald die Zahl sauber und klar ist, besteht der einzige fehlende Test darin, den Wertebereich zu begrenzen. Diese einfachen Zeilen machen das:
quelle