GNU/Linux >> Tutoriels Linux >  >> Linux

Vérifier si $reply est dans une plage de nombres ?

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

-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 ?
Linux
  1. Comment vérifier la version de Redhat

  2. Comment vérifier le fuseau horaire sous Linux

  3. Vérifier la base de données pour la corruption

  4. Déplacer une série de fichiers numérotés ?

  5. additionner tous les nombres de du

Expression de séquence bash (plage)

Comment vérifier la version Java

Vérifier le fuseau horaire sous Linux

Comment vérifier la version d'OpenGL ?

Vérifier l'état de Rackspace Cloud

correcteur orthographique dans Rstudio