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,name3Tạ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.