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?