Tôi muốn tạo quy tắc hoàn thành cho danh sách tham số được phân tách bằng dấu phẩy. Ví dụ: tôi có lệnh nhận danh sách tên máy chủ:
myscript -s name1,name2,name3
Tại thời điểm này, tôi đã quản lý để viết hoàn thành sau đây:
_myscript () {
local cur prev opts
_get_comp_words_by_ref cur prev
opts='-s'
servers='name1 name2 name3'
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
else
case "${prev}" in
-s)
if [[ "$cur" == *,* ]]; then
local realcur prefix
realcur=${cur##*,}
prefix=${cur%,*}
COMPREPLY=( $(compgen -W "${servers}" -P "${prefix}," -- ${realcur}) )
else
COMPREPLY=( $(compgen -W "${servers}" -- ${cur}) )
fi
;;
*)
# do nothing
;;
esac
fi
}
Nhưng nó có ít nhất 2 vấn đề:
- Đề xuất cho giá trị hiện tại bao gồm tất cả các giá trị trước đó trong tiền tố của chúng.
- Nó không xem xét các giá trị trùng lặp.
Các thực hành tốt nhất cho các trường hợp như vậy là gì? Có lẽ bash-hoàn thành có một số chức năng đi kèm cho danh sách csv?
$VARIABLE
, nếu không việc phá vỡ từ sẽ không xảy ra. Chỉ cần sử dụng IFS=, LIST=($VARIABLE)
.
IFS=, LIST=("$VARIABLE")
trong đó $ VARIABLE chứa các giá trị được phân tách bằng dấu phẩy của bạn.