hush: handle ${var:NUM:} too
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
@ -2649,12 +2649,17 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg, char
|
|||||||
beg = bb_strtou(exp_word, &end, 0);
|
beg = bb_strtou(exp_word, &end, 0);
|
||||||
//bb_error_msg("beg:'%s'=%u end:'%s'", exp_word, beg, end);
|
//bb_error_msg("beg:'%s'=%u end:'%s'", exp_word, beg, end);
|
||||||
if (*end == ':') {
|
if (*end == ':') {
|
||||||
|
if (end[1] != '\0') /* not ${var:NUM:} */
|
||||||
len = bb_strtou(end + 1, &end, 0);
|
len = bb_strtou(end + 1, &end, 0);
|
||||||
|
else {
|
||||||
|
len = 0;
|
||||||
|
end++;
|
||||||
|
}
|
||||||
//bb_error_msg("len:%u end:'%s'", len, end);
|
//bb_error_msg("len:%u end:'%s'", len, end);
|
||||||
}
|
}
|
||||||
if (*end == '\0') {
|
if (*end == '\0') {
|
||||||
//bb_error_msg("from val:'%s'", val);
|
//bb_error_msg("from val:'%s'", val);
|
||||||
if (!val || beg >= strlen(val))
|
if (len == 0 || !val || beg >= strlen(val))
|
||||||
val = "";
|
val = "";
|
||||||
else
|
else
|
||||||
val = dyn_val = xstrndup(val + beg, len);
|
val = dyn_val = xstrndup(val + beg, len);
|
||||||
@ -2663,6 +2668,7 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg, char
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
die_if_script("malformed ${%s...}", var);
|
die_if_script("malformed ${%s...}", var);
|
||||||
|
val = "";
|
||||||
}
|
}
|
||||||
} else { /* one of "-=+?" */
|
} else { /* one of "-=+?" */
|
||||||
/* Standard-mandated substitution ops:
|
/* Standard-mandated substitution ops:
|
||||||
|
@ -7,23 +7,35 @@ hush: syntax error: unterminated ${name}
|
|||||||
1:1 =||
|
1:1 =||
|
||||||
1:1:2=||
|
1:1:2=||
|
||||||
1::2 =||
|
1::2 =||
|
||||||
|
1:1: =||
|
||||||
|
1:: =||
|
||||||
1 =|0123|
|
1 =|0123|
|
||||||
1:1 =|123|
|
1:1 =|123|
|
||||||
1:1:2=|12|
|
1:1:2=|12|
|
||||||
1::2 =|01|
|
1::2 =|01|
|
||||||
|
1:1: =||
|
||||||
|
1:: =||
|
||||||
f =||
|
f =||
|
||||||
f:1 =||
|
f:1 =||
|
||||||
f:1:2=||
|
f:1:2=||
|
||||||
f::2 =||
|
f::2 =||
|
||||||
|
f:1: =||
|
||||||
|
f:: =||
|
||||||
f =||
|
f =||
|
||||||
f:1 =||
|
f:1 =||
|
||||||
f:1:2=||
|
f:1:2=||
|
||||||
f::2 =||
|
f::2 =||
|
||||||
|
f:1: =||
|
||||||
|
f:: =||
|
||||||
f =|a|
|
f =|a|
|
||||||
f:1 =||
|
f:1 =||
|
||||||
f:1:2=||
|
f:1:2=||
|
||||||
f::2 =|a|
|
f::2 =|a|
|
||||||
|
f:1: =||
|
||||||
|
f:: =||
|
||||||
f =|0123456789|
|
f =|0123456789|
|
||||||
f:1 =|123456789|
|
f:1 =|123456789|
|
||||||
f:1:2=|12|
|
f:1:2=|12|
|
||||||
f::2 =|01|
|
f::2 =|01|
|
||||||
|
f:1: =||
|
||||||
|
f:: =||
|
||||||
|
@ -19,28 +19,40 @@ export var=0123456789
|
|||||||
"$THIS_SH" -c 'set --; echo "1:1 =|${1:1}|"'
|
"$THIS_SH" -c 'set --; echo "1:1 =|${1:1}|"'
|
||||||
"$THIS_SH" -c 'set --; echo "1:1:2=|${1:1:2}|"'
|
"$THIS_SH" -c 'set --; echo "1:1:2=|${1:1:2}|"'
|
||||||
"$THIS_SH" -c 'set --; echo "1::2 =|${1::2}|"'
|
"$THIS_SH" -c 'set --; echo "1::2 =|${1::2}|"'
|
||||||
|
"$THIS_SH" -c 'set --; echo "1:1: =|${1:1:}|"'
|
||||||
|
"$THIS_SH" -c 'set --; echo "1:: =|${1::}|"'
|
||||||
|
|
||||||
"$THIS_SH" -c 'set -- 0123; echo "1 =|${1}|"'
|
"$THIS_SH" -c 'set -- 0123; echo "1 =|${1}|"'
|
||||||
"$THIS_SH" -c 'set -- 0123; echo "1:1 =|${1:1}|"'
|
"$THIS_SH" -c 'set -- 0123; echo "1:1 =|${1:1}|"'
|
||||||
"$THIS_SH" -c 'set -- 0123; echo "1:1:2=|${1:1:2}|"'
|
"$THIS_SH" -c 'set -- 0123; echo "1:1:2=|${1:1:2}|"'
|
||||||
"$THIS_SH" -c 'set -- 0123; echo "1::2 =|${1::2}|"'
|
"$THIS_SH" -c 'set -- 0123; echo "1::2 =|${1::2}|"'
|
||||||
|
"$THIS_SH" -c 'set -- 0123; echo "1:1: =|${1:1:}|"'
|
||||||
|
"$THIS_SH" -c 'set -- 0123; echo "1:: =|${1::}|"'
|
||||||
|
|
||||||
"$THIS_SH" -c 'unset f; echo "f =|$f|"'
|
"$THIS_SH" -c 'unset f; echo "f =|$f|"'
|
||||||
"$THIS_SH" -c 'unset f; echo "f:1 =|${f:1}|"'
|
"$THIS_SH" -c 'unset f; echo "f:1 =|${f:1}|"'
|
||||||
"$THIS_SH" -c 'unset f; echo "f:1:2=|${f:1:2}|"'
|
"$THIS_SH" -c 'unset f; echo "f:1:2=|${f:1:2}|"'
|
||||||
"$THIS_SH" -c 'unset f; echo "f::2 =|${f::2}|"'
|
"$THIS_SH" -c 'unset f; echo "f::2 =|${f::2}|"'
|
||||||
|
"$THIS_SH" -c 'unset f; echo "f:1: =|${f:1:}|"'
|
||||||
|
"$THIS_SH" -c 'unset f; echo "f:: =|${f::}|"'
|
||||||
|
|
||||||
"$THIS_SH" -c 'f=; echo "f =|$f|"'
|
"$THIS_SH" -c 'f=; echo "f =|$f|"'
|
||||||
"$THIS_SH" -c 'f=; echo "f:1 =|${f:1}|"'
|
"$THIS_SH" -c 'f=; echo "f:1 =|${f:1}|"'
|
||||||
"$THIS_SH" -c 'f=; echo "f:1:2=|${f:1:2}|"'
|
"$THIS_SH" -c 'f=; echo "f:1:2=|${f:1:2}|"'
|
||||||
"$THIS_SH" -c 'f=; echo "f::2 =|${f::2}|"'
|
"$THIS_SH" -c 'f=; echo "f::2 =|${f::2}|"'
|
||||||
|
"$THIS_SH" -c 'f=; echo "f:1: =|${f:1:}|"'
|
||||||
|
"$THIS_SH" -c 'f=; echo "f:: =|${f::}|"'
|
||||||
|
|
||||||
"$THIS_SH" -c 'f=a; echo "f =|$f|"'
|
"$THIS_SH" -c 'f=a; echo "f =|$f|"'
|
||||||
"$THIS_SH" -c 'f=a; echo "f:1 =|${f:1}|"'
|
"$THIS_SH" -c 'f=a; echo "f:1 =|${f:1}|"'
|
||||||
"$THIS_SH" -c 'f=a; echo "f:1:2=|${f:1:2}|"'
|
"$THIS_SH" -c 'f=a; echo "f:1:2=|${f:1:2}|"'
|
||||||
"$THIS_SH" -c 'f=a; echo "f::2 =|${f::2}|"'
|
"$THIS_SH" -c 'f=a; echo "f::2 =|${f::2}|"'
|
||||||
|
"$THIS_SH" -c 'f=a; echo "f:1: =|${f:1:}|"'
|
||||||
|
"$THIS_SH" -c 'f=a; echo "f:: =|${f::}|"'
|
||||||
|
|
||||||
"$THIS_SH" -c 'f=0123456789; echo "f =|$f|"'
|
"$THIS_SH" -c 'f=0123456789; echo "f =|$f|"'
|
||||||
"$THIS_SH" -c 'f=0123456789; echo "f:1 =|${f:1}|"'
|
"$THIS_SH" -c 'f=0123456789; echo "f:1 =|${f:1}|"'
|
||||||
"$THIS_SH" -c 'f=0123456789; echo "f:1:2=|${f:1:2}|"'
|
"$THIS_SH" -c 'f=0123456789; echo "f:1:2=|${f:1:2}|"'
|
||||||
"$THIS_SH" -c 'f=0123456789; echo "f::2 =|${f::2}|"'
|
"$THIS_SH" -c 'f=0123456789; echo "f::2 =|${f::2}|"'
|
||||||
|
"$THIS_SH" -c 'f=0123456789; echo "f:1: =|${f:1:}|"'
|
||||||
|
"$THIS_SH" -c 'f=0123456789; echo "f:: =|${f::}|"'
|
||||||
|
Reference in New Issue
Block a user