49

我想编写一个 Bash 脚本来检查是否至少有一个参数,如果有,该参数是 0 还是 1。

这是脚本:

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

我究竟做错了什么?

4

4 回答 4

50

这个脚本有效!

#/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] 如果第一个参数是字符串,则第二个失败

于 2013-01-24T22:05:52.620 回答
16

更简单的解决方案;

#/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}- 使用参数扩展来设置2if undefined 的值。
  • >= 2- 如果整数大于或等于二,则为真2
于 2013-01-25T05:10:23.077 回答
9

shell 命令的第零个参数是命令本身(或有时是 shell 本身)。你应该使用$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
于 2013-01-24T21:42:04.917 回答
7

我知道这已经得到解答,但这是我的,因为我认为案例是一个未被充分重视的工具。(也许是因为人们认为它很慢,但它至少和 if 一样快,有时更快。)

case "$1" in
    0|1) xinput set-prop 12 "Device Enabled" $1 ;;
      *) echo "This script requires a 1 or 0 as first parameter." ;;
esac
于 2013-01-25T15:03:30.390 回答