shell 使用 getopt 获取命令行参数。

在使用 getopt 解析命令行参数时,可以处理像 -t 1.1 这样的参数。以下是一个示例脚本,展示了如何使用 getopt 来解析这些参数。

#!/bin/bash

# 使用 getopt 来解析命令行参数
TEMP=$(getopt -o t: --long tag: -n 'example.bash' -- "$@")

# 检查 getopt 的返回值,如果 getopt 返回一个错误代码,那么脚本退出
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# 重新设置被解析的参数,将 getopt 生成的参数重新设置到 $@ 中。
eval set -- "$TEMP"

# 初始化变量
TAG_VALUE=""

# 解析选项
while true ; do
    case "$1" in
		-t|--tag) # 如果匹配到 `-t` 或 `--test`,则将其参数保存到 `TEST_VALUE` 中,并用 `shift 2` 移动到下一个参数。	        
            TAG_VALUE="$2"; shift 2 ;;
        --) shift ; break ;; # 遇到 `--` 时结束选项解析。
        *) echo "Internal error!" ; exit 1 ;; # 捕捉任何未知的选项。
    esac
done

# 输出解析结果
echo "Tag value: $TAG_VALUE"

# 剩余的非选项参数
echo "Remaining arguments: $@"
  • -o t:: 短选项 t 需要一个参数。

  • --long tag:: 长选项 --tag 需要一个参数。

  • -n 'example.bash': 为错误信息指定脚本名称。

  • -- "$@": 处理所有传递给脚本的参数。

  • getopt 返回的字符串是处理后的参数列表,将其赋值给变量 TEMP。这些处理后的参数可能包括一些添加的标记和分隔符(例如 --)以帮助进一步的参数解析。

  • -- 是一个特殊标记,用于告诉 getopt 解析器,后面的所有内容都是非选项参数,即使它们看起来像选项。例如,-t 是一个选项,但 -- -t 后面的 -t 会被视为一个普通参数而不是选项。

getopt 解析命令行参数的过程中,eval set -- "$TEMP" 这一行的目的是重新设置脚本的参数列表,以便可以按照标准的方式解析和处理这些参数。

  • eval 是一个 shell 内建命令,它会重新计算(或执行)传递给它的字符串。当你使用 eval set -- "$TEMP" 时,eval 会将 $TEMP 的内容作为命令来执行。
    例如:

    expression="3 + 4" 
    eval result=$((expression)) 
    echo "Result: $result"	
    

    这段脚本将计算 3 + 4 的结果并输出 Result: 7

    cmd="ls -l" 
    eval $cmd	
    

    这段脚本将执行 ls -l 命令,列出当前目录的详细信息。

  • set -- 会重置位置参数 ($1, $2, 等)。并确保后续的参数被视为普通参数而不是选项。当后面跟上 "$TEMP" 的内容时,它会将这些内容设置为新的位置参数。
    例如:

    set -- -t somefile.txt 
    echo $1 # 输出: -t 
    echo $2 # 输出: somefile.txt	
    

当你使用 getopt 来解析命令行参数时,返回的字符串中可能包含一些复杂的内容,例如引号和空格。为了正确处理这些内容并重新设置脚本的参数列表,使用 eval 可以确保这些参数被正确解析和传递。如果你直接使用 set -- "$TEMP",则 $TEMP 的内容会被视为单个字符串参数,而不是多个参数。

例如:

#!/bin/bash

TEMP=$(getopt -o t: --long test: -n 'example.sh' -- "$@")

if [ $? != 0 ]; then
    echo "Terminating..." >&2
    exit 1
fi

set -- "$TEMP"
echo "Before eval: $TEMP"
echo "\$1: $1"
echo "\$2: $2"
echo "\$3: $3"

eval set -- "$TEMP"
echo "After eval: $TEMP"
echo "\$1: $1"
echo "\$2: $2"
echo "\$3: $3"

输出:

$ ./example.sh -t "value with spaces" otherarg
Before eval:  -t 'value with spaces' -- 'otherarg'
$1:  -t 'value with spaces' -- 'otherarg'
$2:
$3:
After eval:  -t 'value with spaces' -- 'otherarg'
$1: -t
$2: value with spaces
$3: --

getopt 返回的字符串已经包含了所有解析后的选项和参数,这样可以确保参数的顺序和格式符合预期。通过 eval set -- "$TEMP",你可以将这些解析后的参数重新传递给脚本的参数列表,使得后续的 while 循环可以正确地解析这些参数。

shift 命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理。

例如:依次读取输入的参数并打印参数个数

#!/bin/bash
while [ $# != 0 ]; do
	echo "prama is $1, prama size is $#"
	shift
done

输入如下命令运行:

./shift_test.sh a b c
prama is a, prama size is 3
prama is b, prama size is 2
prama is c, prama size is 1

每次运行 shift(不带参数的),销毁一个参数,后面的参数前移。

Shift 命令一次移动参数的个数由其所带的参数指定。例如当 shell 程序处理完前九个命令行参数后,可以使用 shift 9 命令把 $10 移到 $1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/714368.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot实现的大文件上传

前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题,以提高文件传输的效率和稳定性。 首先,大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间,因为较小的文件片段更容易快…

【秋招突围】2024届秋招笔试-小红书笔试题-第二套-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📧 清隆这边…

高频小信号放大器的分类与质量指标

目录 分类 质量指标 增益 通频带 选择性 稳定性 噪声系数 分类 质量指标 增益 电压与功率的放大倍数。 通频带 放大效果比较好的频率范围。 选择性 放大目标信号以滤除其他信号的综合能力。 稳定性 噪声系数

chatglm4本地部署详解

下载地址 模型下载地址:GitHub - THUDM/GLM-4: GLM-4 series: Open Multilingual Multimodal Chat LMs | 开源多语言多模态对话模型 已经训练好的数据下载地址: https://huggingface.co/THUDM/glm-4-9b-chat-1m/tree/main 测试主机配置 cpu:E…

pdf转图片,pdf转图片在线转

pdf转图片的方法,对于许多人来说可能是一个稍显陌生的操作。然而,在日常生活和工作中,我们有时确实需要将pdf文件转换为图片格式,以便于在特定的场合或平台上进行分享、展示或编辑。以下,我们将详细介绍一个pdf转成图片…

【网络安全的神秘世界】AppScan安装及使用指南

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 https://www.hcl-software.com/appscan AppScan是一种综合型漏洞扫描工具,采用SaaS解决方案,它将所以测试功能整合到一个服务中&a…

Java基础——网络编程(一)

初识网络编程 网络编程:在网络通信协议下,不同计算机上运行的程序,进行的数据传输 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件…… BS架构的优缺点: 1、不需要开发客户端,只需要页面服务端 2、…

Redis 键空间迭代 Scan

引言 在平时线上Redis维护工作中,有时候需要从Redis实例成千上万的key中找出特定前缀的key列表来手动处理数据,可能是修改他的值,也可能是删除key。 Redis提供了一个简单暴力的指令keys用来列出所有满足特定正则字符串规则的key。 127.0.0…

26.1 WEB框架介绍

1. Web应用程序 1.1 应用程序有两种模式 应用程序的架构模式主要分为两种: C/S (客户端/服务器端)和B/S(浏览器/服务器端). * 1. C/S模式, 即客户端/服务器模式(Client/Server Model): 是一种分布式计算模式.它将应用程序的功能划分为客户端和服务器端两部分.在这种模式下, 客…

几种经典排序算法

几种经典排序算法 插入排序折半插入排序法 选择排序冒泡排序希尔排序堆排序二路归并排序快速排序 在介绍排序之前,先来说说,研究不同的排序主要是要研究他们的哪些不同: 时间性能。即排序过程中元素之间的比较次数与元素移动次数。我们此次讨…

【最新鸿蒙应用开发】——鸿蒙中的“Slot插槽”?@BuilderParam

构建函数-BuilderParam 传递 UI 1. 引言 BuilderParam 该装饰器用于声明任意UI描述的一个元素,类似slot占位符。 简而言之:就是自定义组件允许外部传递 UI Entry Component struct Index {build() {Column({ space: 15 }) {SonCom() {// 直接传递进来…

IPv6 ND 协议功能概述

ND 协议功能概述 ND(Neighbor Discovery,邻居发现)协议是 IPv6 的一个关键协议,它综合了 IPv4 中的 ARP,ICMP 路由发现和 ICMP 重定向等协议,并对它们做了改进。 作为 IPv6 的基础性协议,ND 协…

ppt添加圆角矩形,并调整圆角弧度方法

一、背景 我们看的论文,许多好看的图都是用PPT做的,下面介绍用ppt添加圆角矩形,并调整圆角弧度方法。 二、ppt添加圆角矩形,并调整圆角弧度 添加矩形: 在顶部工具栏中,点击“插入”选项卡。 在“插图”…

冒泡排序知识点

排序的基本概念 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录调整为“有序”的记录序列。 常用的排序例子 8 7 1 5 4 2 6 3 9 把上面的这个无序序列变为有序(升序或者降序)序列的过程。 1 2 3 4 5 6 7 8 9&#xff0…

Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求

测试表现层的代码如何测试 加载测试的专用属性 首先写一个测试 假定我们进行测试的时候要加一些属性 要去修改一些属性 我们可以写一个只在本测试有效的测试 写在配置里 测试 打印输出 我们把配置文件里面的配置注释掉后 我们同样可以启动 package com.example.demo;impo…

代码随想录——组合总和Ⅱ(Leetcode 40)需要回顾

题目链接 回溯 本题的难点在于:集合(数组candidates)有重复元素,但还不能有重复的组合。 思想:元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。所以要去重的是同一树…

购物车店铺列表查询流程

购物车店铺列表查询流程 购物车结算流程图

嵌入式门槛高不高,工资怎么样?

一般来说,嵌入式岗位的准入门槛其实并不是特别高。通常情况下,只要能够熟练掌握 C 语言编程以及单片机相关知识,就能够去制作一些较为简单的电子产品,由此可见其门槛相对而言是比较低的,相应的薪水可能也不会特别高。 …

I2C 总线通信技术基础

1.0 I2C 技术基础 使用总线的目的:采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高,同时,系统的更改和扩充变的极为容易。 通信中常用的串行拓展总线 I2C(Inter-Integrated Circuit )总线…

C语言程序设计-6 循环控制

C语言程序设计-6 循环控制 循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序 段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语 言提供了多种循环语句&a…