Comparaison des entiers Bash

Je veux écrire un script bash qui vérifie s'il existe au moins un paramètre et si il y en a un, si ce paramètre est 0 ou un 1. c'est le script:

#/bin/bash
if (("$#" < 1)) && ( (("$0" != 1)) ||  (("$0" -ne 0q)) ) ; then
echo this script requires a 1 or 0 as first parameter.
fi
xinput set-prop 12 "Device Enabled" $0

Cela donne les erreurs suivantes:

./setTouchpadEnabled: line 2: ((: ./setTouchpadEnabled != 1: syntax error: operand expected (error token is "./setTouchpadEnabled != 1")
./setTouchpadEnabled: line 2: ((: ./setTouchpadEnabled -ne 0q: syntax error: operand expected (error token is "./setTouchpadEnabled -ne 0q")

Ce que je fais mal?

39
demandé sur Wilfred Hughes 2013-01-25 01:39:40

4 réponses

Ce script fonctionne!

#/bin/bash
if [[ ( "$#" < 1 ) || ( !( "$1" == 1 ) && !( "$1" == 0 ) ) ]] ; then
    echo this script requires a 1 or 0 as first parameter.
else
    echo "first parameter is $1"
    xinput set-prop 12 "Device Enabled" $0
fi

Mais cela fonctionne aussi, et en plus garde la logique de L'OP, puisque la question concerne les calculs. Ici, il est avec seulement expressions arithmétiques:

#/bin/bash
if (( $# )) && (( $1 == 0 || $1 == 1 )); then
    echo "first parameter is $1"
    xinput set-prop 12 "Device Enabled" $0
else
    echo this script requires a 1 or 0 as first parameter.
fi

Le résultat est Le même1:

$ ./tmp.sh 
this script requires a 1 or 0 as first parameter.

$ ./tmp.sh 0
first parameter is 0

$ ./tmp.sh 1
first parameter is 1

$ ./tmp.sh 2
this script requires a 1 or 0 as first parameter.

[1] la seconde échoue si le premier argument est une chaîne de caractères

35
répondu user000001 2017-11-13 17:16:17

Solution plus facile;

#/bin/bash
if (( ${1:-2} >= 2 )); then
    echo "First parameter must be 0 or 1"
fi
# rest of script...

Sortie

$ ./test 
First parameter must be 0 or 1
$ ./test 0
$ ./test 1
$ ./test 4
First parameter must be 0 or 1
$ ./test 2
First parameter must be 0 or 1

Explication

  • (( )) - évalue l'expression en utilisant des entiers.
  • ${1:-2} - utilise l'expansion des paramètres pour définir une valeur de {[4] } si elle n'est pas définie.
  • >= 2 - True si l'entier est supérieur ou égal à deux 2.
10
répondu koola 2013-01-25 05:10:23

Le paramètre zeroth d'une commande shell est la commande elle-même (ou parfois le shell lui-même). Vous devriez utiliser $1.

(("$#" < 1)) && ( (("$1" != 1)) ||  (("$1" -ne 0q)) )

Votre logique booléenne est aussi un peu confus:

(( "$#" < 1 && # If the number of arguments is less than one…
  "$1" != 1 || "$1" -ne 0)) # …how can the first argument possibly be 1 or 0?

C'est probablement ce que vous voulez:

(( "$#" )) && (( $1 == 1 || $1 == 0 )) # If true, there is at least one argument and its value is 0 or 1
6
répondu kojiro 2013-01-24 21:59:46

Je sais que cela a été répondu, Mais voici le mien juste parce que je pense que case est un outil sous-apprécié. (Peut-être parce que les gens pensent qu'il est lent, mais c'est au moins aussi rapide qu'un si, parfois plus rapide.)

case "$1" in
    0|1) xinput set-prop 12 "Device Enabled" $1 ;;
      *) echo "This script requires a 1 or 0 as first parameter." ;;
esac
4
répondu William 2013-01-25 15:03:30