GNU/Linux >> Linux Esercitazione >  >> Linux

Controlla se $ risposta è in un intervallo di numeri?

Sto scrivendo uno script di shell per Linux, usando Bash, per tradurre qualsiasi file video in un MP4. Per questo, sto usando avconv con libvorbis per l'audio.

All'interno del mio script, ho una domanda per l'utente:

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

La mia stringa "ABITRATE" va nel avconv finale riga di comando.

Ma vorrei dare all'utente l'opportunità di rispondere a questa domanda con un valore in Kb (Kilobit), e tradurlo nella scala che libvorbis usi.
La "scala da -2 a 10" è questa :

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

Vorrei sapere come verificare se il mio $ REPLY è in un intervallo di numeri. Ad esempio, vorrei che il mio script facesse qualcosa del genere:

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

È possibile (sono disposto a dire "sì certo, non dovrebbe essere difficile" ma non conosco la sintassi da usare)?

Risposta accettata:

Il [ comando/shell integrato ha test di confronto, quindi puoi semplicemente farlo

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

dove -ge significa maggiore o uguale a (e così via). Il [ command è solo un comando, non una sintassi speciale (in realtà è lo stesso di test :controlla man test ), quindi HA BISOGNO dello spazio dopo di esso. Se scrivi [$REPLY proverà a trovare un comando chiamato [$REPLY ed eseguilo, che non funzionerà. Lo stesso vale per la chiusura di ] .

Qui stiamo usando il && shell per eseguire il secondo comando solo se il primo ha esito positivo. [ supporta anche -a a e due test, ma è deprecato e il suo utilizzo dovrebbe essere sconsigliato poiché fa sì che gli argomenti non siano analizzabili in modo affidabile.

Modifica:per verificare se il numero è intero (se ciò può accadere nel tuo codice), prima fai il test

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

Ovviamente tutte queste espressioni tra parentesi restituiscono 0 (vero) o 1 (falso) e possono essere combinate. Non solo puoi mettere tutto nella stessa parentesi, puoi anche fare

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

o qualcosa di simile.

Correlati:DHCP:un modo per controllare lo stato del pool DHCP?
Linux
  1. Come controllare la versione di Redhat

  2. Come controllare il fuso orario in Linux

  3. Controllare il database per la corruzione

  4. Come controllare la versione di CentOS

  5. Spostare un intervallo di file numerati?

Espressione sequenza Bash (intervallo)

Come controllare la versione Java

Controlla il fuso orario in Linux

Come controllare la versione OpenGL?

Controlla lo stato di Rackspace Cloud

controllo ortografico in Rstudio