Shell脚本中使用getopts处理多命令行选项

当我们在编写Shell脚本时,通常需要从命令行中获取参数和选项。在Unix和Linux系统中,有一个非常强大的工具可以用来解析和处理命令行选项,那就是getopts。getopts是一个内置的命令行解析工具,可以快速处理多个选项和参数。

getopts基本语法

getopts的基本语法如下:

while getopts "options" opt; do
    case ${opt} in
        o ) #处理选项 o
            ;;
        a ) #处理选项 a
            ;;
        ? ) #处理无法识别的选项
            ;;
    esac
done
  • "options"是一个由选项字符组成的字符串,表示要处理的选项,每个选项字符前面可以加冒号":"表示这个选项需要附加参数;
  • opt是当前解析到的选项字符;
  • case语句用来根据opt处理不同的选项。

示例1:处理不带参数的选项

比如我们有一个脚本需求需要支持以下三个选项:

  • -h:显示帮助;
  • -v:显示版本号;
  • -d:输出调试信息。
#!/bin/bash
while getopts "hvd" opt; do
    case ${opt} in
        h ) 
            echo "Usage: command [-hvd] [arguments]"
            echo "Options:"
            echo "  -h: Display help message."
            echo "  -v: Display version number."
            echo "  -d: Turn on debugging information."
            exit 0 ;;
        v ) 
            echo "Version 1.0"
            exit 0 ;;
        d ) 
            shift #取下一个参数作为debug选项的值
            echo "Debug mode is on. Value: $1"
            break ;;
        \? ) 
            echo "Invalid option: -$OPTARG" 1>&2
            exit 1 ;;
        : )
            echo "Option -$OPTARG requires an argument." 1>&2
            exit 1 ;;
    esac
done

在上面的代码中,我们使用了shift命令将选项参数从命令行中删除,并把它赋值给$1变量,然后在下面的代码中就可以使用$1.

示例2:处理带参数的选项

现在我们需要实现一个脚本支持以下选项:

  • -f filename:指定一个文件名;
  • -d dirname:指定一个目录名。
#!/bin/bash
while getopts "f:d:" opt; do
    case ${opt} in
        f ) 
            echo "File name: $OPTARG" ;;
        d ) 
            echo "Directory name: $OPTARG" ;;
        \? ) 
            echo "Invalid option: -$OPTARG" 1>&2
            exit 1 ;;
        : )
            echo "Option -$OPTARG requires an argument." 1>&2
            exit 1 ;;
    esac
done
shift $((OPTIND -1))

在上面的代码中,我们在选项字符后面加上冒号,表示该选项需要一个参数,然后在case语句中使用变量OPTARG获取参数值。

getopts还有很多的高级用法,可以通过man getopts来查看详细的帮助文档。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Shell脚本中使用getopts处理多命令行选项 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • uniapph5页面使用uni.request时 出现跨域问题

    以下是关于“uniapp h5页面使用uni.request时出现跨域问题”的完整攻略,过程中包含两个示例。 背景 在uniapp开发中,我们有时需要在h5页面使用uni进行网络请求。但是,由于浏览器的同源策略,可能会出现跨域问题。本攻略将介绍如何决uniapp h5页面使用uni.request时出现跨域问题。 基本原理 在uniapp中,我们可以通过配置…

    other 2023年5月9日
    00
  • Firefox 48.0.2正式版发布下载 修复启动崩溃问题(附下载地址)

    Firefox 48.0.2正式版发布下载 修复启动崩溃问题(附下载地址)攻略 简介 Firefox 48.0.2正式版是一款流行的网络浏览器,它提供了快速、安全和可定制的上网体验。此版本修复了启动崩溃问题,为用户提供更加稳定的使用环境。 下载地址 你可以从以下地址下载Firefox 48.0.2正式版:官方下载地址 攻略步骤 步骤一:访问官方网站 首先,打…

    other 2023年8月4日
    00
  • python版本单链表实现代码

    让我来详细讲解一下“python版本单链表实现代码”的完整攻略。 1. 单链表介绍 单链表是一种数据结构,它由多个节点构成,每个节点包含数据和指向下一个节点的指针。单链表的特点是插入和删除的时间复杂度为O(1),但访问的时间复杂度为O(n)。具体实现时,我们需要定义一个链表节点类Node和链表类LinkedList来表示单链表。 2. 链表节点类Node 链…

    other 2023年6月27日
    00
  • decimal和float的区别

    decimal和float的区别 在计算机科学中,decimal和float都是常见的数据类型。它们在存储和处理数字时有着不同的特点和用途。本文将详细讲解decimal和float的区别,包括基本概念、应用场景、精度和范围、实现方法和示例说明。 基本概念 Decimal:Decimal是一种高精度的十进浮点数类型,通常用于需要高度计算的场景,如财务和科学计算…

    other 2023年5月7日
    00
  • 手把手教你用VS code快速搭建一个Golang项目

    下面是手把手教你用VS code快速搭建一个Golang项目的完整攻略。 1. 创建项目 打开VS code,在项目文件夹下,右键选择“新建文件夹”。 在弹出的窗口中,填写项目名称,例如“myproject”,然后点击确定。 2. 初始化项目 打开终端,进入项目文件夹:cd myproject 初始化项目:go mod init myproject 3. 编…

    other 2023年6月27日
    00
  • 做好用户生命周期分析与管理的方法

    做好用户生命周期分析与管理对于网站的运营非常重要,可以帮助网站更好地了解用户,提升用户粘性,提升转化率。下面是一些方法和步骤,来帮助我们更好地进行用户生命周期分析与管理。 方法和步骤 步骤1:收集数据 首先,我们需要收集用户相关的数据,包括网站流量、用户行为特征、用户活跃度等等。我们可以通过网站的统计工具(例如Google Analytics等)或第三方数据…

    other 2023年6月27日
    00
  • win7卸载yarn

    以下是关于“Win7卸载Yarn”的完整攻略: 卸载Yarn 如果您想卸载Yarn,可以按照以下步骤进行操作: 打开控制面板。 单击“程序和功能”。 在程序列表中,找到Yarn。 单击Yarn,然后单击“卸载”。 按照卸载向导的指示完成卸载过程。 示例1:在控制面板中卸载Yarn 以下是一个示例,演示如何在控制面板中卸载Yarn: 单击“开始”按钮,然后单击…

    other 2023年5月6日
    00
  • 通过案例详细聊聊Go语言的变量与常量

    通过案例详细聊聊Go语言的变量与常量 Go语言是一种静态类型、编译型的编程语言,它提供了丰富的变量和常量的定义和使用方式。在本文中,我们将通过案例来详细讲解Go语言中的变量和常量。 变量 变量的声明和初始化 在Go语言中,变量的声明和初始化可以分开进行,也可以一起进行。下面是一个示例: package main import \"fmt\&quot…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部