GNU/Linux >> Znalost Linux >  >> Linux

Zkontrolujte, zda je $reply v rozsahu čísel?

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?
Linux
  1. Jak zkontrolovat verzi Redhat

  2. Jak zkontrolovat časové pásmo v Linuxu

  3. Zkontrolujte databázi, zda není poškozená

  1. Jak zkontrolovat syntaxi sudoers

  2. Jak zkontrolovat verzi CentOS

  3. Přesunout řadu číslovaných souborů?

  1. Jak zkontrolovat místo na disku v Linuxu

  2. Zkontrolujte verzi AlmaLinux

  3. sečíst všechna čísla z du