[转帖]Linux——Shell脚本参数传递的2种方法
https://www.cnblogs.com/caoweixiong/p/12334418.html
前言
平时会遇到很多脚本都有参数选项,类似:
./test.sh -f config.conf -v --prefix=/home
这种脚本怎么写呢?
一、Shell 特殊参数解释
- 示例1:新建一个test.sh的文件

#!/bin/bash
echo $0 # 当前脚本的文件名(间接运行时还包括绝对路径)。
echo $n # 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1 。
echo $# # 传递给脚本或函数的参数个数。
echo $* # 传递给脚本或函数的所有参数。
echo $@ # 传递给脚本或函数的所有参数。被双引号 (" ") 包含时,与 $* 不同,下面将会讲到。
echo $? # 上个命令的退出状态,或函数的返回值。
echo $$ # 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
echo $_ # 上一个命令的最后一个参数
echo $! # 后台运行的最后一个进程的 ID 号

执行结果如下:

$ ./test.sh test test1 test2 test3 test4 ./test.sh # $0
# $n
5 # $#
test test1 test2 test3 test4 # $*
test test1 test2 test3 test4 # $@
0 # $?
12305 # $$
12305 # $_
# $!

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号 ("") 包含时,都以"$1""$2" … "$n" 的形式输出所有参数。
但是当它们被双引号 ("") 包含时,"$*"会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@"会将各个参数分开,以"$1""$2" … "$n" 的形式输出所有参数。
二、方法1:$0,$1,$2..
采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获取到参数。
- 示例2:新建一个test.sh的文件
#!/bin/bash
echo "脚本$0"
echo "第一个参数$1"
echo "第二个参数$2"
执行结果如下:

$ ./test.sh 1 2 #shell中将会输出:
脚本./test.sh
第一个参数1
第二个参数2

- 示例3:参数超过10个的情况,在test.sh文件写入

#!/bin/bash
echo "脚本名$0"
echo "第一个参数$1"
echo "第二个参数$2"
echo "第三个参数$3"
echo "第四个参数$4"
……
echo "第十个参数$10"
echo "第十个参数${10}"

执行结果如下:

$ ./test.sh a b c d e f g h i j #shell中将会输出:
脚本名./test.sh
第一个参数a
第二个参数b
第三个参数c
第四个参数d
第五个参数e
第六个参数f
第七个参数g
第八个参数h
第九个参数i
第十个参数j

优点:获取参数更容易,执行脚本时需要的输入少
缺点:必须按照顺序输入参数,如果中间漏写则参数对应就会错误
三、方法2:getopts
语法格式:getopts [option[:]] [DESCPRITION] VARIABLE
option:表示为某个脚本可以使用的选项
":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE:表示将某个选项保存在变量VARIABLE中
- 示例4:新建一个test.sh文件

while getopts ":a:b:c:" opt
do
case $opt in
a)
echo "参数a的值$OPTARG"
;;
b)
echo "参数b的值$OPTARG"
;;
c)
echo "参数c的值$OPTARG"
;;
?)
echo "未知参数"
exit 1;;:)echo "没有输入任何选项 $OPTARG";;
esac done

用一个while循环加case分支获取不同参数,:a:b:c相当于定义参数的变量名,有时候可能会有未知参数,所以增加一个?的分支。
执行结果如下:

$ ./test.sh -a 1 -b 2 -c 3 #在shell中的输出
参数a的值1
参数b的值2
参数c的值3

$ ./test.sh -a 1 -c 3 #在shell中的输出
参数a的值1
参数c的值3

$ ./test.sh -a 1 -c 3 -d 4 #在shell中的输出
参数a的值1
参数c的值3
未知参数

优点:由于使用了-a加参数值的方式进行一一匹配,所以不会参数匹配错误,同时也可以缺省参数,并不会导致参数错误,同时也便于后期参数的扩展和移植
缺点:脚本执行时参数需要的输入会增多
[转帖]Linux——Shell脚本参数传递的2种方法的更多相关文章
- 学习Linux shell脚本中连接字符串的方法
这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...
- Linux中执行shell脚本命令的4种方法总结
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
- 【Shell脚本】运行shell脚本文件的几种方法与区别
Shell脚本不同的运行方式会对当前Shell设置或者运行结果有所不同. 假设现在有一个脚本名为display_shell_script_args.sh,其内容如下: #!/home/pyf/bin/ ...
- SHELL脚本运行的几种方法以及区别
#1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh,如果如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可(这和运行 ...
- Shell脚本执行的四种方法
(1).bash(或sh) [脚本的相对路径或绝对路径] [xf@xuexi ~]$ cat a.sh #!/bin/bash echo "hello world!" [xf@xu ...
- shell脚本去重的几种方法
测试文件 [root@bogon ~]# cat >test jason jason jason fffffjason 按 Ctr + D保存 1.sort -u [root@bogon ~]# ...
- Linux Shell脚本面试25问
Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...
- 阿里Linux Shell脚本面试25个经典问答
转载: 阿里Linux Shell脚本面试25个经典问答 Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命 ...
- 【转】Linux Shell脚本面试25问
Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...
- Linux Shell脚本面试25个经典问答
1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Sh ...
随机推荐
- springboot-jpa获取session
springboot获取hibernate的session进行更精细的SQL操作,默认的jpa并不能满足一些复杂需求(可能是我把需求设计复杂了) 通过查看JpaRepository的底层实现,发现是通 ...
- 【开源项目】轻量元数据管理解决方案——Marquez
大家好,我是独孤风. 又到了本周的开源项目推荐.最近推荐的元数据管理项目很多,但是很多元数据管理平台的功能复杂难用. 那么有没有轻量一点的元数据管理项目呢? 今天为大家推荐的开源项目,就是一个轻量级的 ...
- 文心一言 VS 讯飞星火 VS chatgpt (59)-- 算法导论6.4 3题
文心一言 VS 讯飞星火 VS chatgpt (59)-- 算法导论6.4 3题 三.对于一个按升序排列的包含 n 个元素的有序数组 A 来说,HEAPSORT 的时间复杂度是多少?如果 A 是降序 ...
- Python函数加async,但没有加await可以异步吗
在Python中,如果一个函数被标记为async,这意味着它是一个异步函数.但是,仅仅因为一个函数被标记为异步并不意味着它会自动异步执行.为了使异步函数真正异步,你需要在函数内部使用await关键 ...
- 创建service后,kubernetes会发生什么
本文分享自华为云社区<当创建一个service后,kubernetes会发生什么?>,作者:可以交个朋友. 一.Service介绍 1.1 Kubernetes为什么会引入service? ...
- 实践案例丨GaussDB网络重传/丢包问题定位总结
摘要:本文将介绍几种常用手段,用于梳理数据库网络故障可能存在的问题,从而快速定位恢复. 1 问题背景 在GaussDB各类问题场景中,网络故障是最难定位及恢复的问题之一,其不仅可能影响着数据库的性能, ...
- 应用开发专家一席谈:开发低代码,上手低门槛,AppCube使能Citizen Developer,人人都是开发者
摘要:让不确定因子变为确定性因子,把复杂留给平台,简单留给开发者,是软件开发效率改进一直努力的方向,也是低代码理念的来源. 本文分享自华为云社区<应用开发专家一席谈:开发低代码,上手低门槛,Ap ...
- 云图说|ModelArts Pro:让AI开发更简单
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: ModelArt ...
- 浅谈sql执行流程、innodb架构设计、buffer pool缓冲池
一.从服务端到数据库sql执行流程: 1.SQL接口:负责处理接收到sql的语句 2.查询解析器:负责将sql变成数据库可以看懂的语言 3.查询优化器:选择最优的查询路径(针对你编写的复杂sql语句生 ...
- ubuntu下完全卸载重装docker教程
操作需在管理员权限下运行 卸载docker 1.删除docker的所有包 apt-get autoremove docker docker-ce docker-engine docker.io con ...