diff --git a/shell/ash.c b/shell/ash.c index 771fc8bf9..4ca4c6c56 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -7073,6 +7073,11 @@ subevalvar(char *start, char *str, int strloc, repl = NULL; break; } + /* Skip over quoted 'str'. Example: ${var/'/'} - second / is not a separator */ + if ((unsigned char)*repl == CTLQUOTEMARK) { + while ((unsigned char)*++repl != CTLQUOTEMARK) + continue; + } if (*repl == '/') { *repl = '\0'; break; diff --git a/shell/ash_test/ash-quoting/dollar_repl_bash2.right b/shell/ash_test/ash-quoting/dollar_repl_bash2.right new file mode 100644 index 000000000..e3fcd5807 --- /dev/null +++ b/shell/ash_test/ash-quoting/dollar_repl_bash2.right @@ -0,0 +1,4 @@ +axxb +axxb +axxb +axxb diff --git a/shell/ash_test/ash-quoting/dollar_repl_bash2.tests b/shell/ash_test/ash-quoting/dollar_repl_bash2.tests new file mode 100755 index 000000000..45c7a10e2 --- /dev/null +++ b/shell/ash_test/ash-quoting/dollar_repl_bash2.tests @@ -0,0 +1,8 @@ +v="x/x" +# The second / is quoted, should not be treated as separator +echo a${v/'/'}b +# The second / is escaped, should not be treated as separator +echo a${v/\/}b + +echo "a${v/'/'}b" +echo "a${v/\/}b" diff --git a/shell/hush_test/hush-quoting/dollar_repl_bash2.right b/shell/hush_test/hush-quoting/dollar_repl_bash2.right new file mode 100644 index 000000000..e3fcd5807 --- /dev/null +++ b/shell/hush_test/hush-quoting/dollar_repl_bash2.right @@ -0,0 +1,4 @@ +axxb +axxb +axxb +axxb diff --git a/shell/hush_test/hush-quoting/dollar_repl_bash2.tests b/shell/hush_test/hush-quoting/dollar_repl_bash2.tests new file mode 100755 index 000000000..45c7a10e2 --- /dev/null +++ b/shell/hush_test/hush-quoting/dollar_repl_bash2.tests @@ -0,0 +1,8 @@ +v="x/x" +# The second / is quoted, should not be treated as separator +echo a${v/'/'}b +# The second / is escaped, should not be treated as separator +echo a${v/\/}b + +echo "a${v/'/'}b" +echo "a${v/\/}b"