J'écris un script shell pour Linux, en utilisant Bash, pour traduire n'importe quel fichier vidéo en MP4. Pour cela, j'utilise avconv
avec libvorbis
pour le son.
Dans mon script, j'ai une question pour l'utilisateur :
read -p "- Audio Quality [scale from -2 to 10] ? "
if [ -n "$REPLY" ] ; then
ABITRATE="-aq $REPLY"
fi
Ma chaîne "ABITRATE" va dans le dernier avconv
ligne de commande.
Mais je voudrais donner à l'utilisateur la possibilité de répondre à cette question avec une valeur en Ko (Kilobit), et de la traduire dans l'échelle que libvorbis
utilise.
L'"échelle de -2 à 10" est la suivante :
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
Je voudrais savoir comment vérifier si mon $REPLY est dans une plage de nombres. Par exemple, j'aimerais que mon script fasse quelque chose comme ça :
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
Est-ce possible (je suis prêt à dire "oui bien sûr, ça ne devrait pas être difficile" mais je ne connais pas la syntaxe à utiliser) ?
Réponse acceptée :
Le [
command/shell builtin a des tests de comparaison, vous pouvez donc simplement le faire
if [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then REPLY=-2;
elif [ "$REPLY" -ge 33 ] && [ "$REPLY" -le 48 ]; then REPLY=-1; fi
où -ge
signifie supérieur ou égal à (et ainsi de suite). Le [
command est juste une commande, pas une syntaxe spéciale (c'est en fait la même chose que test
:découvrez le man test
), il a donc besoin de l'espace après. Si vous écrivez [$REPLY
il essaiera de trouver une commande nommée [$REPLY
et exécutez-le, ce qui ne fonctionnera pas. Il en va de même pour la fermeture de ]
.
Ici, nous utilisons le &&
opérateur shell pour exécuter la deuxième commande uniquement si la première réussit. [
prend également en charge -a
à et deux tests, mais il est obsolète et son utilisation doit être déconseillée car il empêche l'analyse fiable des arguments.
Edit :pour tester si le nombre est entier (si cela peut arriver dans votre code), faites d'abord le test
if [[ "$REPLY" =~ ^[0-9]+$ ]]; then
existing code
else echo "$REPLY is not an integer" >&2 && exit 1; fi
Bien sûr, toutes ces expressions entre parenthèses renvoient 0 (vrai) ou 1 (faux) et peuvent être combinées. Non seulement vous pouvez tout mettre dans le même support, mais vous pouvez aussi le faire
if [[ "$REPLY" =~ ^[0-9]+$ ]] && [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then ...
ou quelque chose de similaire.
Connexes :Dhcpd :un moyen de vérifier l'état du pool DHCP ?