49

少なくとも1つのパラメーターがあるかどうか、およびパラメーターが0か1かどうかをチェックするBashスクリプトを作成したいと思います。

これはスクリプトです:

#/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]最初の引数が文字列の場合、2番目は失敗します

于 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}-パラメータ展開を使用して2、未定義の場合の値を設定します。
  • >= 2-整数が2以上の場合はtrue 2
于 2013-01-25T05:10:23.077 に答える
9

シェルコマンドの0番目のパラメーターは、コマンド自体(またはシェル自体)です。を使用する必要があります$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 に答える