freebsd-dev/tools/regression/bin/sh/expansion/tilde2.0
Jilles Tjoelker 634e9188af sh: Do tilde expansion in substitutions.
This applies to word in ${v-word}, ${v+word}, ${v=word}, ${v?word} (which
inherits quoting from the outside) and in ${v%word}, ${v%%word}, ${v#word},
${v##word} (which does not inherit any quoting).

In all cases tilde expansion is only attempted at the start of word, even if
word contains spaces. This agrees with POSIX and other shells.

This is the last part of the patch tested in the exp-run.

Exp-run done by: erwin (with some other sh(1) changes)
2010-04-03 22:04:44 +00:00

91 lines
1.7 KiB
Plaintext

# $FreeBSD$
HOME=/tmp
roothome=~root
if [ "$roothome" = "~root" ]; then
echo "~root is not expanded!"
exit 2
fi
testcase() {
code="$1"
expected="$2"
oIFS="$IFS"
eval "$code"
IFS='|'
result="$#|$*"
IFS="$oIFS"
if [ "x$result" = "x$expected" ]; then
ok=x$ok
else
failures=x$failures
echo "For $code, expected $expected actual $result"
fi
}
testcase 'set -- ${$+~}' '1|/tmp'
testcase 'set -- ${$+~/}' '1|/tmp/'
testcase 'set -- ${$+~/foo}' '1|/tmp/foo'
testcase 'set -- ${$+x~}' '1|x~'
testcase 'set -- ${$+~root}' "1|$roothome"
testcase 'set -- ${$+"~"}' '1|~'
testcase 'set -- ${$+"~/"}' '1|~/'
testcase 'set -- ${$+"~/foo"}' '1|~/foo'
testcase 'set -- ${$+"x~"}' '1|x~'
testcase 'set -- ${$+"~root"}' "1|~root"
testcase 'set -- "${$+~}"' '1|~'
testcase 'set -- "${$+~/}"' '1|~/'
testcase 'set -- "${$+~/foo}"' '1|~/foo'
testcase 'set -- "${$+x~}"' '1|x~'
testcase 'set -- "${$+~root}"' "1|~root"
testcase 'set -- ${HOME#~}' '0|'
h=~
testcase 'set -- "$h"' '1|/tmp'
f=~/foo
testcase 'set -- "$f"' '1|/tmp/foo'
testcase 'set -- ${f#~}' '1|/foo'
testcase 'set -- ${f#~/}' '1|foo'
ooIFS=$IFS
IFS=m
testcase 'set -- ${$+~}' '1|/tmp'
testcase 'set -- ${$+~/foo}' '1|/tmp/foo'
testcase 'set -- ${$+$h}' '2|/t|p'
testcase 'set -- ${HOME#~}' '0|'
IFS=$ooIFS
t=\~
testcase 'set -- ${$+$t}' '1|~'
r=$(cat <<EOF
${HOME#~}
EOF
)
testcase 'set -- $r' '0|'
r=$(cat <<EOF
${HOME#'~'}
EOF
)
testcase 'set -- $r' '1|/tmp'
r=$(cat <<EOF
${t#'~'}
EOF
)
testcase 'set -- $r' '0|'
r=$(cat <<EOF
${roothome#~root}
EOF
)
testcase 'set -- $r' '0|'
r=$(cat <<EOF
${f#~}
EOF
)
testcase 'set -- $r' '1|/foo'
r=$(cat <<EOF
${f#~/}
EOF
)
testcase 'set -- $r' '1|foo'
test "x$failures" = x