bash assign default value

前端 未结 4 1677
一生所求
一生所求 2020-12-22 16:55

${parameter:=word} Assign Default Values. If parameter is unset or null, the expansion of word is assigned to parameter. The value of pa

相关标签:
4条回答
  • 2020-12-22 17:36

    You can also use := construct to assign and decide on action in one step. Consider following example:

    # Example of setting default server and reporting it's status
    
    server=$1
    if [[ ${server:=localhost} =~ [a-z] ]]      # 'localhost' assigned here to $server
    then    echo "server is localhost"          # echo is triggered since letters were found in $server
    else
            echo "server was set" # numbers were passed
    fi
    

    If $1 is not empty, localhost will be assigned to server in the if condition field, trigger match and report match result. In this way you can assign on the fly and trigger appropriate action.

    0 讨论(0)
  • 2020-12-22 17:41

    Please look at http://www.tldp.org/LDP/abs/html/parameter-substitution.html for examples

    ${parameter-default}, ${parameter:-default}
    

    If parameter not set, use default. After the call, parameter is still not set.
    Both forms are almost equivalent. The extra : makes a difference only when parameter has been declared, but is null.

    unset EGGS
    echo 1 ${EGGS-spam}   # 1 spam
    echo 2 ${EGGS:-spam}  # 2 spam
    
    EGGS=
    echo 3 ${EGGS-spam}   # 3
    echo 4 ${EGGS:-spam}  # 4 spam
    
    EGGS=cheese
    echo 5 ${EGGS-spam}   # 5 cheese
    echo 6 ${EGGS:-spam}  # 6 cheese
    

    ${parameter=default}, ${parameter:=default}
    

    If parameter not set, set parameter value to default.
    Both forms nearly equivalent. The : makes a difference only when parameter has been declared and is null

    # sets variable without needing to reassign
    # colons suppress attempting to run the string
    unset EGGS
    : ${EGGS=spam}
    echo 1 $EGGS     # 1 spam
    unset EGGS
    : ${EGGS:=spam}
    echo 2 $EGGS     # 2 spam
    
    EGGS=
    : ${EGGS=spam}
    echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
    EGGS=
    : ${EGGS:=spam}
    echo 4 $EGGS     # 4 spam
    
    EGGS=cheese
    : ${EGGS:=spam}
    echo 5 $EGGS     # 5 cheese
    EGGS=cheese
    : ${EGGS=spam}
    echo 6 $EGGS     # 6 cheese
    

    ${parameter+alt_value}, ${parameter:+alt_value}
    

    If parameter set, use alt_value, else use null string. After the call, parameter value not changed.
    Both forms nearly equivalent. The : makes a difference only when parameter has been declared and is null

    unset EGGS
    echo 1 ${EGGS+spam}  # 1
    echo 2 ${EGGS:+spam} # 2
    
    EGGS=
    echo 3 ${EGGS+spam}  # 3 spam
    echo 4 ${EGGS:+spam} # 4
    
    EGGS=cheese
    echo 5 ${EGGS+spam}  # 5 spam
    echo 6 ${EGGS:+spam} # 6 spam
    
    0 讨论(0)
  • 2020-12-22 17:44

    Use a colon:

    : ${A:=hello}
    

    The colon is a null command that does nothing and ignores its arguments. It is built into bash so a new process is not created.

    0 讨论(0)
  • 2020-12-22 17:44

    The default value parameter expansion is often useful in build scripts like the example one below. If the user just calls the script as-is, perl will not be built in. The user has to explicitly set WITH_PERL to a value other than "no" to have it built in.

    $ cat defvar.sh
    #!/bin/bash
    
    WITH_PERL=${WITH_PERL:-no}
    
    if [[ "$WITH_PERL" != no ]]; then
        echo "building with perl"
        # ./configure --enable=perl
    else
        echo "not building with perl"
        # ./configure
    fi
    

    Build without Perl

    $ ./defvar.sh
    not building with perl
    

    Build with Perl

    $ WITH_PERL=yes ./defvar.sh
    building with perl
    
    0 讨论(0)
提交回复
热议问题