Bash integer comparison

后端 未结 4 1390
半阙折子戏
半阙折子戏 2021-01-01 08:45

I want to write a bash script that checks if there is at least one parameter and if there is one, if that parameter is either a 0 or a 1. this is the script:



        
相关标签:
4条回答
  • 2021-01-01 08:55

    I know this has been answered, but here's mine just because I think case is an under-appreciated tool. (Maybe because people think it is slow, but it's at least as fast as an if, sometimes faster.)

    case "$1" in
        0|1) xinput set-prop 12 "Device Enabled" $1 ;;
          *) echo "This script requires a 1 or 0 as first parameter." ;;
    esac
    
    0 讨论(0)
  • 2021-01-01 09:01

    Easier solution;

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

    Output

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

    Explanation

    • (( )) - Evaluates the expression using integers.
    • ${1:-2} - Uses parameter expansion to set a value of 2 if undefined.
    • >= 2 - True if the integer is greater than or equal to two 2.
    0 讨论(0)
  • 2021-01-01 09:11

    This script works!

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

    But this also works, and in addition keeps the logic of the OP, since the question is about calculations. Here it is with only 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
    

    The output is the same1:

    $ ./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] the second fails if the first argument is a string

    0 讨论(0)
  • 2021-01-01 09:18

    The zeroth parameter of a shell command is the command itself (or sometimes the shell itself). You should be using $1.

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

    Your boolean logic is also a bit confused:

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

    This is probably what you want:

    (( "$#" )) && (( $1 == 1 || $1 == 0 )) # If true, there is at least one argument and its value is 0 or 1
    
    0 讨论(0)
提交回复
热议问题