diff options
author | Denys Vlasenko | 2010-09-06 10:26:37 +0200 |
---|---|---|
committer | Denys Vlasenko | 2010-09-06 10:26:37 +0200 |
commit | c49d2d97939d77be3d1f3bbbbf9db30a55771c15 (patch) | |
tree | 8cf0a9ad8fd7e0d9762684fef0a7a5a4f7d43859 /shell/hush_test | |
parent | d383b49aefecea99e5bfb2f9eb2956f1c6c013e1 (diff) | |
download | busybox-c49d2d97939d77be3d1f3bbbbf9db30a55771c15.zip busybox-c49d2d97939d77be3d1f3bbbbf9db30a55771c15.tar.gz |
hush: fix globbing+backslashes in unquoted $var expansion
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'shell/hush_test')
-rw-r--r-- | shell/hush_test/hush-glob/glob2.right | 18 | ||||
-rwxr-xr-x | shell/hush_test/hush-glob/glob2.tests | 27 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var_bash4.right | 25 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_bash4.tests | 52 |
4 files changed, 109 insertions, 13 deletions
diff --git a/shell/hush_test/hush-glob/glob2.right b/shell/hush_test/hush-glob/glob2.right new file mode 100644 index 0000000..7a70c22 --- /dev/null +++ b/shell/hush_test/hush-glob/glob2.right @@ -0,0 +1,18 @@ +Expected Actual +Z\* : Z\* +Z* : Z* +Z\f : Z\f +Z\* : Z\* + +Z\z : Z\z +Zz : Zz +Z\z : Z\z +Z\z : Z\z + +Z\ : Z\ +Z\ : Z\ + +Z\f Zf : Z\f Zf +Z\f Zf : Z\f Zf + +Done: 0 diff --git a/shell/hush_test/hush-glob/glob2.tests b/shell/hush_test/hush-glob/glob2.tests new file mode 100755 index 0000000..4dbc925 --- /dev/null +++ b/shell/hush_test/hush-glob/glob2.tests @@ -0,0 +1,27 @@ +# This test demonstrates that in unquoted $v, backslashes expand by this rule: +# \z -> \\\z; \<eol> -> \\<eol> (for any z, special or not), +# and subsequently globbing converts \\ to \ and treats \z as literal z +# even if it is a special char. + +>'Zf' +>'Z\f' + echo 'Expected' 'Actual' +v='\*'; echo 'Z\* :' Z$v + echo 'Z* :' Z\* + echo 'Z\f :' Z\\* + echo 'Z\* :' Z\\\* # NB! only this matches Z$v output +echo +v='\z'; echo 'Z\z :' Z$v + echo 'Zz :' Z\z + echo 'Z\z :' Z\\z + echo 'Z\z :' Z\\\z +echo +v='\'; echo 'Z\ :' Z$v + echo 'Z\ :' Z\\ +echo +v='*'; echo 'Z\f Zf :' Z$v + echo 'Z\f Zf :' Z* +echo + +rm 'Z\f' 'Zf' +echo Done: $? diff --git a/shell/hush_test/hush-vars/var_bash4.right b/shell/hush_test/hush-vars/var_bash4.right index 600e853..0ef1bf6 100644 --- a/shell/hush_test/hush-vars/var_bash4.right +++ b/shell/hush_test/hush-vars/var_bash4.right @@ -1,23 +1,40 @@ Source: a*b\*c Replace str: _\\_\z_ Pattern: single backslash and star: "replace literal star" -In assignment: a_\_z_b\*c Unquoted: a_\_z_b\*c +Unquoted =: a_\_z_b\*c Quoted: a_\_\z_b\*c +Quoted =: a_\_\z_b\*c Pattern: double backslash and star: "replace backslash and everything after it" -In assignment: a*b_\_z_ Unquoted: a*b_\_z_ +Unquoted =: a*b_\_z_ Quoted: a*b_\_\z_ +Quoted =: a*b_\_\z_ Source: a\bc Replace str: _\\_\z_ Pattern: single backslash and b: "replace b" -In assignment: a\_\_z_c Unquoted: a\_\_z_c +Unquoted =: a\_\_z_c Quoted: a\_\_\z_c +Quoted =: a\_\_\z_c Pattern: double backslash and b: "replace backslash and b" -In assignment: a_\_z_c Unquoted: a_\_z_c +Unquoted =: a_\_z_c Quoted: a_\_\z_c +Quoted =: a_\_\z_c + +Source: a\bc +Replace str: _\\_\z_ (as variable $s) +Pattern: single backslash and b: "replace b" +Unquoted: a\_\\_\z_c +Unquoted =: a\_\\_\z_c +Quoted: a\_\\_\z_c +Quoted =: a\_\\_\z_c +Pattern: double backslash and b: "replace backslash and b" +Unquoted: a_\\_\z_c +Unquoted =: a_\\_\z_c +Quoted: a_\\_\z_c +Quoted =: a_\\_\z_c Done: 0 diff --git a/shell/hush_test/hush-vars/var_bash4.tests b/shell/hush_test/hush-vars/var_bash4.tests index d547061..32aa2b3 100755 --- a/shell/hush_test/hush-vars/var_bash4.tests +++ b/shell/hush_test/hush-vars/var_bash4.tests @@ -6,23 +6,30 @@ # even in quotes. # # bash4 (and probably bash3 too): "Quoted:" results are different from -# unquoted and assignment expansions - they have a backslash before z. +# unquoted expansions - they have a backslash before z. +# +# The difference only exists if repl is a literal. If it is a variable: +# ${v/.../$s}, then all backslashes are preserved in both cases. v='a*b\*c' echo 'Source: ' "$v" echo 'Replace str: ' '_\\_\z_' echo 'Pattern: ' 'single backslash and star: "replace literal star"' -r=${v/\*/_\\_\z_} -echo 'In assignment:' "$r" echo 'Unquoted: ' ${v/\*/_\\_\z_} +r=${v/\*/_\\_\z_} +echo 'Unquoted =: ' "$r" echo 'Quoted: ' "${v/\*/_\\_\z_}" +r="${v/\*/_\\_\z_}" +echo 'Quoted =: ' "$r" echo 'Pattern: ' 'double backslash and star: "replace backslash and everything after it"' -r=${v/\\*/_\\_\z_} -echo 'In assignment:' "$r" echo 'Unquoted: ' ${v/\\*/_\\_\z_} +r=${v/\\*/_\\_\z_} +echo 'Unquoted =: ' "$r" echo 'Quoted: ' "${v/\\*/_\\_\z_}" +r="${v/\\*/_\\_\z_}" +echo 'Quoted =: ' "$r" echo @@ -31,16 +38,43 @@ echo 'Source: ' "$v" echo 'Replace str: ' '_\\_\z_' echo 'Pattern: ' 'single backslash and b: "replace b"' -r=${v/\b/_\\_\z_} -echo 'In assignment:' "$r" echo 'Unquoted: ' ${v/\b/_\\_\z_} +r=${v/\b/_\\_\z_} +echo 'Unquoted =: ' "$r" echo 'Quoted: ' "${v/\b/_\\_\z_}" +r="${v/\b/_\\_\z_}" +echo 'Quoted =: ' "$r" echo 'Pattern: ' 'double backslash and b: "replace backslash and b"' -r=${v/\\b/_\\_\z_} -echo 'In assignment:' "$r" echo 'Unquoted: ' ${v/\\b/_\\_\z_} +r=${v/\\b/_\\_\z_} +echo 'Unquoted =: ' "$r" echo 'Quoted: ' "${v/\\b/_\\_\z_}" +r="${v/\\b/_\\_\z_}" +echo 'Quoted =: ' "$r" + +echo + +v='a\bc' +s='_\\_\z_' +echo 'Source: ' "$v" +echo 'Replace str: ' "$s" '(as variable $s)' + +echo 'Pattern: ' 'single backslash and b: "replace b"' +echo 'Unquoted: ' ${v/\b/$s} +r=${v/\b/$s} +echo 'Unquoted =: ' "$r" +echo 'Quoted: ' "${v/\b/$s}" +r="${v/\b/$s}" +echo 'Quoted =: ' "$r" + +echo 'Pattern: ' 'double backslash and b: "replace backslash and b"' +echo 'Unquoted: ' ${v/\\b/$s} +r=${v/\\b/$s} +echo 'Unquoted =: ' "$r" +echo 'Quoted: ' "${v/\\b/$s}" +r="${v/\\b/$s}" +echo 'Quoted =: ' "$r" echo |