Cập nhật
Một số người trong danh sách gửi thư của bug-bash đã xác nhận đây là một lỗi.
Nếu bất cứ ai quan tâm, một bản sửa lỗi có sẵn trong cam kết mới nhất cho chi nhánh phát triển .
Trong khi
bash -c 'echo "${1##*""}"' _ bar
in một dòng trống,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
bản in bar
.
Tôi không hiểu điều này. ${1##*}
mở rộng thành một chuỗi rỗng, do đó, "${1##*}"
nên được xử lý như vậy ""
, nhưng có vẻ như bash không nghĩ như vậy.
Dường như có một sự đồng thuận về điều này trong số các sh
triển khai phổ biến khác :
$ 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 (có hoặc không có --posix
) là người duy nhất không tuân thủ điều đó:
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
Và không có xử lý chuỗi con, hành vi như mong đợi:
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Tôi thực sự tự hỏi nếu có một lời giải thích cho điều này, mà tôi không thể tìm thấy trong hướng dẫn. Đây có phải là một lỗi, hoặc giải thích sai về tiêu chuẩn? Là hành vi này được ghi nhận ở đâu đó?
Tái bút: Tôi biết một cách giải quyết nhanh là bỏ qua PE bên trong, nhưng điều đó không trả lời câu hỏi của tôi và có thể dẫn đến kết quả không mong muốn với các chuỗi chứa các ký tự đặc biệt.
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
in "thanh"
4.4.12(3)-release
, echo "${BASH##*"${BASH##*}"}"
-> /bin/bash
. Trong khi echo "\${BASH##*"${BASH##*}"}"
-> ${BASH##*}
và eval echo "\${BASH##*"${BASH##*}"}"
-> để trống.
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
in một chuỗi trống