04407e522b
Fixes the interaction between if/then/else/fi syntax and variables. I planned to do it right from the beginning, but my implementation was buggy. Also adds the relevant test cases. Also adds some old Matt Kraai variable test cases that got left out somehow.
90 lines
1.9 KiB
Plaintext
90 lines
1.9 KiB
Plaintext
# try running this with bash, ksh, ash, and hush.
|
|
|
|
# simple quoting rules.
|
|
echo a b
|
|
echo "a b"
|
|
echo a "" b
|
|
echo a '' b
|
|
echo hello?
|
|
echo "hello?"
|
|
echo t* hello
|
|
echo t\* hello
|
|
|
|
# quick and painless exit for lash
|
|
if false; then true; exit; fi
|
|
|
|
# fairly simple command substitution
|
|
echo `echo -e foo\\\necho bar`
|
|
|
|
echo THIS IS A TEST >foo
|
|
cat $(echo FOO | tr 'A-Z' 'a-z')
|
|
cat foo | tr 'A-Z' 'a-z'
|
|
cat $(echo FOO | tr 'A-Z' 'a-z') | tr 'A-Z' 'a-z'
|
|
|
|
cat foo | if true; then tr 'A-Z' 'a-z'; else echo bar1; fi
|
|
cat foo | if false; then tr 'A-Z' 'a-z'; else echo bar2; fi
|
|
if true; then tr 'A-Z' 'a-z'; else echo bar3; fi <foo
|
|
if false; then tr 'A-Z' 'a-z'; else echo bar4; fi <foo
|
|
if true || false; then echo foo; else echo bar5; fi
|
|
if true && false; then echo bar6; else echo foo; fi
|
|
|
|
# basic distinction between local and env variables
|
|
unset FOO
|
|
FOO=bar env | grep FOO
|
|
echo "but not here: $FOO"
|
|
FOO=bar
|
|
env | grep FOO
|
|
echo "yes, here: $FOO"
|
|
FOO=
|
|
echo a $FOO b
|
|
echo "a $FOO b"
|
|
|
|
# not quite so basic variables. Credit to Matt Kraai.
|
|
unset FOO
|
|
FOO=bar
|
|
export FOO
|
|
env | grep FOO
|
|
unset FOO
|
|
export FOO=bar
|
|
FOO=baz
|
|
env | grep FOO
|
|
|
|
# interaction between environment variables and if/then and subshells
|
|
FOO=default
|
|
if true; then FOO=new; fi
|
|
echo $FOO
|
|
FOO=default
|
|
(FOO=bogus)
|
|
echo $FOO
|
|
|
|
# make sure we can duplicate file descriptors properly
|
|
echo replacement >foo 2>&1
|
|
cat foo
|
|
cat doesnt_exist >foo 2>&1
|
|
tr 'a-z' 'A-Z' <foo
|
|
|
|
# fairly simple example of hush expanding variables too early
|
|
unset TMP
|
|
rm -f fish
|
|
TMP=fish && >$TMP
|
|
ls fish
|
|
|
|
# ash, lash, and hush do not create fish; bash and ksh do.
|
|
# Thanks to Tapani Tarvainen <tt@mit.jyu.fi> for this stress test.
|
|
unset TMP
|
|
rm -f fish
|
|
TMP=fish >$TMP
|
|
ls fish
|
|
|
|
# The following example shows that hush's parser is
|
|
# not _really_ Bourne compatible
|
|
echo "echo Hello World" >"a=b"
|
|
unset a
|
|
chmod a+x "a=b"
|
|
PATH=$PATH:.
|
|
"a=b"
|
|
echo $a
|
|
|
|
# assuming the shell wasn't too buggy, clean up the mess
|
|
rm -f a=b fish foo
|