Bash完成:允许标记一次
我有一个基本完整的功能:Bash完成:允许标记一次,bash,bash-completion,Bash,Bash Completion,我有一个基本完整的功能: _my_complete () { local cur prev opts opts2; COMPREPLY=(); cur="${COMP_WORDS[COMP_CWORD]}"; prev="${COMP_WORDS[COMP_CWORD-1]}"; opts="foo bar"; opts2="-f -s"; case ${COMP_CWORD} in 1) CO
_my_complete ()
{
local cur prev opts opts2;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts="foo bar";
opts2="-f -s";
case ${COMP_CWORD} in
1)
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
;;
2 | 4)
COMPREPLY=($(compgen -W "${opts2}" -- ${cur}))
;;
esac
}
如何将完成限制为在命令行中只接受一次-f或-s
谢谢问题解决了。受@whjm评论和本书启发
正如您所知,所有参数都在
${COMP_WORDS[@]}
中,因此您可以简单地检查-f
或-s
是否已在数组中。是的,但是如何以及在何处检查并编辑opts2
?有更简单的方法来获取cur
和prev
。只需编写cur=$2
和prev=$3
。而$1
是命令本身。几个网站的例子都提出了复杂的方法。所以我坚持这样做。$1..3
对我来说总是很好的。如果你非常清楚${COMP_WORDS[@]}
的区别,那么你就知道什么时候使用它了。对我来说,足够好就足够了
_my_complete() {
local cur prev opts opts2 subopts ;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts="foo bar";
opts2="-f -s";
subopts=();
for i in ${opts2}
do
for j in "${COMP_WORDS[@]}"
do
if [[ "$i" == "$j" ]]
then
continue 2
fi
done
subopts+=("$i")
done
case ${COMP_CWORD} in
1)
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
;;
2|4)
COMPREPLY=($(compgen -W "${subopts[*]}" -- ${cur}))
;;
esac
}