Shell脚本参数自动补全

1 开发环境

    Ubuntu14.04

    Bash Shell

2 前言

    自编写的Shell脚本,很多时候都需要输入一定的参数。当参数较多而且较复制的时候,如果能使用Tab键补全就显得非常的便利。本文专门为此实现此目的而编写。

3 compgen & complete

    自动补全是Bash Shell的功能(Dash Shell就没有这么好的功能了[7]),主要是利用了其内建的两个命令compgencomplete

3.1 compgen

    示例

compgen -W "aa ab bb cc" -- "a"

    解析

    表示从"aa ab bb cc"  匹配出以“a”开头的单词,上述命令的返回结果就是 “aa ab”:


3.2 complete

    语法complete 补全行为选项 命令名[4]

    解析:可用的行为选项如下所示[4]:

    -F:执行指定函数名,候选结果保存在 COMPREPLY 数组变量里,补全功能更强大,可以实现命令参数补全,函数名在 /etc/bash_completion定义的。
    -f:补全文件名,后可跟 -X 参数。
    -X:过滤表达式,符合表达式的文件名会被排除,即不会在补全候选显示出来,如果以感叹号开头,则表示反转,即符合表达式的文件名才显示。
    -o:补全类型,filenames 表示补全的是一个文件,跟 -f 参数使用才有效;其它值如dirnames 表示补全目录。

    示例1:    /* 使用my_complete_func函数(自定义)来对my_cmd进行补全. */

complete -F my_complete_func my_cmd

    示例2:    /* my_cmd只进行文件名补全. */

complete -f my_cmd

    示例3:   /* my_cmd只进行目录补全 */

complete -o dirnames my_cmd
    示例4:     /* my_cmd只补全文件 */

complete -o filenames -f my_cmd

    示例5:    /* 查询当先实现的补全命令 */

complete
Shell脚本参数自动补全_第1张图片

4 定制自动补全选项

    本小结根据网上的资料总结如何为自定义的Shell脚本定制个性化的自动补全项目。

4.1 hello.sh

    新建一个文件hello.sh,然后在其中输入:

#!/bin/bash
echo "hello world"

    保存上述内容,然后:

chmod +x hello.sh

    将hello.sh所在路径添加到PATH环境变量中。

4.2 hello_complete

    创建一个文件hello_complete,然后输入如下内容:

complete -F hello_complete_func hello.sh

_helloworld_complete_func()   
{  
    local cur prev opts  
    COMPREPLY=()  
    cur="${COMP_WORDS[COMP_CWORD]}"  
    prev="${COMP_WORDS[COMP_CWORD-1]}"  
    opts="help usage version"                                                                                                                                                                                

    if [[ ${cur} == * ]] ; then  
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )   
        return 0   
    fi  
}

    注:上述的opts并不是一个字符串数组,而仅仅是一个字符串!

4.3 测试补全效果

source hello_complete
hello.sh [Tab][Tab]

参考资料

[1]Shell脚本中实现自动补全功能

[2]在自己的base脚本中实现自动补全

[3]Working more productively with bash 2.x/3.x

[4]bash shell:命令的文件名自动补全设置

[5]我使用过的Linux命令之complete - 强劲的bash参数补全功能

[6]linux shell中的命令自动补全(compgen complete)与 命令行参数解析

[7]Linux Shell 按Tab键不能补全

[8]Linux中10个你不知道的命令补齐技巧

你可能感兴趣的:(Shell,Ubuntu)