GNU/Linux >> Tutoriales Linux >  >> Linux

¿Comprobar si $reply está en un rango de números?

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 en el avconv final línea de comandos.

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

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 secuencia de comandos 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 se debe usar)?

Respuesta aceptada:

El [ command/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 que (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 posterior. Si escribes [$REPLY intentará encontrar un comando llamado [$REPLY y ejecutarlo, que no funcionará. Lo mismo ocurre con el cierre de ] .

Aquí, estamos usando el && operador de shell para ejecutar el segundo comando solo si el primero es exitoso. [ también admite -a a y dos pruebas, pero está en desuso y su uso debe desaconsejarse, ya que hace que los argumentos no se analicen 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 de paréntesis devuelven 0 (verdadero) o 1 (falso) y se pueden combinar. No solo puedes poner todo en el mismo paréntesis, también puedes hacer

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

o algo similar.

Relacionado:Dhcpd:¿alguna forma de verificar el estado del grupo dhcp?
Linux
  1. Cómo verificar la versión de Redhat

  2. Cómo verificar la sintaxis de sudoers

  3. Cómo comprobar la versión de CentOS

  4. ¿Mover un rango de archivos numerados?

  5. suma todos los números de du

Expresión de secuencia Bash (rango)

Cómo comprobar la versión de Java

Comprobar la zona horaria en Linux

¿Cómo comprobar la versión de OpenGL?

Comprobar el estado de la nube de Rackspace

corrector ortográfico en Rstudio