diff options
author | Denys Vlasenko | 2010-09-05 14:45:38 +0200 |
---|---|---|
committer | Denys Vlasenko | 2010-09-05 14:47:58 +0200 |
commit | 36f774a0cd2bf8dd72b192aab93831c5ac0c58f0 (patch) | |
tree | afa0b3d247e4dd163b89b7b61f4e3e0f3143b102 /shell/hush_test | |
parent | 701e127f7d892909a58c6f3333e23588ccef9e22 (diff) | |
download | busybox-36f774a0cd2bf8dd72b192aab93831c5ac0c58f0.zip busybox-36f774a0cd2bf8dd72b192aab93831c5ac0c58f0.tar.gz |
hush: add support for ${var/pattern/repl}, conditional on bash compat
function old new delta
expand_vars_to_list 2386 2833 +447
expand_string_to_string 69 110 +41
parse_dollar 681 721 +40
hush_main 963 945 -18
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/1 up/down: 528/-18) Total: 510 bytes
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'shell/hush_test')
-rw-r--r-- | shell/hush_test/hush-vars/var_bash1.right | 14 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_bash1.tests | 18 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var_bash2.right | 10 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_bash2.tests | 24 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var_bash3.right | 20 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_bash3.tests | 41 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var_bash4.right | 23 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_bash4.tests | 47 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var_bash5.right | 4 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_bash5.tests | 11 |
10 files changed, 212 insertions, 0 deletions
diff --git a/shell/hush_test/hush-vars/var_bash1.right b/shell/hush_test/hush-vars/var_bash1.right new file mode 100644 index 0000000..c0a0769 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash1.right @@ -0,0 +1,14 @@ + + +f +bcdef +abcdef +abcdef +bcde +abcd +abcd +abcdef +bcdef +abcdef +abcdef +abcdef diff --git a/shell/hush_test/hush-vars/var_bash1.tests b/shell/hush_test/hush-vars/var_bash1.tests new file mode 100755 index 0000000..24d3c9a --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash1.tests @@ -0,0 +1,18 @@ +var=abcdef + +echo ${var:7} +echo ${var:6} +echo ${var:5} +echo ${var:1} +echo ${var:0} +echo ${var:-1} + +echo ${var:1:4} +echo ${var:0:4} +echo ${var::4} +echo ${var:-1:4} + +echo ${var:1:7} +echo ${var:0:7} +echo ${var::7} +echo ${var:-1:7} diff --git a/shell/hush_test/hush-vars/var_bash2.right b/shell/hush_test/hush-vars/var_bash2.right new file mode 100644 index 0000000..acba5c6 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash2.right @@ -0,0 +1,10 @@ +abc123xcba123 +abx123dcba123 +abx123dxba123 +abcx23dcba123 +abcxxxdcbaxxx +abx +xba123 +abx23 +abc23dcba123 +abcdcba diff --git a/shell/hush_test/hush-vars/var_bash2.tests b/shell/hush_test/hush-vars/var_bash2.tests new file mode 100755 index 0000000..29c526c --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash2.tests @@ -0,0 +1,24 @@ +var=abc123dcba123 + +echo ${var/d/x} +echo ${var/c/x} +echo ${var//c/x} +echo ${var/[123]/x} +echo ${var//[123]/x} +echo ${var/c*/x} +echo ${var/*c/x} + +# must match longest match: result is "abx23" +echo ${var/c*1/x} + +# empty replacement - 2nd slash can be omitted +echo ${var/[123]} +echo ${var//[123]} + +### ash doesn't support +### # match only at the beginning: +### echo ${var/#a/x} +### echo ${var/#b/x} # should not match +### echo ${var//#b/x} # should not match +### # match only at the end: +### echo ${var/%3/x} diff --git a/shell/hush_test/hush-vars/var_bash3.right b/shell/hush_test/hush-vars/var_bash3.right new file mode 100644 index 0000000..a97c850 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash3.right @@ -0,0 +1,20 @@ +1 a041#c +2 a041#c +3 a\041#c +4 a\041#c +5 a\041#c +6 a\041#c +7 a\041#c +8 a\041#c +9 a\041#c +10 a\c +11 a\c +12 a\c +13 a\\c +14 a\\c +15 a\\c +16 a\tc +17 a\tc +18 a\tc +19 atc +20 a\tc diff --git a/shell/hush_test/hush-vars/var_bash3.tests b/shell/hush_test/hush-vars/var_bash3.tests new file mode 100755 index 0000000..146dbb6 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash3.tests @@ -0,0 +1,41 @@ +a='abc' +r=${a//b/\041#} +echo 1 $r +echo 2 ${a//b/\041#} +echo 3 "${a//b/\041#}" + +a='abc' +r=${a//b/\\041#} +echo 4 $r +echo 5 ${a//b/\\041#} +echo 6 "${a//b/\\041#}" + +a='abc' +b='\041#' +r=${a//b/$b} +echo 7 $r +echo 8 ${a//b/$b} +echo 9 "${a//b/$b}" + +a='abc' +b='\' +r="${a//b/$b}" +echo 10 $r +echo 11 ${a//b/$b} +echo 12 "${a//b/$b}" + +a='abc' +b='\\' +r="${a//b/$b}" +echo 13 $r +echo 14 ${a//b/$b} +echo 15 "${a//b/$b}" + +a='abc' +b='\t' +r="${a//b/$b}" +echo 16 $r +echo 17 ${a//b/$b} +echo 18 "${a//b/$b}" +echo 19 ${a//b/\t} +echo 20 "${a//b/\t}" diff --git a/shell/hush_test/hush-vars/var_bash4.right b/shell/hush_test/hush-vars/var_bash4.right new file mode 100644 index 0000000..600e853 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash4.right @@ -0,0 +1,23 @@ +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 +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_ +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 +Quoted: a\_\_\z_c +Pattern: double backslash and b: "replace backslash and b" +In assignment: a_\_z_c +Unquoted: 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 new file mode 100755 index 0000000..d547061 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash4.tests @@ -0,0 +1,47 @@ +# This testcase demonstrates that backslashes are treated differently +# in 1st and 2nd parts of ${var/search/repl}: +# if quoted ("${var/search/repl}"), and repl contains \a (a non-special char), +# the backslash in repl stays; if unquoted, backslash is removed. +# But search part does not act like that: \a is always converted to just a, +# even in quotes. +# +# bash4 (and probably bash3 too): "Quoted:" results are different from +# unquoted and assignment expansions - they have a backslash before z. + +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_} +echo 'Quoted: ' "${v/\*/_\\_\z_}" + +echo 'Pattern: ' 'double backslash and star: "replace backslash and everything after it"' +r=${v/\\*/_\\_\z_} +echo 'In assignment:' "$r" +echo 'Unquoted: ' ${v/\\*/_\\_\z_} +echo 'Quoted: ' "${v/\\*/_\\_\z_}" + +echo + +v='a\bc' +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_} +echo 'Quoted: ' "${v/\b/_\\_\z_}" + +echo 'Pattern: ' 'double backslash and b: "replace backslash and b"' +r=${v/\\b/_\\_\z_} +echo 'In assignment:' "$r" +echo 'Unquoted: ' ${v/\\b/_\\_\z_} +echo 'Quoted: ' "${v/\\b/_\\_\z_}" + +echo + +echo Done: $? diff --git a/shell/hush_test/hush-vars/var_bash5.right b/shell/hush_test/hush-vars/var_bash5.right new file mode 100644 index 0000000..278ed32 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash5.right @@ -0,0 +1,4 @@ +a/ +a/d +a/e/f +Done: 0 diff --git a/shell/hush_test/hush-vars/var_bash5.tests b/shell/hush_test/hush-vars/var_bash5.tests new file mode 100755 index 0000000..7f482a5 --- /dev/null +++ b/shell/hush_test/hush-vars/var_bash5.tests @@ -0,0 +1,11 @@ +# This testcase checks whether slashes in ${v/a/b} are parsed before +# or after expansions + +v='a/b/c' +s='b/c' +r='e/f' +echo "${v/$s}" +echo "${v/$s/d}" +echo "${v/$s/$r}" + +echo Done: $? |