我正在尝试为一个命令设置自动完成,它只需要一个参数,一个文件夹名称,
在 中/secure/kernel_builds/
,我有以下三个子文件夹:
3.5.6/ 3.6.2/ source/
现在我想要自动完成,列出所有可能的子文件夹名称,但不是名为 的source
,现在我正在使用一种非常愚蠢的方法来完成它,通过检查完成词是否以数字开头,
_avail_kernel_builds()
{
case $COMP_CWORD in
1)
if [[ "${COMP_WORDS[COMP_CWORD]}" =~ ^[0-9] ]];then
COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"* )
else
COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"[0-9]*/ )
fi
COMPREPLY=( "${COMPREPLY[@]#/secure/kernel_builds/}" )
COMPREPLY=( "${COMPREPLY[@]%/}" )
;;
esac
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
您可以在循环中检查您(不)想要的字符串:
declare -a accept
declare -a reject
for s in "${COMPREPLY[@]}"; do
if [[ "$s" =~ want ]]; then
accept=( "${accept[@]}" "$s" )
else
reject=( "${reject[@]}" "$s" )
fi
done
Run Code Online (Sandbox Code Playgroud)