Aktualisieren
Jemand in der Bug-Bash-Mailingliste hat bestätigt, dass dies ein Fehler ist.
Wenn jemand interessiert ist, ist ein Fix im neuesten Commit zur Entwicklung des Zweigs verfügbar .
Während
bash -c 'echo "${1##*""}"' _ bar
druckt eine leere Zeile,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
druckt bar.
Ich verstehe das nicht ${1##*}Erweitert sich zu einer leeren Zeichenfolge, "${1##*}"sollte also so behandelt werden, wie es ""ist, aber Bash scheint das nicht zu glauben.
Diesbezüglich scheint es unter anderen populären shImplementierungen einen Konsens zu geben :
$ sh -c 'echo "${1##*"${1##*}"}"' _ bar
$ ash -c 'echo "${1##*"${1##*}"}"' _ bar
$ dash -c 'echo "${1##*"${1##*}"}"' _ bar
$ ksh -c 'echo "${1##*"${1##*}"}"' _ bar
$ ksh93 -c 'echo "${1##*"${1##*}"}"' _ bar
$ mksh -c 'echo "${1##*"${1##*}"}"' _ bar
$ posh -c 'echo "${1##*"${1##*}"}"' _ bar
$ yash -c 'echo "${1##*"${1##*}"}"' _ bar
$ zsh -c 'echo "${1##*"${1##*}"}"' _ bar
$
Bash (mit oder ohne --posix) ist der einzige, der dem nicht entspricht:
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
Und ohne Dinge, die Teilzeichenfolgen verarbeiten, ist das Verhalten wie erwartet:
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Ich frage mich wirklich, ob es dafür eine Erklärung gibt, die ich im Handbuch nicht finden konnte. Ist das ein Fehler oder eine Fehlinterpretation des Standards? Ist dieses Verhalten irgendwo dokumentiert?
PS: Ich weiß, dass eine schnelle Problemumgehung darin besteht, das innere PE aufzuheben, aber das beantwortet meine Frage nicht und kann zu unerwünschten Ergebnissen mit Zeichenfolgen führen, die Sonderzeichen enthalten.
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)druckt "bar"
4.4.12(3)-release, echo "${BASH##*"${BASH##*}"}"-> /bin/bash. Während echo "\${BASH##*"${BASH##*}"}"-> ${BASH##*}und eval echo "\${BASH##*"${BASH##*}"}"-> leer.
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)druckt eine leere Zeichenfolge