Date:        Sat, 9 Aug 2025 01:35:17 +0200
    From:        Denys Vlasenko <dvlas...@redhat.com>
    Message-ID:  <f7ec2956-dfeb-af4e-d314-937f36424...@redhat.com>

  | # This isn't working in bash as expected
  | echo '${a##$b?} removes \*:           '"|${a##$b?}|"' - matches \, then one 
char'   # bash prints |\*bc|
  | echo '${a##$b*} removes everything:   '"|${a##$b*}|"' - matches \, then 
all'        # bash prints |\*bc|
  | echo '${a##$b$c} removes everything:  '"|${a##$b$c}|"' - matches \, then 
all'       # bash prints |\*bc|
  | echo '${a##$b"$c"} removes \*:        '"|${a##$b"$c"}|"' - matches \, then 
*'       # bash prints |\*bc|
  | # the cause seems to be that $b emits backslash that "glues" onto next 
character if there is one:
  | # a='\*bc'; b='\'; c='*'; echo "|${a##?$b*}|"  # bash prints |bc| - the $b* 
works as \* (matches literal *)
  | # a='\*bc'; b='\'; c='*'; echo "|${a##\\$b*}|" # bash prints |bc|
  | # a='*bc'; b='\'; c='*'; echo "|${a##$b*}|"    # bash prints |bc|


Why are you expecting anything different from what bash produces there?
Here there are no unspecified cases, the pattern is expanded first, so
taking just the first one:

        ${a##$b?} 

expand the pattern (as it is unquoted), produca

        ${a##\?}

which is a perfectly valid glob expression to match a literal question mark.
There isn't one of those in $a so the match fails, nothing is removed.   That
is exactly as it should be.   The other 3 of those cases are explained the same
way.   Any shell which isn't doing what bash is doing in those cases I'd say
is the shell with bugs.

kre

Reply via email to