diff --git a/bin/sh/parser.c b/bin/sh/parser.c index 9500d914559..5c0d2b14dbb 100644 --- a/bin/sh/parser.c +++ b/bin/sh/parser.c @@ -1234,7 +1234,8 @@ readtoken1(int firstc, char const *initialsyntax, char *eofmark, int striptabs) case CENDVAR: /* '}' */ if (level > 0 && (state[level].category == TSTATE_VAR_OLD || - state[level].category == TSTATE_VAR_NEW)) { + (state[level].category == TSTATE_VAR_NEW && + state[level].syntax == BASESYNTAX))) { if (state[level].category == TSTATE_VAR_OLD) state[level - 1].syntax = state[level].syntax; else diff --git a/tools/regression/bin/sh/expansion/trim5.0 b/tools/regression/bin/sh/expansion/trim5.0 new file mode 100644 index 00000000000..937ec9a708e --- /dev/null +++ b/tools/regression/bin/sh/expansion/trim5.0 @@ -0,0 +1,28 @@ +# $FreeBSD$ + +e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}' +h='##' +failures='' +ok='' + +testcase() { + code="$1" + expected="$2" + oIFS="$IFS" + eval "$code" + IFS='|' + result="$#|$*" + IFS="$oIFS" + if [ "x$result" = "x$expected" ]; then + ok=x$ok + else + failures=x$failures + echo "For $code, expected $expected actual $result" + fi +} + +testcase 'set -- "${b%'\'}\''}"' '1|{{(#)}' +testcase 'set -- ${b%"}"}' '1|{{(#)}' +testcase 'set -- "${b%"}"}"' '1|{{(#)}' + +test "x$failures" = x