Оновлення
Хто - то в списку розсилки помилка-Баш вже підтвердив це помилка.
Якщо хтось зацікавлений, виправлення доступне в останньому зобов'язанні розробити галузь .
Поки
bash -c 'echo "${1##*""}"' _ bar
друкує порожній рядок,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
відбитки bar.
Я цього не розумію. ${1##*}розширюється до порожнього рядка, тому "${1##*}"слід ставитися так само, як ""є, але здається, що Баш так не вважає.
З цього питання, мабуть, існує консенсус серед інших популярних shреалізацій:
$ 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 (з або без --posix) є єдиним, що не відповідає цьому:
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
І без обробки підрядків речі поводиться так, як очікувалося:
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Мені дуже цікаво, чи є для цього пояснення, яке я не зміг знайти в посібнику. Це помилка чи неправильне тлумачення стандарту? Чи десь зафіксована така поведінка?
PS: Я знаю, що швидке вирішення питання - це скасувати внутрішнє PE, але це не відповідає на моє запитання, і це може призвести до небажаних результатів із рядками, що містять спеціальні символи.
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)друкує "бар"
4.4.12(3)-release, echo "${BASH##*"${BASH##*}"}"-> /bin/bash. Поки echo "\${BASH##*"${BASH##*}"}"-> ${BASH##*}та eval echo "\${BASH##*"${BASH##*}"}"-> пусті.
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)друкує порожню рядок