Search code examples
stringbashshdash-shellparameter-expansion

/bin/dash: Bad substitution


I need to do a string manipuilation in shell script (/bin/dash):

#!/bin/sh

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}

the last echo fails with Bad substitution. When I change shell to bash, it works:

#!/bin/bash

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}

How can I implement the string substitution in dash ?


Solution

  • Using parameter expansion:

    $ cat foo.sh
    #!/bin/sh
    
    PORT="-p7777"
    echo $PORT
    echo ${PORT:+-P${PORT#-p}}
    
    PORT=""
    echo $PORT
    echo ${PORT:+-P${PORT#-p}}
    

    Run it:

    $ /bin/sh foo.sh
    -p7777
    -P7777
    

    Update:

    $ man dash:
    - - 
    ${parameter#word}     Remove Smallest Prefix Pattern.
    
    $ echo ${PORT#-p}
    7777
    
    $ man dash
    - - 
    ${parameter:+word}    Use Alternative Value.
    
    $ echo ${PORT:+-P${PORT#-p}}
    -P7777