更新
で誰かバグbashのメーリングリストがいる確認し、これはバグです。
誰かが興味を持っている場合は、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」を
—
出力し
これは一般的に拡張の問題のようです。私では
—
Jeff 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)
空の文字列を出力します