-x=a
+x='a]'
+#
+# \] is not a valid escape for ] in set glob expression.
+# Glob sets have no escaping at all:
+# ] can be in a set if it is the first char: []abc],
+# dash can be in a set if it is first or last: [abc-],
+# [ and \ need no protections at all: [a[b\c] is a valid set of 5 chars.
+#
+# bash-4.3.43 misinterprets [a\]] as "set of 'a' or ']'".
+# Correct interpretation is "set of 'a' or '\', followed by ']'".
+#
echo Nothing:${x#[a\]]}
echo Nothing:"${x#[a\]]}"
echo Nothing:${x%[a\]]}
--- /dev/null
+Nothing:
+Nothing:
+Nothing:
+Nothing:
+Ok:0
--- /dev/null
+x=a
+echo Nothing:${x#[]a]}
+echo Nothing:"${x#[]a]}"
+echo Nothing:${x%[]a]}
+echo Nothing:"${x%[]a]}"
+echo Ok:$?
}
if (ch == end_ch
# if BASH_SUBSTR || BASH_PATTERN_SUBST
- || ch == end_char2
+ || ch == end_char2
# endif
) {
if (!dbl)
unsigned scan_flags = pick_scan(exp_op, *exp_word);
if (exp_op == *exp_word) /* ## or %% */
exp_word++;
+ debug_printf_expand("expand: exp_word:'%s'\n", exp_word);
exp_exp_word = encode_then_expand_string(exp_word, /*process_bkslash:*/ 1, /*unbackslash:*/ 1);
if (exp_exp_word)
exp_word = exp_exp_word;
+ debug_printf_expand("expand: exp_exp_word:'%s'\n", exp_word);
/* HACK ALERT. We depend here on the fact that
* G.global_argv and results of utoa and get_local_var_value
* are actually in writable memory:
* scan_and_match momentarily stores NULs there. */
t = (char*)val;
loc = scan_and_match(t, exp_word, scan_flags);
- //bb_error_msg("op:%c str:'%s' pat:'%s' res:'%s'",
- // exp_op, t, exp_word, loc);
+ debug_printf_expand("op:%c str:'%s' pat:'%s' res:'%s'\n", exp_op, t, exp_word, loc);
free(exp_exp_word);
if (loc) { /* match was found */
if (scan_flags & SCAN_MATCH_LEFT_HALF) /* #[#] */
-x=a
+x='a]'
+#
+# \] is not a valid escape for ] in set glob expression.
+# Glob sets have no escaping at all:
+# ] can be in a set if it is the first char: []abc],
+# dash can be in a set if it is first or last: [abc-],
+# [ and \ need no protections at all: [a[b\c] is a valid set of 5 chars.
+#
+# bash-4.3.43 misinterprets [a\]] as "set of 'a' or ']'".
+# Correct interpretation is "set of 'a' or '\', followed by ']'".
+#
echo Nothing:${x#[a\]]}
echo Nothing:"${x#[a\]]}"
echo Nothing:${x%[a\]]}
--- /dev/null
+Nothing:
+Nothing:
+Nothing:
+Nothing:
+Ok:0
--- /dev/null
+x=a
+echo Nothing:${x#[]a]}
+echo Nothing:"${x#[]a]}"
+echo Nothing:${x%[]a]}
+echo Nothing:"${x%[]a]}"
+echo Ok:$?
if (flags & SCAN_MATCH_LEFT_HALF) {
*loc = '\0';
r = fnmatch(pattern, string, 0);
+ //bb_error_msg("fnmatch('%s','%s',0):%d", pattern, string, r);
*loc = c;
} else {
r = fnmatch(pattern, loc, 0);
+ //bb_error_msg("fnmatch('%s','%s',0):%d", pattern, string, r);
}
if (r == 0) /* match found */
return loc;