shell命令行参数解析 - getopt和getopts


介绍

getopts、getopt都可以进行命令行参数解析, 区别在于:

  • getopts 只支持单个字符选项的情况, 选项的参数可以是多字符
  • getopt 选项和参数都支持多字符(也就是长选项), 例如–prefix=hello

getopts

示例

$ cat my_getopts.sh
#!/bin/bash
# getopts ":ab:c", 第一个冒号的作用是防止输入无效参数时报错
# $OPTARG 可用于获取带参数选项的参数值
# OPTIND是一个特殊的变量,它的初始值是1,每次getopts处理完一个命令参数后就递增它,得到getopts要处理的下一个参数

while getopts ":ab:c" opt; do
  case $opt in
    a) echo "选项 -a 被指定" ;;
    b) echo "选项 -b 被指定,参数为 $OPTARG" ;;
    c) echo "选项 -c 被指定" ;;
    \?) echo "未知选项: -$OPTARG" ;;
  esac
done


$ sh my_getopts.sh # 执行后输出
选项 -a 被指定
选项 -b 被指定,参数为 100
选项 -c 被指定
未知选项: -d

实践使用

需求
  • 编写一个安装服务的脚本,支持的选项参数 -i server|client、 -u、和-h
  • -i 选项后指定参数server或client 执行下载安装客户端或服务端配置
  • -u 选项执行卸载服务
  • -h 选项执行打印帮助

实现示例
#!/bin/bash


install_mysvc() {
    config_type="$1"
    echo "config_type=[${config_type}]"
    
    [[ -z "${config_type}" || "${config_type}" != "server" && "${config_type}" != "client" ]] && \
        echo -e "\033[31m错误,配置类型参数未传递\033[0m" && exit 1
    
    [[ "${config_type}" = "server" ]] \
        && echo "执行下载服务端配置" || echo "执行下载客户端配置"
    
    echo "执行其他安装操作"
}


uninstall_mysvc() {
    echo "卸载服务"
}


usage() {
    echo "我是帮助信息"
}



main() {
    [[ $# = 0 ]] && usage && exit 1

    while getopts ":i:uh" OPT; do
        case $OPT in
            i)
                install_mysvc "${OPTARG}"
                exit 0
                ;;
            u)
                uninstall_mysvc
                exit 0
                ;;
            h)
                usage
                exit 0
                ;;
            *)
                echo "Usage: $0 [-h]"
                exit 1
                ;;
        esac
    done
}


main $@

# 验证 sh <脚本名> -i server


getopt

示例

$ cat getopt_study.sh
#!/bin/bash
# getopt -n "$0" -o f:f2::v --long file:,file2::,verbose -- "$@"
# -n 指定参数解析错误时提示的程序名
# :表示必须带参数,::表示选项的参数是可选的
# -o 设置短选项,当参数是可选的时候,参数必须紧跟选项,不能有空格
# --long 设置长选项,以逗号分隔,当参数是可选的时候,需要使用格式 选项=参数
# -- 设置getopt 命令停止解析选项参数,并将剩余的参数视为普通参数。


# 定义默认值
filename=""
verbose=false

# 使用 getopt 获取命令行参数
OPTIONS=$(getopt -n "$0" -o f:f2::v --long file:,file2::,verbose -- "$@")

# 检查 getopt 的返回值
if [ $? != 0 ]; then
    echo "参数错误"
    exit 1
fi

# 重置命令行参数为 getopt 处理后的结果
eval set -- "$OPTIONS"

# 遍历处理 getopt 的结果
while true; do
    case "$1" in
        -f|--file)
            filename="$2"
            shift 2
            ;;
        -f2|--file2)
            filename2="$2"
            shift 2
            ;;
        -v|--verbose)
            verbose=true
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "未知参数"
            exit 1
            ;;
    esac
done

# 打印获取到的参数值
echo "文件名:$filename"
echo "文件名2:$filename2"
echo "是否详细输出:$verbose"
echo "其他参数:$@"


$ sh getopt_study.sh -f a.txt --file2=example.txt -v other_argument # 执行示例
文件名:a.txt
文件名2:example.txt
是否详细输出:true
其他参数:other_argument

实践使用

需求
  • 编写一个安装服务的脚本,支持的选项参数
    • 短选项:-i server|client、 -u、和-h
    • 长选项: --install server|client、 --uninstall、和-help
  • -i/–install 选项后指定参数server或client 执行下载安装客户端或服务端配置
  • -u/–uninstall 选项执行卸载服务
  • -h/–help 选项执行打印帮助

实现示例
$ cat install_svc2.sh
#!/bin/bash


install_mysvc() {
    config_type="$1"
    echo "config_type=[${config_type}]"
    
    [[ -z "${config_type}" || "${config_type}" != "server" && "${config_type}" != "client" ]] && \
        echo -e "\033[31m错误,配置类型参数未传递\033[0m" && exit 1
    
    [[ "${config_type}" = "server" ]] \
        && echo "执行下载服务端配置" || echo "执行下载客户端配置"
    
    echo "执行其他安装操作"
}


uninstall_mysvc() {
    echo "卸载服务"
}


usage() {
    echo "我是帮助信息"
}



main() {
    OPTIONS=$(getopt -n "$0" -o i:uh --long install:,install_last:,uninstall,help -- "$@")
    eval set -- "$OPTIONS"

    while true; do
        case "$1" in
            -i|--install)
                install_mysvc "$2"
                shift 2
                break
                ;;
            -u|--uninstall)
                uninstall_mysvc
                shift
                break
                ;;
            -h|--help)
                usage
                shift
                break
                ;;
            --)
                shift
                ;;
            *)
                echo "\033[31mUsage: $0 -h  获取帮助信息\033[0m"
                exit 1
                ;;
        esac
    done
}


main $@


# 验证 sh install_svc2.sh -i server
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值