shell 传递参数

定义 Shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用$n的形式接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推,注意:$0表示当前文件名。

1. 向脚本文件传递位置参数

编写如下代码,并命名为test.sh

#!/bin/bash

echo "姓名:$1"
echo "性别:$2"
echo "年龄:$3"
echo "身高:$4"
echo "体重:$5"

附带参数执行test.sh,执行结果如下所示:

$ . ./test.sh Crystal 女 24 168cm 53KG
姓名: Crystal
性别:女
年龄:24
身高:168cm
体重:53KG

其中,Crystal是第一个位置参数$1,女 是第二个位置参数$2,依此类推。。。

2. 给函数传递位置参数

将上面脚本内容放到函数里,脚本修改如下:

#!/bin/bash

#定义函数
function func(){
	echo "姓名:$1"
	echo "性别:$2"
	echo "年龄:$3"
	echo "身高:$4"
	echo "体重:$5"
}

#调用函数
func Crystal 女 24 168cm 53KG

执行脚本文件,执行结果如下所示:

 

$ . ./test.sh
姓名:Crystal
性别:女
年龄:24
身高:168cm
体重:53KG

注意:本次执行脚本时,没有在命令行传递参数,因为我们定义的函数在文件中被调用时已经传递了位置参数。

3. 特殊变量

除了 $n,Shell 还有几个特殊参数,其参数形式及含义说明如下表所示:

参数 说明
$$ 脚本运行的当前进程ID号
$# 传递到脚本的参数个数
$- 显示Shell使用的当前选项,与set命令功能相同。
$! 后台运行的最后一个进程的ID号
$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 

$*

以一个单字符串显示所有向脚本传递的参数。

如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

也可以用来获取函数返回值,后面会针对特殊的返回结果值给出示例。

$0 当前文件名

了解了以上特殊参数的含义之后,我们通过实例来看一下参数的实际应用效果。

  • 示例一:给脚本文件传递参数

  • 示例二:给函数传递参数

$* 与 $@ 区别

  1. 相同点:都表示传递给函数或脚本的所有参数,不被双引号" "包围时,它们都是将接收到的每个参数看做一份数据,参数之间以空格来分隔。
  2. 不同点:

当他们被双引号" "包围时,

"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据;

"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

比如传递了 3 个参数,那么对于"$*"来说,这3个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于"$@"来说,这 3 个参数是相互独立的,它们是 3 份数据。如果使用 echo 直接输出"$*"和"$@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来,如下图所示,$*只遍历了一次,因为它将所有参数当作一份数据,$@则遍历了六次,将参数逐个输出。

shell 传递参数_第1张图片

  • $? 获取函数返回值 或 最后命令的退出状态

1、 获取最后命令的退出状态

一般情况下,命令执行成功会返回0,执行失败则返回1,但是,一些情况下,命令的执行结果也会返回其他值,请看下面的实例。

shell 传递参数_第2张图片

解释:

执行命令 . ./return.sh 22后,根据函数设置,我们可以看到,参数错误,所以返回值是1;

执行命令 . ./return.sh 222,根据函数设置,我们可以知道,参数正确,所以返回值是0;

执行命令 . ./return.sh,没有给脚本传参,所以脚本执行失败,故而使用命令 echo $? 查看上一命令的执行结果,我们得到返回值0。

2、获取函数返回值

shell 传递参数_第3张图片

从上面的脚本执行结果中可以看出,函数返回两数相加后的和。

 

你可能感兴趣的:(脚本学习)