2013-01-24 10 views
32

Chcę napisać skrypt bash, który sprawdza, czy istnieje co najmniej jeden parametr, a jeśli istnieje, jeśli parametr jest albo 0 albo 1. to skrypt:Bash porównanie całkowitą

#/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 

To daje następujące błędy:

./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") 

Co robię źle?

+0

Wygląda używasz skryptu przy użyciu 'sh./SetTouchpadEnabled' zamiast używać bash. – jordanm

+0

@jordanm mówisz o braku huku w linii shebang? – Kev

Odpowiedz

32

Ten skrypt działa!

#/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 

Ale to również działa, a ponadto utrzymuje logikę PO, ponieważ pytanie dotyczy obliczeń. Tu jest tylko arithmetic expressions:

#/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 

wyjście jest takie samo :

$ ./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] drugi nie działa, jeśli pierwszy argument jest ciągiem

+0

Dziękuję bardzo, błąd ponieważ polecenie jest Xinput, a nie wejście – Cheiron

+0

Jakiś szczególny powód, dla którego nie trzymałeś się wyrażeń arytmetycznych używanych również w pytaniu? To znaczy. użycie '((' 'i')) '. – 0xC0000022L

+1

@ user828193: jasne jest, że chodzi o obliczenia, więc wyrażeń arytmetycznych * jest * droga do zrobienia. Dlatego właśnie irytujące było to, że zmieniłeś ten aspekt pytania w swojej odpowiedzi. – 0xC0000022L

5

Parametrem zerowym polecenia powłoki jest samo polecenie (lub czasami sama powłoka). Powinieneś używać $1.

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

Twój logiczna logika jest również nieco mylić:

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

To jest chyba to, co chcesz:

(("$#")) && (($1 == 1 || $1 == 0)) # If true, there is at least one argument and its value is 0 or 1 
+0

To jest poprawa, dziękuję. Nadal jednak daje mi błędy: ./setTouchpadEnabled: linia 2: ((!: 1: błąd składni: oczekiwany argument operacji (błąd to "! = 1") ./setTouchpadEnabled: wiersz 2: ((:! = 0: błąd składniowy: oczekiwany operand (błąd token "! = 0") – Cheiron

+1

Cytaty nie są bezwzględnie konieczne w '(())', ale sprawiają, że podświetlenie StackOverflow jest bardziej inteligentne – kojiro

+0

Usunięcie cudzysłowu daje ten sam błąd, niestety – Cheiron

10

Łatwiejsze rozwiązanie;

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

Wyjście

$ ./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 

Wyjaśnienie

  • (()) - oblicza wyrażenie za pomocą liczb całkowitych.
  • ${1:-2} - Używa rozszerzenia parametru do ustawienia wartości 2, jeśli jest niezdefiniowana.
  • >= 2 - Prawda, jeśli liczba całkowita jest większa lub równa dwóm 2.
4

Wiem, że odpowiedź została udzielona, ​​ale moja jest tylko dlatego, że myślę, że przypadek jest niedocenianym narzędziem. (Może dlatego, że ludzie myślą, że jest powolna, ale to co najmniej tak szybko jak if, czasami szybciej.)

case "$1" in 
    0|1) xinput set-prop 12 "Device Enabled" $1 ;; 
     *) echo "This script requires a 1 or 0 as first parameter." ;; 
esac