浅谈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 \?)分支。

相关推荐
南棱笑笑生3 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
silence2504 小时前
safe_sleep.sh: GitHub Actions Runner 中那个偶尔无限挂起的“小睡眠”脚本
bash
Sleepy MargulisItG5 小时前
【Linux网络编程】应用层协议:HTTP协议
linux·服务器·网络·http
G31135422735 小时前
Linux 内核设计中的核心思想与架构原则
linux·架构·php
zhuzewennamoamtf5 小时前
Linux内核platform抽象、数据结构、内核匹配机制
linux·运维·数据结构
Kira Skyler7 小时前
ELF文件解析 elf.o 文件主要内容.md
linux
逐梦吧!旅行者7 小时前
Linux MySQL 5.7用户管理与用户密码的设置问题
linux·mysql
RisunJan7 小时前
Linux命令-grpck命令(验证和修复组配置文件(`/etc/group` 和 `/etc/gshadow`)完整性的工具)
linux·运维·服务器
loosed7 小时前
Ubuntu mysql8 tar.xz 安装
linux·ubuntu·adb
Xの哲學7 小时前
Linux VxLAN深度解析: 从数据平面到内核实现的全面剖析
linux·服务器·算法·架构·边缘计算