Comparaison Bash integer

Je veux écrire un script bash qui vérifie s’il y a au moins un paramètre et s’il y en a un, si ce paramètre est un 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") 

Qu’est-ce que je fais mal?

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 également et, en outre, conserve la logique de l'OP, puisque la question concerne les calculs. Ici c'est seulement avec des 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ême 1 :

 $ ./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] le second échoue si le premier argument est une chaîne

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 à l’aide d’entiers.
  • ${1:-2} – Utilise l’extension de paramètre pour définir la valeur 2 si elle n’est pas définie.
  • >= 2 – Vrai si le nombre entier est supérieur ou égal à deux 2 .

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 également un peu confuse:

 (( "$#" < 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 

Je sais que cela a été répondu, mais voici le mien juste parce que je pense que le cas est un outil sous-estimé. (Peut-être parce que les gens pensent que c’est lent, mais au moins aussi vite qu’un if, 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