Подтвердить что ты не робот

Bash целочисленное сравнение

Я хочу написать bash script, который проверяет, есть ли хотя бы один параметр, и если он есть, если этот параметр является либо 0, либо 1. это 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

Это приводит к следующим ошибкам:

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

Что я делаю неправильно?

4b9b3361

Ответ 1

Этот script работает!

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

Но это также работает, и, кроме того, сохраняет логику OP, поскольку вопрос касается расчетов. Здесь только арифметические выражения:

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

Выход такой же 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] второй сбой, если первым аргументом является строка

Ответ 2

Упрощенное решение;

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

Выход

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

Объяснение

  • (( )) - оценивает выражение с использованием целых чисел.
  • ${1:-2} - Использует расширение параметра, чтобы установить значение 2, если undefined.
  • >= 2 - Истинно, если целое число больше или равно двум 2.

Ответ 3

Нулевой параметр команды оболочки - это сама команда (или иногда сама оболочка). Вы должны использовать $1.

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

Ваша логическая логика также немного запутана:

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

Это, вероятно, то, что вы хотите:

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

Ответ 4

Я знаю, что на это был дан ответ, но здесь мой только потому, что я считаю, что это недооцененный инструмент. (Может быть, потому, что люди думают, что это медленно, но это по крайней мере так же быстро, как если бы, иногда быстрее.)

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