SHELL脚本学习(四)命令行参数和选项

命令行参数和选项

传递参数
1、向脚本中传递命令行参数
脚本路径 参数1 参数2 ...
读取参数
1、位置参数
概述
 bash shell会将命令行参数指派给称作 位置参数 的特殊变量。位置参数 $0 是脚本名称, $1 是第一个命令行参数,$2 是第二个命令行参数... 
例:阶乘计算
#!/usr/bin/bash
echo script name is $0
res=1
for (( i=1; i<=$1;i++ ))
dores=$[ $res * $i ]
done
echo $res

测试:

~$ ./test.sh 5
script is ./test.sh
120
script is ./test.sh
~$ ./test.sh 10
3628800
两个问题
  • $0 会输出文件的路径,如果只想输出文件名可以使用bashname 命令。 $(basename $0)
  • 如果位置参数多于9个需要用大括号将数值部分括起来。如:${10}
2、特殊参数变量
$# 包含命令行参数的个数

间接引用位置参数的时候需要用大括号将数值部分括起来.并将大括号内的$替换成 !

echo Parameter number : $#
for (( i=1;i<=$#;i++ ))
doecho Parameter $i is ${!i} 
done
~$ ./test.sh 10 20
Parameter number : 2
Parameter 1 is 10
Parameter 2 is 20
$* 会将所有命令行参数当作一个单词
$@ 会将所有命令行参数当作一个字符串中的多个单词
#!/usr/bin/bash
echo \$*-------$*
for var in "$*"
doecho $var
doneecho "\$@-------$@"
for var in "$@"
doecho $var
done

输出:

~$ ./test.sh first second
$*-------first second
first second
$@-------first second
first
second
移动参数
概述
 shift命令可用于操作命令行参数,默认情况下shift将每个位置上变量左移一位。命令格式: shift n #n默认为1
例:用shift命令遍历命令行参数
count=1
while [ -n "$1" ]
doecho param \#$count = $1count=$[ $count + 1 ]shift
done

输出:


~$ ./test.sh first second third
param #1 = first
param #2 = second
param #3 = third
处理选项
1、像处理命令行参数一样处理选项
例:输出命令选项
#!/usr/bin/bash
while [ -n "$1" ]
do
case "$1" in-a|-b|-c) echo found "$1" option;;*)  echo "$1"  not an option;;esacshift
done

输出

$ ./test.sh -a  -b -c -d
found -a option
found -b option
found -c option
-d not an option

case命令格式参考 https://blog.csdn.net/weixin_37703001/article/details/139477905

2、分离参数和选项
 经常会碰到同时使用选项和参数的情况,linux的标准做法是使用特殊字符将两者分开,该字符会告诉脚本选项何时结束,命令行参数何时开始。这个特殊字符是双连字符(--)
例:输出选项和参数
#!/usr/bin/bash
while [ -n "$1" ]
do
case "$1" in-a|-b|-c) echo found "$1" option;;--) shiftbreak;;*)  echo "$1"  not an option;;esacshift
donecount=1
for var in "$@"
doecho param \#$count = $varcount=$[ $count + 1 ]
done

输出

~$ ./test.sh -a  -b -c  arg1 arg2 arg3
found -a option
found -b option
found -c option
arg1 not an option
arg2 not an option
arg3 not an option
~$ ./test.sh -a  -b -c -- arg1 arg2 arg3
found -a option
found -b option
found -c option
param #1 = arg1
param #2 = arg2
param #3 = arg3
3、处理含值的选项

有些选项需要一些额外的参数值。在这种情况下,命令行看起来像下面这样
./test.sh -a -b test1 -c

处理带参数的选项

#!/usr/bin/bash
while [ -n "$1" ]
do
case "$1" in-a|-c) echo found "$1" option;;-b) echo found -b option with parameter value $2shift;;--) shiftbreak;;*)  echo "$1"  not an option;;esacshift
done

输出

~$ ./test.sh -a  -b test1 -c
found -a option
found -b option with parameter value test1
found -c option
4、使用getopt命令
getopt命令格式

getopt optstring parameters

optstring:定义了有效的命令行选项,在需要参数值的选项字符后加冒号":"

在命令行中测试getopt

optstring=ab:c
parameters=“-a -b test1 -c arg1 arg2”

~$ getopt ab:c -a -b test1 -c arg1 arg2
-a -b test1 -c – arg1 arg2

在脚本中使用getopt

set命令的–选项可以把位置变量的值替换成set命令所指定的值

#!/usr/bin/bash
echo old parameter : "$@"
parameter=$(getopt ab:c "$@") set -- $parameter
echo new parameter :  "$@"while [ -n "$1" ]
do
case "$1" in-a|-c) echo found "$1" option;;-b) echo found -b option with parameter value $2shift;;--) shiftbreak;;*)  echo "$1"  not an option;;esacshift
done
echo end

输出:

~$ ./test.sh -a -b test1 -c arg1 arg2
old parameter : -a -b test1 -c arg1 arg2
new parameter : -a -b test1 -c -- arg1 arg2
found -a option
found -b option with parameter value test1
found -c option
end
5、使用getopts命令
getopts命令格式

getopts optstring variable

optstring:定义了有效的命令行选项,在需要参数值的选项字符后加冒号":"
getopts命令会用到两个变量

  • OPTIND环境变量保存参数列表中getopts正在处理的参数位置
  • OPTARG环境变量保存选项的附加参数值
#!/usr/bin/bash
echo old parmeter = $@
while getopts ab:c opt
docase "$opt" ina|c) echo found "$opt" option;;b) echo found -b option with parameter value $OPTARG;;*) echo $opt not an option;;esac
doneecho OPTIND = $OPTIND
shift $[ $OPTIND-1]
echo new parameter = $@for var in "$@"
doecho $var is a parameter
done

输出

~$ ./test.sh -a -b test1 -c arg1 arg2
old parmeter = -a -b test1 -c arg1 arg2
found a option
found -b option with parameter value test1
found c option
OPTIND = 5
new parameter = arg1 arg2
arg1 is a parameter
arg2 is a parameter

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6月07日,每日信息差

第一、公安部开展 「净风」 专项行动&#xff0c;已破获 17 起重大案件&#xff0c;打掉 48 个制售假 「特供酒」 犯罪团伙&#xff0c;抓获 417 名嫌疑人&#xff0c;涉案金额达 8.9 亿元。这些假酒质量低劣、存在商标侵权等问题&#xff0c;公安部将持续严打此类犯罪&#xf…

Windows mstsc

windows mstsc 局域网远程计算机192.168.0.113为例&#xff0c;远程控制命令mstsc

鸿蒙开发接口数据管理:【@ohos.data.rdb (关系型数据库)】

关系型数据库 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制&#xff0c;对外提供了一系列的增、删、改、查等接口&#xff0c;也可…

数据结构:哈夫曼树及其哈夫曼编码

目录 1.哈夫曼树是什么&#xff1f; 2.哈夫曼编码是什么&#xff1f; 3.哈夫曼编码的应用 4.包含头文件 5.结点设计 6.接口函数定义 7.接口函数实现 8.哈夫曼编码测试案列 哈夫曼树是什么&#xff1f; 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种特殊的二叉树&#xf…

Message forwarding mechanism (消息转发机制)

iOS的消息转发机制 iOS的消息转发机制是在消息发送给对象时&#xff0c;找不到对应的实例方法的情况下启动的。消息转发允许对象在运行时处理无法识别的消息&#xff0c;提供了一种动态的、灵活的消息处理方式。 消息转发机制主要分为三个阶段&#xff1a; 动态方法解析快速…

香港高才通计划续签,很可能大部分人都要烂尾

自2022年12月28日推出以来&#xff0c;截至2024年2月29日&#xff0c;高才通计划申请人数超过了7万宗&#xff0c;获批人数将近6万。 这张表格是从2022年到2023年每个月申请人数情况&#xff0c;高峰时间段达到了一个月7166人申请&#xff1a; 香港高才通计划申请人数72508人&…

PostgreSQL基础(九):PostgreSQL的事务介绍

文章目录 PostgreSQL的事务介绍 一、什么是ACID&#xff08;常识&#xff09; 二、事务的基本使用 三、保存点&#xff08;了解&#xff09; PostgreSQL的事务介绍 一、什么是ACID&#xff08;常识&#xff09; 在日常操作中&#xff0c;对于一组相关操作&#xff0c;通常…

python数据分析-问卷数据分析(地理课)

学生问卷 分析学生背景&#xff1a;班级分布、每周地理课数量、地理成绩分布 根据问卷&#xff0c;可以知道&#xff1a; 班级分布&#xff1a; 七年级有118名学生。 八年级有107名学生。 每周地理课的数量&#xff1a; 有28名学生每周有1节地理课。 有99名学生每周有2…

重新学习STM32(2)NVIC

概念简介 NVIC&#xff0c;即嵌套向量中断控制器&#xff0c;控制着中断相关的功能&#xff0c;是内核里面的一个外设。 中断在单片机编程中的作用是使单片机能及时响应需要立即处理的事件&#xff0c;但是这些事件也分紧急和非紧急&#xff0c;因此需要优先级来区分。…

Mysql基础教程(14):UNION

MySQL UNION 的用法与实例 在本文中&#xff0c;我们讨论在 MySQL 中对两个结果集进行 UNION 运算&#xff0c;以及 UNION 运算的规则。 在 MySQL 中&#xff0c;UNION 操作符是一个集合操作符&#xff0c;它用于合并 【2 个结果集】中的所有的行。 SQL 标准中定义了 3 个集…

MongoDB 正则表达式详解:高效数据查询与处理技巧

MongoDB 的正则表达式&#xff08;Regular Expression&#xff09;功能允许在查询中进行模式匹配和文本搜索&#xff0c;为用户提供了强大的灵活性。 基本语法 MongoDB 中使用正则表达式时&#xff0c;通常是在查询语句中使用 $regex 操作符。基本语法如下&#xff1a; { &l…

Spring AI 第二讲 之 Chat Model API 第八节Anthropic 3 Chat

Anthropic Claude 是一系列基础人工智能模型&#xff0c;可用于各种应用。对于开发人员和企业来说&#xff0c;您可以利用 API 访问&#xff0c;直接在 Anthropic 的人工智能基础架构之上进行构建。 Spring AI 支持用于同步和流式文本生成的 Anthropic 消息 API。 Anthropic …

MSA(the Method of Successive Averages)算法的满足条件是怎么来的?

文章目录 摘要前言MSA算法MSA算法简介与来源算法收敛性证明使用MSA算法对确定性网络均衡问题收敛性的验证使用MSA算法对随机网络均衡问题收敛性的验证 此文章属于文献研读内容&#xff0c;文章内容来源于以下文献 Warren B. Powell, Yosef Sheffi , (1982) The Convergence of …

二轴机器人大米装箱机:技术创新引领智能包装新潮流

在科技日新月异的今天&#xff0c;自动化和智能化已成为各行各业追求高效、精准生产的关键。作为粮食加工行业的重要一环&#xff0c;大米装箱机的技术创新与应用价值日益凸显。其中&#xff0c;二轴机器人大米装箱机以其高效、稳定、智能的特点&#xff0c;成为市场的新宠。星…

Python怎么循环计数:深入解析与实践

Python怎么循环计数&#xff1a;深入解析与实践 在Python编程中&#xff0c;循环计数是一项基础且重要的技能。无论是处理列表、遍历文件&#xff0c;还是执行重复任务&#xff0c;循环计数都发挥着不可或缺的作用。本文将从四个方面、五个方面、六个方面和七个方面详细阐述Py…

Python爬虫小练习

爬虫的本质 爬虫的本质就是通过程序模拟正常人向网站发送请求获取信息。 关于爬虫的一些闲聊 按照我们的常识来说&#xff0c;我们不可能在1秒钟访问这个网站100次&#xff0c;请求100次数据&#xff0c;所以过多的请求很有可能会被网站认为你在使用脚本进行爬虫&#xff0c…

从入门到精通:基础IO

引言 在编程的世界里&#xff0c;文件输入输出&#xff08;IO&#xff09;是与操作系统交互的重要方式。无论你是开发应用程序、处理数据&#xff0c;还是管理系统资源&#xff0c;掌握文件IO操作都是必不可少的。本篇博客将带你深入了解C语言中的基础IO操作&#xff0c;从入门…

使用 IPSET 添加 CDN 节点 IP(IPv4/IPv6)到防火墙白名单

明月的服务器一直使用的是 iptables,随着近几年 IPv6 的普及&#xff0c;明月切身体会到还是 IPSET 最方便了&#xff0c;无论你是 IPv4 还是 IPv6 都可以方便的管理&#xff0c;无论你是加入白名单还是黑名单&#xff0c;都非常的简单高效&#xff01;今天就参照明月自己的实操…

东方博宜1317 - 正多边形每个内角的度数?

问题描述 根据多边形内角和定理&#xff0c;正多边形内角和等于&#xff1a;&#xff08; n&#xff0d;2 &#xff09; 180∘( n 大于等于 3 且 n 为整数&#xff09;。 请根据正多边形的边数&#xff0c;计算该正多边形每个内角的度数。&#xff08;结果保留1位小数&#x…

Python 机器学习 基础 之 【实战案例】新闻内容分类实战

Python 机器学习 基础 之 【实战案例】新闻内容分类实战 目录 Python 机器学习 基础 之 【实战案例】新闻内容分类实战 一、简单介绍 二、新闻内容分类实战 三、数据准备 四、分词与清洗工作 1、读取数据 2、使用 jieba 分词器进行分词&#xff0c;使用 Pandas 创建Data…