当前位置: 首页 > news >正文

shell --getopts

getopts 是一个在Bash和其他兼容的shell中用于解析命令行选项的内置命令,它可以让脚本方便地处理用户传入的各种选项和参数。

1. 基本语法

getopts optstring name [args]
  • optstring:由合法选项字符组成的字符串。如果某个选项字符后面跟着一个冒号 :,表示该选项需要一个参数;如果冒号在 optstring 开头,则表示开启错误抑制模式。
  • name:用于存储当前解析到的选项字符的变量名。
  • [args]:可选参数,指定要解析的参数列表。若省略,默认使用 $@(即脚本接收到的所有命令行参数)。

2. 返回值

  • getopts 执行成功时返回 0(表示真),意味着还有选项需要解析。
  • 当所有选项都解析完毕后,返回 1(表示假),用于终止循环。

3. 内置变量

  • OPTARG:当某个选项需要参数时,getopts 会将该参数赋值给 OPTARG 变量。
  • OPTIND:记录当前解析到的参数的索引位置。初始值为 1,每解析一个选项,OPTIND 就会递增。在处理完选项后,可以使用 shift $((OPTIND - 1)) 来跳过已解析的选项,使 $1 指向第一个非选项参数。
  • OPTERR:用于控制是否显示 getopts 的错误信息。默认值为 1,表示显示错误信息;若设置为 0,则不显示。

4. 选项字符规则

  • 无参数选项:在 optstring 中,单个字符表示该选项不需要参数。例如,"abc" 表示支持 -a-b-c 三个无参数选项。
  • 带参数选项:在 optstring 中,字符后面跟一个冒号 : 表示该选项需要一个参数。例如,"a:b" 表示 -a 选项需要一个参数,-b 选项不需要参数。
  • 选项组:多个选项可以连写,只要它们都是无参数选项。例如,对于 optstring"abc"-abc 等同于 -a -b -c

5. 错误处理

  • 无效选项:当用户输入的选项不在 optstring 中时,getopts 会将 name 变量设置为 ?,并默认输出错误信息。可以通过将 OPTERR 设置为 0 来抑制错误信息,然后在脚本中自行处理。
  • 缺少参数:当需要参数的选项没有提供参数时,getopts 在不同的shell环境下有不同的行为。在Bash中,如果 optstring 开头没有冒号,getopts 会将 name 变量设置为 ?,并输出错误信息;如果 optstring 开头有冒号,getopts 会将 name 变量设置为 :,表示缺少参数。

6. 示例代码及详细解释

#!/bin/bash

# 抑制 getopts 的错误信息
OPTERR=0

# 定义选项字符串,a 无参数,b 有参数
optstring=":a:b"

while getopts "$optstring" opt; do
    case $opt in
        a)
            echo "选项 -a 已指定"
            ;;
        b)
            echo "选项 -b 已指定,参数为 $OPTARG"
            ;;
        \?)
            echo "无效的选项: -$OPTARG" >&2
            ;;
        :)
            echo "选项 -$OPTARG 需要一个参数" >&2
            ;;
    esac
done

# 移动参数指针,跳过已解析的选项
shift $((OPTIND - 1))

# 处理剩余的非选项参数
if [ $# -gt 0 ]; then
    echo "剩余的非选项参数:"
    for arg in "$@"; do
        echo "  $arg"
    done
else
    echo "没有剩余的非选项参数"
fi

代码解释

  1. OPTERR=0:将 OPTERR 设置为 0,抑制 getopts 的默认错误信息。
  2. optstring=":a:b"optstring 开头的冒号开启错误抑制模式,a 是无参数选项,b 是带参数选项。
  3. while getopts "$optstring" opt; do ... done:使用 while 循环调用 getopts 解析选项,直到所有选项都解析完毕。
  4. case $opt in ... esac:根据不同的选项字符执行不同的操作。
    • \?):处理无效选项,输出错误信息。
    • :):处理缺少参数的情况,输出错误信息。
  5. shift $((OPTIND - 1)):跳过已解析的选项,使 $1 指向第一个非选项参数。
  6. 处理剩余的非选项参数:使用 for 循环遍历剩余的非选项参数并输出。

7. 长选项处理

getopts 本身不支持长选项(如 --help),但可以通过一些技巧来模拟处理长选项。例如:

#!/bin/bash

while [ $# -gt 0 ]; do
    case $1 in
        --help)
            echo "这是帮助信息"
            ;;
        --verbose)
            echo "启用详细模式"
            ;;
        *)
            break
            ;;
    esac
    shift
done

# 处理剩余的非选项参数
if [ $# -gt 0 ]; then
    echo "剩余的非选项参数:"
    for arg in "$@"; do
        echo "  $arg"
    done
else
    echo "没有剩余的非选项参数"
fi

8. 注意事项

  • 选项顺序getopts 会按顺序解析选项,遇到第一个非选项参数时停止解析。因此,非选项参数应放在选项之后。
  • 参数传递:带参数的选项和其参数之间可以有空格,也可以没有空格。例如,-b value-bvalue 都可以被正确解析。
http://www.dtcms.com/a/66583.html

相关文章:

  • 分布式事务的产生背景及理论指导
  • 如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法
  • Java基础:枚举类enum入门案例
  • 深入浅出C++ STL:统领STL全局
  • RGV调度算法(三)--遗传算法
  • 响应式数据和双向绑定关系
  • 监控快手关注列表更新以及去视频水印视频
  • qt 自带虚拟键盘的编译使用记录
  • Unity 使UI始终朝向摄像机
  • Operator <=> (spaceship operator)
  • AI赋能办公效率的革命(以DeepSeek为例)
  • AI日报 - 2025年3月14日
  • C语言 第四章 数组(3)
  • 【微知】tmux如何在一个会话的1个窗口中水平分割或者垂直分割窗口?(垂直 Ctrl + b, %; 切换Ctrl + b, 方向键; ctrl d关闭)
  • 电子学会—2024年12月青少年软件编程(图形化)二级等级考试真题——魔法扫帚
  • 使用 PresentMon 获取屏幕帧率
  • 用于 RGB-D 显著目标检测的点感知交互和 CNN 诱导的细化网络
  • 21.dirsearch:Web 路径扫描工具
  • C语言高级进阶3
  • “Ubuntu禁止root用户通过SSH直接登录”问题的解决
  • 58.Harmonyos NEXT 图片预览组件架构设计与实现原理
  • hackme靶场攻略
  • CSV文件保存后内容缩在首格内
  • 基于Java 童装在线销售系统(源码+lw+部署文档+讲解),源码可白嫖!
  • conda创建Python虚拟环境的原理
  • 线性代数(1)用 excel 计算鸡兔同笼
  • d3_v7 基于 d3.arc()生成径向柱状图
  • CMake
  • 多线程与并发编程 面试专题
  • SQLAlchemy系列教程:批量插入数据