Píšu shellový skript pro Linux pomocí Bash, abych přeložil jakýkoli video soubor do MP4. K tomu používám avconv
s libvorbis
pro zvuk.
Uvnitř mého skriptu mám otázku pro uživatele:
read -p "- Audio Quality [scale from -2 to 10] ? "
if [ -n "$REPLY" ] ; then
ABITRATE="-aq $REPLY"
fi
Můj řetězec „ABITRATE“ jde do konečného avconv
příkazového řádku.
Ale rád bych dal uživateli příležitost odpovědět na tuto otázku hodnotou v Kb (kilobitech) a převést ji na stupnici, která libvorbis
použití.
„Měřítko od -2 do 10“ je toto:
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
Chtěl bych vědět, jak zkontrolovat, zda je moje $REPLY v rozsahu čísel. Například bych chtěl, aby můj skript dělal něco takového:
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
Je to možné (Jsem ochoten říci ‚ano, samozřejmě, nemělo by to být těžké‘, ale neznám syntaxi, kterou mám použít)?
Přijatá odpověď:
[
Command/shell má vestavěné srovnávací testy, takže stačí udělat
if [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then REPLY=-2;
elif [ "$REPLY" -ge 33 ] && [ "$REPLY" -le 48 ]; then REPLY=-1; fi
kde -ge
znamená větší-nebo-rovno (a tak dále). [
příkaz je pouze příkaz, nikoli speciální syntaxe (ve skutečnosti je to stejné jako test
:podívejte se na man test
), takže POTŘEBUJE prostor za ním. Pokud napíšete [$REPLY
pokusí se najít příkaz s názvem [$REPLY
a provést to, což nebude fungovat. Totéž platí pro uzavření ]
.
Zde používáme &&
shell spustit druhý příkaz pouze v případě, že první je úspěšný. [
také podporuje -a
do a dva testy, ale je zastaralý a jeho používání by se nemělo používat, protože způsobuje, že argumenty nelze spolehlivě analyzovat.
Upravit:Chcete-li otestovat, zda je číslo celé číslo (pokud se to může stát ve vašem kódu), nejprve proveďte test
if [[ "$REPLY" =~ ^[0-9]+$ ]]; then
existing code
else echo "$REPLY is not an integer" >&2 && exit 1; fi
Všechny tyto výrazy v závorkách samozřejmě vracejí 0 (pravda) nebo 1 (nepravda) a lze je kombinovat. Nejen, že můžete vše umístit do stejné závorky, můžete to také udělat
if [[ "$REPLY" =~ ^[0-9]+$ ]] && [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then ...
nebo něco podobného.
Související:Dhcpd:nějaký způsob, jak zkontrolovat stav fondu dhcp?