ปรับปรุง
ใครบางคนในรายการส่งเมลบั๊กได้ยืนยันแล้วว่านี่เป็นข้อผิดพลาด
หากใครที่สนใจการแก้ไขมีอยู่ในรุ่นล่าสุดมอบให้สาขา devel
ในขณะที่
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
$
ทุบตี (มีหรือไม่มี--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)พิมพ์ "bar"
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)พิมพ์สตริงว่าง