| #!/bin/dash -x |
| # sh5 |
| # Note that this is special for sh. ksh will be an extra file later. |
| # Note too, that sh and ksh allow ${var:-sub} as well as ${var-sub}! |
| # The ':' is optional! |
| |
| # This all should be OK |
| # Case 0a |
| [ -t 0 ] && date |
| Variable1=value1 |
| Variable2='value2' |
| Variable3="value3" |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 0b |
| [ -t 0 ] && echo "\ndate" |
| Variable1=$HOME |
| Variable2='$HOME' |
| Variable3="$HOME" |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 0c |
| [ -t 0 ] && echo "\ndate" |
| Variable1=$HOME$SHELL |
| Variable2=$HOME.$SHELL |
| Variable3=$HOME.$SHELL+$HOME-$SHELL/$HOME |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 0d |
| [ -t 0 ] && echo "\ndate" |
| Variable1=`date` |
| Variable2=`id -ng` |
| Variable3=`id -ng | wc -c` |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| ################################################################################ |
| # |
| # Case 1a with constants |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:=eng1} |
| Variable2=${VariableA:-eng2} |
| Variable3=${VariableA:?eng3} |
| Variable3=${VariableA:+eng3} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1b with constants in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:='eng1'} |
| Variable2=${VariableA:-'eng2'} |
| Variable3=${VariableA:?'eng3'} |
| Variable3=${VariableA:+'eng3'} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1c with constants in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:="eng1"} |
| Variable2=${VariableA:-"eng2"} |
| Variable3=${VariableA:?"eng3"} |
| Variable3=${VariableA:+"eng3"} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1d: constants but missing colons |
| Variable1=${VariableA=eng1} |
| Variable2=${VariableA-eng2} |
| Variable3=${VariableA?eng3} |
| Variable3=${VariableA+eng3} |
| Variable1=${VariableA='eng1'} |
| Variable2=${VariableA-'eng2'} |
| Variable3=${VariableA?'eng3'} |
| Variable3=${VariableA+'eng3'} |
| Variable1=${VariableA="eng1"} |
| Variable2=${VariableA-"eng2"} |
| Variable3=${VariableA?"eng3"} |
| Variable3=${VariableA+"eng3"} |
| |
| # Case 2a with a variable |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:=$HOME} |
| Variable2=${VariableA:-$HOME} |
| Variable3=${VariableA:?$HOME} |
| Variable3=${VariableA:+$HOME} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2b with a variable in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:='$HOME'} |
| Variable2=${VariableA:-'$HOME'} |
| Variable3=${VariableA:?'$HOME'} |
| Variable3=${VariableA:+'$HOME'} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2c with a variable in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:="$HOME"} |
| Variable2=${VariableA:-"$HOME"} |
| Variable3=${VariableA:?"$HOME"} |
| Variable3=${VariableA:+"$HOME"} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3a with a command substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:=`date`} |
| Variable2=${VariableA:-`date`} |
| Variable3=${VariableA:?`date`} |
| Variable3=${VariableA:+`date`} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3b with a command + option substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:=`id -ng`} |
| Variable2=${VariableA:-`id -ng`} |
| Variable3=${VariableA:?`id -ng`} |
| Variable3=${VariableA:+`id -ng`} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3c with a command + pipe substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:=`id -ng | wc -c`} |
| Variable2=${VariableA:-`id -ng | wc -c`} |
| Variable3=${VariableA:?`id -ng | wc -c`} |
| Variable3=${VariableA:+`id -ng | wc -c`} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| ################################################################################ |
| # |
| # The same with one nestet ${} level |
| # Case 1a with constants |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:=eng1}} |
| Variable2=${VariableA:-${VarB:-eng2}} |
| Variable3=${VariableA:-${VarB:?eng3}} |
| Variable3=${VariableA:-${VarB:+eng3}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1b with constants in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:='eng1'}} |
| Variable2=${VariableA:-${VarB:-'eng2'}} |
| Variable3=${VariableA:-${VarB:?'eng3'}} |
| Variable3=${VariableA:-${VarB:+'eng3'}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1c with constants in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:="eng1"}} |
| Variable2=${VariableA:-${VarB:-"eng2"}} |
| Variable3=${VariableA:-${VarB:?"eng3"}} |
| Variable3=${VariableA:-${VarB:+"eng3"}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2a with a variable |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:=$HOME}} |
| Variable2=${VariableA:-${VarB:-$HOME}} |
| Variable3=${VariableA:-${VarB:?$HOME}} |
| Variable3=${VariableA:-${VarB:+$HOME}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2b with a variable in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:='$HOME'}} |
| Variable2=${VariableA:-${VarB:-'$HOME'}} |
| Variable3=${VariableA:-${VarB:?'$HOME'}} |
| Variable3=${VariableA:-${VarB:+'$HOME'}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2c with a variable in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:="$HOME"}} |
| Variable2=${VariableA:-${VarB:-"$HOME"}} |
| Variable3=${VariableA:-${VarB:?"$HOME"}} |
| Variable3=${VariableA:-${VarB:+"$HOME"}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3a with a command substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:=`date`}} |
| Variable2=${VariableA:-${VarB:-`date`}} |
| Variable3=${VariableA:-${VarB:?`date`}} |
| Variable3=${VariableA:-${VarB:+`date`}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3b with a command + option substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:=`id -ng`}} |
| Variable2=${VariableA:-${VarB:-`id -ng`}} |
| Variable3=${VariableA:-${VarB:?`id -ng`}} |
| Variable3=${VariableA:-${VarB:+`id -ng`}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3c with a command + pipe substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:=`id -ng | wc -c`}} |
| Variable2=${VariableA:-${VarB:-`id -ng | wc -c`}} |
| Variable3=${VariableA:-${VarB:?`id -ng | wc -c`}} |
| Variable3=${VariableA:-${VarB:+`id -ng | wc -c`}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| ################################################################################ |
| # |
| # The same with two nestet ${} level |
| # Case 1a with constants |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:=eng1}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-eng2}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?eng3}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+eng3}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1b with constants in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:='eng1'}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-'eng2'}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?'eng3'}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+'eng3'}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1c with constants in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:="eng1"}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-"eng2"}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?"eng3"}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+"eng3"}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2a with a variable |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:=$HOME}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-$HOME}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?$HOME}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+$HOME}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2b with a variable in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:='$HOME'}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-'$HOME'}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?'$HOME'}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+'$HOME'}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2c with a variable in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:="$HOME"}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-"$HOME"}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?"$HOME"}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?"$HOME"}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+"$HOME"}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3a with a command substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:=`date`}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-`date`}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?`date`}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+`date`}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3b with a command + option substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:=`id -ng`}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-`id -ng`}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?`id -ng`}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+`id -ng`}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3c with a command + pipe substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:=`id -ng | wc -c`}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-`id -ng | wc -c`}}} |
| Variable3=${VariableA:-${VarB:-${VarC:?`id -ng | wc -c`}}} |
| Variable3=${VariableA:-${VarB:-${VarC:+`id -ng | wc -c`}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| |
| ################################################################################ |
| # |
| # The same with three nestet ${} level |
| # Case 1a with constants |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=eng1}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-eng2}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?eng3}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+eng3}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1b with constants in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:='eng1'}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-'eng2'}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?'eng3'}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+'eng3'}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 1c with constants in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:="eng1"}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-"eng2"}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?"eng3"}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+"eng3"}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2a with a variable |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=$HOME}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-$HOME}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?$HOME}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+$HOME}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2b with a variable in single quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:='$HOME'}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-'$HOME'}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?'$HOME'}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+'$HOME'}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 2c with a variable in double quotes |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:="$HOME"}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-"$HOME"}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?"$HOME"}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+"$HOME"}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3a with a command substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=`date`}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-`date`}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?`date`}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+`date`}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3b with a command + option substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=`id -ng`}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-`id -ng`}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?`id -ng`}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+`id -ng`}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| # Case 3c with a command + pipe substitution |
| [ -t 0 ] && echo "\ndate" |
| Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=`id -ng | wc -c`}}}} |
| Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-`id -ng | wc -c`}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?`id -ng | wc -c`}}}} |
| Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+`id -ng | wc -c`}}}} |
| echo "$Variable1" "$Variable2" "$Variable3" |
| |
| |
| ################################################################################ |
| # |
| # This is also allowed: |
| Variable1=${VariableA-${VarB-${VarC-${VarD=`id -ng | wc -c`}}}} |
| |
| ################################################################################ |
| # |
| # All cases with ${Var:?} which works for the sh: |
| Variable4=${Variable4:?} |
| Variable4=${Variable4:?OK} |
| Variable4=${Variable4:?`date`} |
| Variable4=${Variable4:?'an OK string'} |
| Variable4=${Variable4:?"an OK string"} |
| Variable4=${Variable4:?$HOME$SHELL} |
| Variable4=${Variable4:?$HOME:$SHELL} |
| |
| # All cases with ${Var:?} which works also for ksh: |
| Variable4=${Variable4:?This is OK} |
| Variable4=${Variable4:?This is OK, too: `date`} |
| |
| # What happens with ${#identifier[*]}: |
| Variable5=${#identifier[*]} |