bash – Compruebe si $ REPLY está en un rango de números

Pregunta:

Estoy escribiendo un script de shell para Linux, usando Bash, para traducir cualquier archivo de video a un MP4. Para eso, estoy usando avconv con libvorbis para audio.

Dentro de mi script, tengo una pregunta para el usuario:

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

Mi cadena "ABITRATE" va a la avconv comandos avconv final.

Pero me gustaría darle al usuario la oportunidad de responder esa pregunta con un valor en Kb (Kilobit) y traducirlo a la escala que usa libvorbis . La "escala de -2 a 10" es la siguiente:

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

Me gustaría saber cómo verificar si mi $ REPLY está en un rango de números. Por ejemplo, me gustaría que mi script hiciera algo como esto:

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

¿Es esto posible (estoy dispuesto a decir 'sí, por supuesto, no debería ser difícil' pero no sé la sintaxis que debo usar)?

Respuesta:

El [ comando / shell incorporado tiene pruebas de comparación, por lo que puede hacer

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

donde -ge significa mayor o igual a (y así sucesivamente). El comando [ es solo un comando, no una sintaxis especial (en realidad es lo mismo que test : mira man test ), por lo que NECESITA el espacio después de él. Si escribe [$REPLY , intentará encontrar un comando llamado [$REPLY y ejecutarlo, que no funcionará. Lo mismo ocurre con el cierre ] .

Aquí, usamos el operador de shell && para ejecutar el segundo comando solo si el primero tiene éxito. [ también admite -a to y dos pruebas, pero está en desuso y su uso debe desaconsejarse ya que hace que los argumentos no se puedan analizar de manera confiable.

Editar: para probar si el número es entero (si eso puede suceder en su código), primero haga la prueba

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

Por supuesto, todas estas expresiones entre corchetes devuelven 0 (verdadero) o 1 (falso) y se pueden combinar. No solo puedes poner todo en el mismo soporte, también puedes hacer

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

o algo similar.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım