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