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