diff options
10 files changed, 283 insertions, 23 deletions
diff --git a/shell/ash_test/ash-vars/param_expand_alt.right b/shell/ash_test/ash-vars/param_expand_alt.right new file mode 100644 index 0000000..c733c14 --- /dev/null +++ b/shell/ash_test/ash-vars/param_expand_alt.right @@ -0,0 +1,9 @@ +SHELL: line 1: syntax error: bad substitution +SHELL: line 1: syntax error: bad substitution +_0_ __ +_z_ _z_ +_ _ _ _ _ +_aaaa _ _ _word _word +_ _ _ _ _ +_ _ _ _word _ +_fff _ _ _word _word diff --git a/shell/ash_test/ash-vars/param_expand_alt.tests b/shell/ash_test/ash-vars/param_expand_alt.tests new file mode 100755 index 0000000..c9c4249 --- /dev/null +++ b/shell/ash_test/ash-vars/param_expand_alt.tests @@ -0,0 +1,28 @@ +# First try some invalid patterns. Do in subshell due to parsing error. +# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) +"$THIS_SH" -c 'echo ${+} ; echo moo' SHELL +"$THIS_SH" -c 'echo ${:+} ; echo moo' SHELL + +# now some funky ones. +# ${V+word} "if V unset, then substitute nothing, else substitute word" +# ${V:+word} "if V unset or '', then substitute nothing, else substitute word" +# bash doesn't accept ${#+}. ash prints 0 (not $#). +echo _${#+}_ _${#:+}_ +# Forms with non-empty word work as expected in both ash and bash. +echo _${#+z}_ _${#:+z}_ + +# now some valid ones +set -- +echo _$1 _${1+} _${1:+} _${1+word} _${1:+word} + +set -- aaaa +echo _$1 _${1+} _${1:+} _${1+word} _${1:+word} + +unset f +echo _$f _${f+} _${f:+} _${f+word} _${f:+word} + +f= +echo _$f _${f+} _${f:+} _${f+word} _${f:+word} + +f=fff +echo _$f _${f+} _${f:+} _${f+word} _${f:+word} diff --git a/shell/ash_test/ash-vars/param_expand_assign.right b/shell/ash_test/ash-vars/param_expand_assign.right new file mode 100644 index 0000000..9b07d8c --- /dev/null +++ b/shell/ash_test/ash-vars/param_expand_assign.right @@ -0,0 +1,27 @@ +SHELL: line 1: syntax error: bad substitution +SHELL: line 1: syntax error: bad substitution +0 +0 +SHELL: line 1: 1: bad variable name +SHELL: line 1: 1: bad variable name +SHELL: line 1: 1: bad variable name +SHELL: line 1: 1: bad variable name +_aa +_aa +_aa +_aa +_ +_ +_ +_word +_word +_ +_ +_ +_ +_word +_fff +_fff +_fff +_fff +_fff diff --git a/shell/ash_test/ash-vars/param_expand_assign.tests b/shell/ash_test/ash-vars/param_expand_assign.tests new file mode 100755 index 0000000..79de956 --- /dev/null +++ b/shell/ash_test/ash-vars/param_expand_assign.tests @@ -0,0 +1,39 @@ +# First try some invalid patterns. Do in subshell due to parsing error. +# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) +"$THIS_SH" -c 'echo ${=}' SHELL +"$THIS_SH" -c 'echo ${:=}' SHELL + +# now some funky ones +"$THIS_SH" -c 'echo ${#=}' SHELL +"$THIS_SH" -c 'echo ${#:=}' SHELL + +# should error out +"$THIS_SH" -c 'set --; echo _${1=}' SHELL +"$THIS_SH" -c 'set --; echo _${1:=}' SHELL +"$THIS_SH" -c 'set --; echo _${1=word}' SHELL +"$THIS_SH" -c 'set --; echo _${1:=word}' SHELL + +# should not error +"$THIS_SH" -c 'set aa; echo _${1=}' SHELL +"$THIS_SH" -c 'set aa; echo _${1:=}' SHELL +"$THIS_SH" -c 'set aa; echo _${1=word}' SHELL +"$THIS_SH" -c 'set aa; echo _${1:=word}' SHELL + +# should work fine +unset f; echo _$f +unset f; echo _${f=} +unset f; echo _${f:=} +unset f; echo _${f=word} +unset f; echo _${f:=word} + +f=; echo _$f +f=; echo _${f=} +f=; echo _${f:=} +f=; echo _${f=word} +f=; echo _${f:=word} + +f=fff; echo _$f +f=fff; echo _${f=} +f=fff; echo _${f:=} +f=fff; echo _${f=word} +f=fff; echo _${f:=word} diff --git a/shell/ash_test/ash-vars/param_expand_bash_substring.right b/shell/ash_test/ash-vars/param_expand_bash_substring.right new file mode 100644 index 0000000..9ad6dbc --- /dev/null +++ b/shell/ash_test/ash-vars/param_expand_bash_substring.right @@ -0,0 +1,64 @@ +SHELL: line 1: syntax error: bad substitution +SHELL: line 1: syntax error: bad substitution +SHELL: line 1: syntax error: bad substitution +SHELL: line 1: syntax error: bad substitution +SHELL: line 1: syntax error: missing '}' +1 =|| +1:1 =|| +1:1:2=|| +1::2 =|| +1:1: =|| +1:: =|| +1 =|0123| +1:1 =|123| +1:1:2=|12| +1::2 =|01| +1:1: =|| +1:: =|| +f =|| +f:1 =|| +f:1:2=|| +f::2 =|| +f:1: =|| +f:: =|| +f =|| +f:1 =|| +f:1:2=|| +f::2 =|| +f:1: =|| +f:: =|| +f =|a| +f:1 =|| +f:1:2=|| +f::2 =|a| +f:1: =|| +f:: =|| +f =|0123456789| +f:1 =|123456789| +f:1:2=|12| +f::2 =|01| +f:1: =|| +f:: =|| +Substrings from special vars +? =|0| +?:1 =|| +?:1:2=|| +?::2 =|0| +?:1: =|| +?:: =|| +# =|11| +#:1 =|1| +#:1:2=|1| +#::2 =|11| +#:1: =|| +#:: =|| +Substrings with expressions +f =|01234567| +f:1+1:2+2 =|2345| +f:-1:2+2 =|01234567| +f:1:f =|1234567| +f:1:$f =|1234567| +f:1:${f} =|1234567| +f:1:${f:3:1} =|123| +f:1:1`echo 1`=|1| +Done diff --git a/shell/ash_test/ash-vars/param_expand_bash_substring.tests b/shell/ash_test/ash-vars/param_expand_bash_substring.tests new file mode 100755 index 0000000..cce9f12 --- /dev/null +++ b/shell/ash_test/ash-vars/param_expand_bash_substring.tests @@ -0,0 +1,84 @@ +# first try some invalid patterns +# do all of these in subshells since it's supposed to error out +# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) +export var=0123456789 +"$THIS_SH" -c 'echo ${:}' SHELL +"$THIS_SH" -c 'echo ${::}' SHELL +"$THIS_SH" -c 'echo ${:1}' SHELL +"$THIS_SH" -c 'echo ${::1}' SHELL + +#this also is not valid in bash, hush accepts it: +"$THIS_SH" -c 'echo ${var:}' SHELL + +# then some funky ones +# UNFIXED BUG: this should work: "$THIS_SH" -c 'echo ${?:0}' + +# now some valid ones +set --; echo "1 =|${1}|" +set --; echo "1:1 =|${1:1}|" +set --; echo "1:1:2=|${1:1:2}|" +set --; echo "1::2 =|${1::2}|" +set --; echo "1:1: =|${1:1:}|" +set --; echo "1:: =|${1::}|" + +set -- 0123; echo "1 =|${1}|" +set -- 0123; echo "1:1 =|${1:1}|" +set -- 0123; echo "1:1:2=|${1:1:2}|" +set -- 0123; echo "1::2 =|${1::2}|" +set -- 0123; echo "1:1: =|${1:1:}|" +set -- 0123; echo "1:: =|${1::}|" + +unset f; echo "f =|$f|" +unset f; echo "f:1 =|${f:1}|" +unset f; echo "f:1:2=|${f:1:2}|" +unset f; echo "f::2 =|${f::2}|" +unset f; echo "f:1: =|${f:1:}|" +unset f; echo "f:: =|${f::}|" + +f=; echo "f =|$f|" +f=; echo "f:1 =|${f:1}|" +f=; echo "f:1:2=|${f:1:2}|" +f=; echo "f::2 =|${f::2}|" +f=; echo "f:1: =|${f:1:}|" +f=; echo "f:: =|${f::}|" + +f=a; echo "f =|$f|" +f=a; echo "f:1 =|${f:1}|" +f=a; echo "f:1:2=|${f:1:2}|" +f=a; echo "f::2 =|${f::2}|" +f=a; echo "f:1: =|${f:1:}|" +f=a; echo "f:: =|${f::}|" + +f=0123456789; echo "f =|$f|" +f=0123456789; echo "f:1 =|${f:1}|" +f=0123456789; echo "f:1:2=|${f:1:2}|" +f=0123456789; echo "f::2 =|${f::2}|" +f=0123456789; echo "f:1: =|${f:1:}|" +f=0123456789; echo "f:: =|${f::}|" + +echo "Substrings from special vars" +echo '? '"=|$?|" +echo '?:1 '"=|${?:1}|" +echo '?:1:2'"=|${?:1:2}|" +echo '?::2 '"=|${?::2}|" +echo '?:1: '"=|${?:1:}|" +echo '?:: '"=|${?::}|" +set -- 1 2 3 4 5 6 7 8 9 10 11 +echo '# '"=|$#|" +echo '#:1 '"=|${#:1}|" +echo '#:1:2'"=|${#:1:2}|" +echo '#::2 '"=|${#::2}|" +echo '#:1: '"=|${#:1:}|" +echo '#:: '"=|${#::}|" + +echo "Substrings with expressions" +f=01234567; echo 'f '"=|$f|" +f=01234567; echo 'f:1+1:2+2 '"=|${f:1+1:2+2}|" +f=01234567; echo 'f:-1:2+2 '"=|${f:-1:2+2}|" +f=01234567; echo 'f:1:f '"=|${f:1:f}|" +f=01234567; echo 'f:1:$f '"=|${f:1:$f}|" +f=01234567; echo 'f:1:${f} '"=|${f:1:${f}}|" +f=01234567; echo 'f:1:${f:3:1} '"=|${f:1:${f:3:1}}|" +f=01234567; echo 'f:1:1`echo 1`'"=|${f:1:`echo 1`}|" + +echo Done diff --git a/shell/hush_test/hush-vars/param_expand_alt.right b/shell/hush_test/hush-vars/param_expand_alt.right index 67f18d6..4f9eb29 100644 --- a/shell/hush_test/hush-vars/param_expand_alt.right +++ b/shell/hush_test/hush-vars/param_expand_alt.right @@ -1,6 +1,7 @@ hush: syntax error: unterminated ${name} hush: syntax error: unterminated ${name} __ __ +_z_ _z_ _ _ _ _ _ _aaaa _ _ _word _word _ _ _ _ _ diff --git a/shell/hush_test/hush-vars/param_expand_alt.tests b/shell/hush_test/hush-vars/param_expand_alt.tests index 3b646b1..c9c4249 100755 --- a/shell/hush_test/hush-vars/param_expand_alt.tests +++ b/shell/hush_test/hush-vars/param_expand_alt.tests @@ -1,9 +1,15 @@ -# first try some invalid patterns (do in subshell due to parsing error) -"$THIS_SH" -c 'echo ${+} ; echo moo' -"$THIS_SH" -c 'echo ${:+} ; echo moo' +# First try some invalid patterns. Do in subshell due to parsing error. +# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) +"$THIS_SH" -c 'echo ${+} ; echo moo' SHELL +"$THIS_SH" -c 'echo ${:+} ; echo moo' SHELL -# now some funky ones. (bash doesn't accept ${#+}) +# now some funky ones. +# ${V+word} "if V unset, then substitute nothing, else substitute word" +# ${V:+word} "if V unset or '', then substitute nothing, else substitute word" +# bash doesn't accept ${#+}. ash prints 0 (not $#). echo _${#+}_ _${#:+}_ +# Forms with non-empty word work as expected in both ash and bash. +echo _${#+z}_ _${#:+z}_ # now some valid ones set -- diff --git a/shell/hush_test/hush-vars/param_expand_assign.tests b/shell/hush_test/hush-vars/param_expand_assign.tests index 149cb20..79de956 100755 --- a/shell/hush_test/hush-vars/param_expand_assign.tests +++ b/shell/hush_test/hush-vars/param_expand_assign.tests @@ -1,22 +1,23 @@ -# first try some invalid patterns (do in subshell due to parsing error) -"$THIS_SH" -c 'echo ${=}' -"$THIS_SH" -c 'echo ${:=}' +# First try some invalid patterns. Do in subshell due to parsing error. +# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) +"$THIS_SH" -c 'echo ${=}' SHELL +"$THIS_SH" -c 'echo ${:=}' SHELL # now some funky ones -"$THIS_SH" -c 'echo ${#=}' -"$THIS_SH" -c 'echo ${#:=}' +"$THIS_SH" -c 'echo ${#=}' SHELL +"$THIS_SH" -c 'echo ${#:=}' SHELL # should error out -"$THIS_SH" -c 'set --; echo _${1=}' -"$THIS_SH" -c 'set --; echo _${1:=}' -"$THIS_SH" -c 'set --; echo _${1=word}' -"$THIS_SH" -c 'set --; echo _${1:=word}' +"$THIS_SH" -c 'set --; echo _${1=}' SHELL +"$THIS_SH" -c 'set --; echo _${1:=}' SHELL +"$THIS_SH" -c 'set --; echo _${1=word}' SHELL +"$THIS_SH" -c 'set --; echo _${1:=word}' SHELL # should not error -"$THIS_SH" -c 'set aa; echo _${1=}' -"$THIS_SH" -c 'set aa; echo _${1:=}' -"$THIS_SH" -c 'set aa; echo _${1=word}' -"$THIS_SH" -c 'set aa; echo _${1:=word}' +"$THIS_SH" -c 'set aa; echo _${1=}' SHELL +"$THIS_SH" -c 'set aa; echo _${1:=}' SHELL +"$THIS_SH" -c 'set aa; echo _${1=word}' SHELL +"$THIS_SH" -c 'set aa; echo _${1:=word}' SHELL # should work fine unset f; echo _$f diff --git a/shell/hush_test/hush-vars/param_expand_bash_substring.tests b/shell/hush_test/hush-vars/param_expand_bash_substring.tests index 5c9552d..cce9f12 100755 --- a/shell/hush_test/hush-vars/param_expand_bash_substring.tests +++ b/shell/hush_test/hush-vars/param_expand_bash_substring.tests @@ -1,13 +1,14 @@ # first try some invalid patterns # do all of these in subshells since it's supposed to error out +# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) export var=0123456789 -"$THIS_SH" -c 'echo ${:}' -"$THIS_SH" -c 'echo ${::}' -"$THIS_SH" -c 'echo ${:1}' -"$THIS_SH" -c 'echo ${::1}' +"$THIS_SH" -c 'echo ${:}' SHELL +"$THIS_SH" -c 'echo ${::}' SHELL +"$THIS_SH" -c 'echo ${:1}' SHELL +"$THIS_SH" -c 'echo ${::1}' SHELL -#this also is not valid in bash, but we accept it: -"$THIS_SH" -c 'echo ${var:}' +#this also is not valid in bash, hush accepts it: +"$THIS_SH" -c 'echo ${var:}' SHELL # then some funky ones # UNFIXED BUG: this should work: "$THIS_SH" -c 'echo ${?:0}' |