参数扩展导致空字符串的处理方式有所不同


10

更新资料

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 3.2.57(1)-release (x86_64-apple-darwin18)打印一个空字符串
William Pursell,

GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)打印“酒吧”
威廉·普塞尔

@William在4.4.20和5.0.11上进行了测试,并且都打印了“ bar”
oguz ismail

通常,这似乎是扩展的问题。在我4.4.12(3)-releaseecho "${BASH##*"${BASH##*}"}"- > /bin/bash。而echo "\${BASH##*"${BASH##*}"}"-> ${BASH##*}eval echo "\${BASH##*"${BASH##*}"}"->为空白。
杰夫Y

Answers:


2

这不是答案

首先,我认为这是由于特殊的规则所致,但最终,我认为这是bash中的错误。以下四个示例应该使您了解为什么我认为这是一个错误:

$ bash -c 'echo "${1##*${1%%bar}}"' _ foobar        # case 1
bar
$ bash -c 'echo "${1##*${1%%foobar}}"' _ foobar     # case 2

$ bash -c 'echo "${1##*"${1%%bar}"}"' _ foobar      # case 3
bar
$ bash -c 'echo "${1##*"${1%%foobar}"}"' _ foobar   # case 4
foobar

情况1和情况3的引号不同。但是表格的参数扩展${parameter##word}使用路径名扩展规则进行处理word。因此,*foo并且*"foo"具有与路径名扩展中的双引号相同的行为,除非它们包含特殊的模式字符(,,...)*,否则可以忽略?。在以下示例中可以看到:

$ bash -c 'echo "${1##*${2%%b*r}}"' _ 'foobar' 'f*ob*r'
bar
$ bash -c 'echo "${1##*"${2%%b*r}"}"' _ 'foobar' 'f*ob*r'
foobar

因此,如果是这种情况,为什么情况2和情况4的行为会有所不同?


为什么案例2和案例4表现不同?没有理由,都${1+}${1+""}扩展为空字符串,但不进行治疗的方法${1##*}是(看到我的最新修改)。因此我们可以推断出这是一个错误,对吗?
oguz ismail

1
@oguzismail就是这样!如果情况1和情况3的行为相同,则情况2和情况4的行为也应相同。
kvantour
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.