更新资料
bug-bash邮件列表中的某人已确认这是一个bug。
如果有人感兴趣,可以在最新的commit to devel branch中找到修复程序。
而
bash -c 'echo "${1##*""}"' _ bar
打印一个空行,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
版画bar
。
我不明白 ${1##*}
扩展为空字符串,因此"${1##*}"
应按原样对待""
,但bash似乎不这么认为。
在其他流行的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)
打印“酒吧”
@William在4.4.20和5.0.11上进行了测试,并且都打印了“ bar”
—
oguz ismail
通常,这似乎是扩展的问题。在我
—
杰夫Y
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)
打印一个空字符串