Mise à jour
Quelqu'un dans liste de diffusion bug-bash tiene confirmé c'est un bug.
Si quelqu'un est intéressé, un correctif est disponible en le dernier commit de la branche devel .
Alors que
bash -c 'echo "${1##*""}"' _ bar
imprime une ligne vide,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
imprime bar
.
Je ne comprends pas. ${1##*}
se développe en une chaîne vide, donc "${1##*}"
doivent être traitées comme ""
est, mais il semble que Bash ne le pense pas.
Il semble qu'il y ait un consensus à ce sujet parmi d'autres personnes populaires. sh
mises en œuvre :
$ 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 (avec ou sans --posix
) est le seul à ne pas s'y conformer :
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
Et sans traitement des sous-chaînes, le comportement est conforme aux attentes :
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Je me demande vraiment s'il y a une explication à cela, que je n'ai pas trouvée dans le manuel. S'agit-il d'un bogue ou d'une mauvaise interprétation de la norme ? Ce comportement est-il documenté quelque part ?
PS : Je sais qu'une solution de contournement rapide consiste à dé-citer le PE interne, mais cela ne répond pas à ma question, et peut conduire à des résultats indésirables avec des chaînes contenant des caractères spéciaux.