Memperbarui
Seseorang di milis bug-bash telah mengkonfirmasi bahwa ini adalah bug.
Jika ada yang tertarik, perbaikan tersedia di komit terbaru untuk mengembangkan cabang .
Sementara
bash -c 'echo "${1##*""}"' _ bar
mencetak garis kosong,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
cetakan bar
.
Saya tidak mengerti ini. ${1##*}
mengembang ke string kosong, jadi "${1##*}"
harus diperlakukan sama seperti sebelumnya ""
, tetapi sepertinya bash tidak berpikir begitu.
Tampaknya ada konsensus mengenai ini di antara sh
implementasi populer lainnya :
$ 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 (dengan atau tanpa --posix
) adalah satu-satunya yang tidak sesuai dengan itu:
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
Dan tanpa mengolah hal-hal pemrosesan perilaku seperti yang diharapkan:
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Saya benar-benar bertanya-tanya apakah ada penjelasan untuk ini, yang tidak dapat saya temukan di manual. Apakah ini bug, atau kesalahan interpretasi standar? Apakah perilaku ini didokumentasikan di suatu tempat?
PS: Saya tahu solusi cepat adalah dengan menghapus tanda kutip dalam PE, tetapi itu tidak menjawab pertanyaan saya, dan dapat menyebabkan hasil yang tidak diinginkan dengan string yang berisi karakter khusus.
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
mencetak string kosongGNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
cetakan "bar"4.4.12(3)-release
,echo "${BASH##*"${BASH##*}"}"
->/bin/bash
. Sementaraecho "\${BASH##*"${BASH##*}"}"
->${BASH##*}
daneval echo "\${BASH##*"${BASH##*}"}"
-> kosong.Jawaban:
Pertama saya berpikir bahwa ini adalah karena aturan glob khusus, tetapi pada akhirnya saya pikir ini adalah bug di bash. Empat contoh berikut ini akan memberi Anda perasaan mengapa saya percaya ini adalah bug:
Kasus 1 dan kasus 3 berbeda dalam kutipan. Tapi parameter ekspansi formulir
${parameter##word}
menggunakan aturan ekspansi pathname untuk diprosesword
. Jadi*foo
dan*"foo"
memiliki perilaku yang identik sebagai tanda kutip ganda dalam ekspansi pathname bisa diabaikan kecuali mereka memeluk karakter pola khusus (*
,?
, ...). Ini terlihat pada contoh berikut:sumber
${1+}
dan${1+""}
memperluas ke string kosong, tetapi mereka tidak diperlakukan sebagaimana${1##*}
adanya (lihat edit terbaru saya). Jadi kita dapat menyimpulkan bahwa ini adalah bug, kan?