浅谈Linux bash脚本----getopts获取脚本POSIX标准传参

getopts是一个在 Shell 脚本中用于解析命令行选项的内置命令。

它用于处理脚本的参数,使得脚本可以接受不同的选项和参数,并根据用户提供的输入采取相应的操作。

getopts 命令基于 POSIX 标准,并且通常与 while 循环结合使用。它的语法如下:

bash 复制代码
while getopts "<options>" opt; do
    case $opt in
        <option1>)
            # 处理 option1 的操作
            ;;
        <option2>)
            # 处理 option2 的操作
            ;;
        \?)
            # 处理无效选项的操作或错误提示
            echo "Invalid option: -$OPTARG"
            ;;
    esac
done

其中,<options>为该脚本程序接受的参数列表,每个参数用一个字母表示;getopts会随着while循环挨个遍历参数列表,opt为匹配到的参数字符,OPTARG为当前匹配到的参数值,如果有的话。

比非所有参数都有值,可以在配置<options>参数列表时用冒号:标记改参数是否有值,例如:

bash 复制代码
#!/bin/bash
# file_name: my_script.sh

while getopts ":a:b:cde:fgh" opt
do
    case $opt in
        a)
            echo "Option -a is set with value $OPTARG"
            ;;
        b)
            echo "Option -b is set with value $OPTARG"
            ;;
        c)
            echo "Option -c is set"
            ;;
        d)
            echo "Option -d is set"
            ;;
        e)
            echo "Option -e is set with value $OPTARG"
            ;;
        f)
            echo "Option -f is set"
            ;;
        g)
            echo "Option -g is set"
            ;;
        h)
            echo "Option -h is set"
            ;;
        \?)
            echo "Invalid option: -$OPTARG"
            ;;
    esac
done
bash 复制代码
./my_script.sh -a apple -b36 -c -d -e ays -ghf -xyz
#>Option -a is set with value apple
#>Option -b is set with value 36
#>Option -c is set
#>Option -d is set
#>Option -e is set with value ays
#>Option -g is set
#>Option -h is set
#>Option -f is set
#>Invalid option: -x
#>Invalid option: -y
#>Invalid option: -z

总结一下,getopts从第一个脚本命令行参数开始,假如是以-开头,则识别为是传参,取-后面的一个字母做为传参名,然后到getopts配置的<options>参数列表中检查该传参是否有值。

如果该传参有配置值,取该命令行参数剩余部分为参数值,如果剩余部分为空字符串,则取下一个命令行参数做为参数值(不管下一个命令行参数是否以-开头);

如果该传参没有配置值,且当前命令行参数还有其他字符,则取下一个字符做为传参,继续判断;

如果该传参没有配置值,且当前命令行参数没有其他字符,则取下一个命令行参数,继续判断;

如果遇到一个命令行参数不是以-开头,或所有命令行参数遍历结束,getopts返回False,while循环结束;

<options>列表最前面一个:冒号可以适配未知传参,也可以理解为是无名传参,进而将其后面的字符串做为传参的值,然后进入case \?)分支。

相关推荐
树下水月4 小时前
linux 系统一键巡检sh
bash
雯宝6 小时前
mnt_init 函数
linux
律宏阔12 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔12 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴12 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千12 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3712 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3712 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3712 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW12 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux