コンマ区切りのパラメーターリストの完了規則を作成したいと思います。たとえば、サーバー名のリストを受け取るコマンドがあります:
myscript -s name1,name2,name3
この瞬間、私は次の完了を書くことができました:
_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
}
ただし、少なくとも2つの問題があります。
- 現在の値の提案には、接頭辞に以前のすべての値が含まれます。
- 値の重複は考慮されません。
そのような場合のベストプラクティスは何ですか?たぶんbash-completionsにはcsv-list用のいくつかのバンドルされた関数がありますか?
$VARIABLE
はいけません。そうしないと、単語の区切りが発生しません。使用するだけIFS=, LIST=($VARIABLE)
です。
IFS=, LIST=("$VARIABLE")
です。$ VARIABLEにはコンマ区切りの値が含まれます。