Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall uname output: Linux x2 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 5.1 Patch Level: 4 Release Status: release Description: Parameters expanded to null by pattern removal or pattern substitution in the patterns of case clauses produced unexpected results in some cases. The version of bash in my system is 5.1, but the same results are produced in bash 5.2.37 I built from source. Repeat-By: In the following example, I expected no output, but in fact it output "not matched". x=abc case def in "${x#abc}"def) ;; "${x##abc}"def) ;; "${x%abc}"def) ;; "${x%%abc}"def) ;; "${x/abc/}"def) ;; "${x//abc/}"def) ;; "${x/#abc/}"def) ;; "${x/%abc/}"def) ;; *) echo 'not matched' esac # => not matched For comparison, the following cases are similar to the above but worked as expected. # case 1: assign the result of the expansion to another variable x=abc y=${x#abc} case def in "$y"def) echo matched esac # => matched # case 2: the parameter expansion is not quoted x=abc case def in ${x#abc}def) echo matched esac # => matched # case 3: the double-quoted string is not null after expansion x=abc case def in "${x#abc}def") echo matched esac # => matched # case 4: the target word of pattern matching is null x=abc case '' in "${x#abc}") echo matched esac # => matched # case 5: variable x is null (only for #, ##, %, and %%) x= case def in "${x#abc}"def) echo matched esac # => matched # note: Null variable x with pattern substitution does not work as # expected. x= case def in "${x/abc/}"def) ;; "${x//abc/}"def) ;; "${x/#abc/}"def) ;; "${x/%abc/}"def) ;; *) echo 'not matched' esac # => not matched