# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # expect() { echo expect "$@" } tool_var() { eval $1=\"\${$1:-$2}\" export $1 } A="aaa bbb ccc" unset B tool_var B ${B:-"$A"} expect '' recho "$A" expect '' recho "$B" eto_prepend() { eval $1=\'$2\''${'$1':+":"${'$1'}}'; export $1 } foo=bar; export foo eto_prepend foo baz expect '' recho $foo expect '' recho ${foo-"bar"} aa='aaa bbb ccc' expect '' recho ${zzz-"$aa"} expect '' recho ${zzz:-"bar"} expect '' recho "${zzz:-bar}" expect '' recho "${zzz:-"bar"}" var=abcde expect '' recho "${var:-xyz}" expect '' recho "${var:=xyz}" expect '' recho "${var:+xyz}" set 'a b' c d e f expect ' ' recho ${1+"$@"} expect '' recho "${1-"$@"}" expect ' ' recho ${1-"$@"} expect ' ' recho "${1+$@}" expect ' ' recho "${1+"$@"}" HOME=/usr/homes/chet somevar= expect "<$HOME>" recho ${somevar:-~} # This changed after bash-3.0, when the tilde implementation was redone. It's # not backward compatible, but it's very hard to be backward-compatible here, # and I think the old behavior was a bug expect '<~>' recho "${somevar:-~}" expect '<~>' recho "${somevar:-"~"}" expect '<\~>' recho "${somevar:-\~}" expect '<\ \~>' recho "${somevar:-\ \~}" expect '<\ \ \~>' recho "${somevar:-\ \ \~}" expect "<$HOME>" recho ${somevar:-$HOME} expect "<$HOME>" recho "${somevar:-$HOME}" expect "<$HOME>" recho "${somevar:-"$HOME"}" expect '<$HOME>' recho "${somevar:-\$HOME}" expect '<\ $HOME>' recho "${somevar:-\ \$HOME}" expect '<\ \ $HOME>' recho "${somevar:-\ \ \$HOME}" foo=bar expect "<'bar'>" recho "${foo+'$foo'}" expect "<'bar'>" recho "${fox='$foo'}" P='*@*' expect '<*@>' recho "${P%"*"}" expect '<*@>' recho "${P%'*'}" expect '<*@>' recho ${P%"*"} expect '<*@>' recho ${P%'*'} expect '<*@*>' recho ${P%""} expect '<*@*>' recho ${P#""} expect '<*@*>' recho ${P#"$foobar"} expect '<*@*>' recho ${P%"$foobar"} s1=abcdefghijkl s2=efgh first=${s1/$s2*/} expect '' recho $first last=${s1##$first} expect '' recho $last shift $# UNAME_RELEASE=${1:-4.2MP} RELEASE=`expr "$UNAME_RELEASE" : '[^0-9]*\([0-9]*\)'` # 4 case "$RELEASE" in "") RELEASE=0 ;; *) RELEASE=`expr "$RELEASE" + 0` ;; esac REL_LEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.\([0-9]*\)'` # 1 REL_SUBLEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2 expect '<4> <2>' recho $RELEASE $REL_LEVEL $REL_SUBLEVEL b1() { b2 ${1+"$@"} } b2() { recho $* recho ${#} } expect '<1>' b1 '' expect ' <2>' b1 bar '' expect ' <2>' b1 '' bar expect '<4>' b1 '' '' '' '' NL="\\ " NNL="+$NL+" expect '<--\> <-->' recho --$NL-- expect '<--\^J-->' recho "--$NL--" expect '<--+\> <+-->' recho --$NNL-- expect '<--+\^J+-->' recho "--$NNL--" expect '<-+\> <+-\> <->' recho -$NNL-$NL- set '' expect '' recho "$*xy" expect '' recho "x$*y" expect '' recho "xy$*" expect '' recho x"$*"y expect '' recho xy"$*" expect '' recho "$*"xy expect '<>' recho "$*" expect nothing recho $* unset undef ; set "" expect '<>' recho ${undef-"$*"} expect '' recho ${undef-"x$*y"} expect '' recho ${undef-"$*xy"} expect '' recho ${undef-"xy$*"} expect '' recho ${undef-x"$*"y} expect '' recho ${undef-xy"$*"} expect '' recho ${undef-"$*"xy} expect '<>' recho "${undef-$*}" expect nothing recho ${undef-$*} expect '<>' recho ${undef-"$zzz"} expect '' recho x${undef-"$zzz"} expect '' recho x${undef-"$@"} expect nothing recho ${undef-"$@"} expect '' recho ${undef-"$zzz"}x expect '' recho ${undef-"$@"}x expect '' recho "$@"x expect '' recho "$zzz"x expect '<^?>' recho ${undef-} expect '<^?>' recho ${undef-""} yyy="" recho "$xxx"x recho "$yyy"x set "" "abd" "" recho "$@"x recho "$@"$xxx OIFS="$IFS" arg=a,b,c,d,e,f IFS=, export z=$arg eval z1=\"$arg\" IFS="$OIFS" recho $z recho $z1 # should give an error abc\=def zz="a b c d e" declare a=$zz recho "$a" recho $a recho $(echo "foo$(echo ")")") # test backslash escapes recho \a recho \\a recho "\a" recho "\\a" recho '\a' recho '\\a' recho $(zecho \a) recho $(zecho \\a) recho $(zecho "\a") recho $(zecho "\\a") recho $(zecho '\a') recho $(zecho '\\a') recho `zecho \a` recho `zecho \\a` recho `zecho "\a"` recho `zecho "\\a"` recho `zecho '\a'` recho `zecho '\\a'` a=foo recho \$a recho \\$a recho "\$a" recho "\\$a" recho '\$a' recho '\\$a' recho $(zecho `zecho \a`) recho $(zecho `zecho \\a`) recho $(zecho `zecho "\a"`) recho $(zecho `zecho "\\a"`) recho $(zecho `zecho '\a'`) recho $(zecho `zecho '\\a'`) # should echo G { I K } recho ${abc:-G { I } K } abc=hi # should echo hi K } recho ${abc:-G { I } K } # should echo a* unset foo recho "${foo:-"a"}*" f () { echo "Number of args: $#" echo "<\${*-x}>: <${*-x}>" echo "<\${@-x}>: <${@-x}>" } f f '' f '' '' set 1 2 3 4 5 expect '<5>' recho ${#} expect '<5>' recho ${#:foo} expect '<5>' recho ${#:-foo} expect '<5>' recho ${#-posparams} expect '<5>' recho ${#:-posparams} expect '<0>' recho ${#!} expect nothing recho $! expect nothing recho ${!} expect nothing recho $8 expect nothing recho ${8} shift $# expect '<0>' recho ${#} expect '<0>' recho ${#:foo} expect '<0>' recho ${#:-foo} expect '<0>' recho ${#-posparams} expect '<0>' recho ${#:-posparams} expect '' recho ${!-posparams} expect '' recho ${!:-posparams} expect '<2>' recho ${#-} expect '<0>' recho ${#-posparams} expect '<0>' recho ${#?:-xyz} expect '<1>' recho ${#?} set a b c d e expect '<5>' recho ${#} expect '<5>' recho ${#?:-xyz} shift ${#} expect '<0>' recho ${#:-foo} expect a bad substitution error recho ${#:} expect a bad substitution error recho ${#/} expect a bad substitution error recho ${#%} expect a bad substitution error recho ${#=} expect a bad substitution error recho ${#+} expect a bad substitution error recho ${#1xyz} expect a math syntax error recho ${#:%} expect '<0>' recho ${#:-} set -- unset a b x=a y=b IFS=+ expect '' recho $x+$y expect '<+>' recho $a+$b expect '<+>' recho + "$@" expect '<+>' recho +"$@" # variants of nested curly braces inside ${...} expressions # IFS is not the standard one expect '' '' '<}>' recho ${gik:-G { I } K } abc=hi expect '' '' '<}>' recho ${abc:-G { I } K } # reset IFS to the default IFS=' ' # nested ${...} inside ${...} are handled specially unset XXX FOO BAR expect '' '' XXX=xxx FOO=${BAR:-${XXX} yyy} recho $FOO # this was a bug in versions of bash prior to bash-2.04-release set -- '' expect 1 echo $# expect '<>' recho "${@}" expect '<>' recho "${@-}" expect '<>' recho "${@:-}" # this was a bug in bash-2.04, fixed in 2.05 set -- a b expect '<:a:>' '<:b:>' for i in "${@-}"; do recho :$i:; done # I believe that ksh93 does these wrong -- we're using the rhs, so shouldn't # it behave the same as ""? set -- expect '<>' recho "${@-}" expect '<>' recho "${@:-}"