Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数

字符串运算

if [ “$name” == “John” ]; then
echo “Hello, John!”
fi

逻辑运算

if [ $age -gt 18 ] && [ $gender == “male” ]; then
echo “You are a man.”
fi


以上是Shell脚本的基础知识,掌握了这些知识可以编写简单的脚本来自动化执行任务,进一步学习可以掌握Shell脚本的高级用法,例如正则表达式、管道、重定向、进程控制等。


### 2. 参数传递


#### 2.1 位置参数


在shell脚本中,可以使用位置参数来传递信息。可以使用$1、$2、$3等来访问它们。例如:



#!/bin/bash
echo “The first argument is $1”
echo “The second argument is $2”


在命令行中执行该脚本时,可以传递两个参数,如下所示:



$ ./script.sh hello world


输出:



The first argument is hello
The second argument is world


#### 2.2 特殊变量


shell提供了许多特殊变量来传递额外的信息,例如:


* `$0`:表示脚本名称。
* `$#`:表示传递给脚本的参数个数。
* `$@`:表示所有传递给脚本的参数的列表。
* `$?`:表示上一个命令的返回值。


这也解释了为什么位置参数是从1开始的了,`$0`经常用在日志里,说明当前执行的脚本名称。


例如:



#!/bin/bash
echo “The script name is $0”
echo “The number of arguments is $#”
echo “The arguments are $@”
echo “The return value of the last command is $?”


在命令行中执行该脚本时,可以传递任意个数的参数,如下所示:



$ ./script.sh a b c


输出:



The script name is ./script.sh
The number of arguments is 3
The arguments are a b c
The return value of the last command is 0


#### 2.3 环境变量


可以使用环境变量来传递信息。在shell脚本中,可以使用$VAR的形式来访问环境变量。例如:



#!/bin/bash
echo “The value of HOME is $HOME”
echo “The value of PATH is $JAVA_HOME”


在命令行中执行该脚本时,输出环境变量的值,如下所示:



$ ./script.sh
The value of HOME is /root
The value of PATH is /usr/local/java/jdk1.8.0_241


在脚本里获取环境变量,可对执行环境进行检验。


#### 2.4 命名参数


##### 2.4.1 getopts


`getopts`是Bash shell自带的命令行参数处理工具,它的语法比较简单,只支持处理单个字母选项,例如`-a`、`-b`等。`getopts`只能处理短选项,也就是只能使用一个字母来表示选项,如果要处理长选项,需要编写更多的代码。另外,`getopts`处理命令行参数时会把选项和参数分别处理,不能处理连续的选项,例如`-abc`。



测试脚本

#!/bin/bash
while getopts n🅰️g: opt
do
case " o p t " i n n ) n a m e = {opt}" in n) name= opt"inn)name={OPTARG};;
a) age= O P T A R G ; ; g ) g e n d e r = {OPTARG};; g) gender= OPTARG;;g)gender={OPTARG};;
esac
done
echo “NameVal: $name”;
echo “AgeVal: $age”;
echo “GenderVal: $gender”;



脚本调用

./script.sh -n Kite -a 18 -g f
NameVal: Kite
AgeVal: 18
GenderVal: f


##### 2.4.2 getopt


`getopt`是GNU工具集中的一个命令行参数处理工具,它支持更多的选项和语法,可以处理短选项和长选项,还可以处理连续的选项。`getopt`的语法比`getopts`更加复杂,需要指定一个选项字符串,包含了所有支持的选项和参数。`getopt`将解析后的选项和参数保存在一个数组中,需要在代码中处理这个数组。


`getopt`命令有以下几个参数:


* `-o`:指定单字符选项。选项之间无需分隔符。
* `--long`:指定长选项。长选项之间使用逗号分隔。
* `:`:选项后添加冒号说明当前选项需要参数值。
* `--`:分割选项和参数。
* `"$@"`:表示将所有命令行参数作为一个字符串传递给`getopt`命令。


`options=$(getopt -o n:a:g:p --long name:,age:,gender:,print -- "$@")`会解析命令行选项和参数,并将转换后的选项和参数存储在变量`options`中。这个变量通常会传递给一个`eval`命令进行处理,例如:



eval set – “$options”



测试脚本

#!/bin/bash

解析命令行参数

options= ( g e t o p t − o n : a : g : p − − l o n g n a m e : , a g e : , g e n d e r : , p r i n t − − " (getopt -o n:a:g:p --long name:,age:,gender:,print -- " (getopton:a:g:plongname:,age:,gender:,print"@")
eval set – “$options”

提取选项和参数

while true; do
case $1 in
-a | --age) shift; age=$1 ; shift ;;
-n | --name) shift; name=$1 ; shift ;;
-g | --gender) shift; gender=$1 ; shift ;;
-p | --print) print=true; shift ;;
–) shift ; break ;;
*) echo “Invalid option: $1” exit 1 ;;
esac
done

检查变量

if [ -z “ a g e " ] ; t h e n e c h o " E r r o r : a g e i s r e q u i r e d " e x i t 1 f i i f [ − z " age" ]; then echo "Error: age is required" exit 1 fi if [ -z " age"];thenecho"Error:ageisrequired"exit1fiif[z"name” ]; then
echo “Error: name is required”
exit 1
fi
if [ -z “$gender” ]; then
echo “Error: gender is required”
exit 1
fi

判断开关选项

if [ “$print” = true ]; then
echo “NameVal: $name; AgeVal: $age; GenderVal: $gender”;
fi



脚本调用(长选项)

./script.sh --name Kite --age 18 --gender f -p
NameVal: Kite; AgeVal: 18; GenderVal: f

脚本调用(单字符选项)

./script.sh -n Kite -a 18 -g f -p
NameVal: Kite; AgeVal: 18; GenderVal: f


### 3.总结


如果能够灵活运用shell脚本,也是很强大的。





### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/033f98c1b4042a888d3b4b23a02a1a9a.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/270c62353c9718eb310b6ab9f7029614.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值