中大括号的用法_Bash函数用法(5):遍历传入函数的所有参数,获取第十个参数...

b2057d9a2d3895eaa56d541e6ed306d0.png

本系列文章介绍在 Linux Bash shell 中使用函数的一些实例,包括下面的内容:

  • 定义函数的格式
  • 从函数中返回内容
  • 使用函数名作为函数指针
  • 函数内执行cd命令的影响
  • 声明函数内的变量为局部变量
  • 获取传入函数的所有参数

获取传入函数的所有参数

在 bash 中,可以使用 $1、$2、$3、...、$n 的方式来引用传入函数的参数,$1 对应第一个参数值,$2 对应第二个参数值,依次类推。如果 n 的值大于 9,那么需要用大括号{}把 n 括起来

例如,${10} 表示获取第 10 个参数的值,写为 $10 获取不到第 10 个参数的值。实际上,$10 相当于 ${1}0,也就是先获取 $1 的值,后面再跟上 0,如果 $1 的值是 "first",则 $10 的值是 "first0"。

下面通过一个 testparams.sh 脚本来举例说明,该脚本的内容如下:

#!/bin/bashfunction show_params(){ echo $1 , $2 , $3 , $4 , $5 , $6 , $7 , $8 , $9 , $10 , ${10} , ${11}}show_params $@

这个脚本把传入自身的参数传给 show_params 函数,该函数再打印出各个参数,使用 $10、${10} 这两个形式来说明它们的区别。

执行 ./testparams.sh 脚本的结果如下:

$ ./testparams.sh 1a 2b 3c 4d 5e 6f 7g 8h 9i 10j 11k1a , 2b , 3c , 4d , 5e , 6f , 7g , 8h , 9i , 1a0 , 10j , 11k

可以看到,传入的第 10 个参数值是 "10j",而 $10 打印出来的结果是 "1a0",也就是第一个参数 "1a" 后面再跟上 0。${10} 打印的结果才是第 10 个参数的值。

相应地,${11} 也能正确打印第 11 个参数的值。

$1、$2 这种写法在 bash 文档里面称之为 positional parameter,中文直译过来是 “位置参数”。查看 man bash 里面的说明如下:

Positional Parameters

A positional parameter is a parameter denoted by one or more digits, other than the single digit 0. Positional parameters are assigned from the shell's arguments when it is invoked, and may be reassigned using the set builtin command.

Positional parameters may not be assigned to with assignment statements. The positional parameters are temporarily replaced when a shell function is executed.

When a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces.

${parameter}

The value of parameter is substituted.

The braces are required when parameter is a positional parameter with more than one digit, or when parameter is followed by a character which is not to be interpreted as part of its name.

The parameter is a shell parameter or an array reference (Arrays).

可以看到,这里面提到了需要用大括号{}把大于9的数字括起来,{} 的作用是限定大括号里面的字符串是一个整体。

例如,有一个 var 变量值是 "Test",现在想打印这个变量值,并跟着打印 "Hello" 字符串,也就是打印出来 "TestHello" 字符串,那么获取 var 变量值的语句和 "Hello" 字符串中间就不能有空格,否则 echo 命令会把这个空格一起打印出来,但是写为 $varHello 达不到想要的效果。具体举例如下:

$ var="Test"$ echo $var HelloTest Hello$ echo $varHello$ echo ${var}HelloTestHello

可以看到,$var Hello 这种写法打印出来的 "Test" 和 "Hello" 中间有空格,不是想要的结果。

$varHello 打印为空,这其实是获取 varHello 变量的值,这个变量没有定义过,默认值是空。

${var}Hello 打印出了想要的结果,用大括号 {} 把 var 括起来,明确指定要获取的变量名是 var,避免混淆。

上面贴出的 testparams.sh 脚本代码里面还用到了一个 $@ 特殊参数,它会扩展为 positional parameter 自身的列表。查看 man bash 的说明如下:

Special Parameters

@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word.

That is, "$@" is equivalent to "$1" "$2" ...

注意$@"$@" 这两种写法得到的结果可能会有所不同。$@ 是扩展为 $1 $2 ...,而 "$@" 是扩展为 "$1" "$2" ...修改上面的 testparams.sh 脚本来举例说明 $@ 和 "$@" 的区别:

#!/bin/bashfunction show_params(){ echo $1 , $2 , $3}show_params $@show_params "$@"

执行 testparams.sh 脚本,输出结果如下:

$ ./testparams.sh 1a 2b 3c1a , 2b , 3c1a , 2b , 3c$ ./testparams.sh "1 a" "2 b" "3 c"1 , a , 21 a , 2 b , 3 c$ ./testparams.sh 1a 2b1a , 2b ,1a , 2b ,

可以看到,当传入脚本的参数值不带空格时,$@ 和 "$@" 得到的结果相同。

当传入脚本的参数值自身带有空格时,$@ 得到的参数个数会变多,"$@" 可以保持参数个数不变。

上面的 $1 是 "1 a",$@ 会拆分成 "1" "2" 两个参数,然后传给 show_params 函数;"$@" 会保持为 "1 a" 不变,然后传给show_params 函数。

即,"1 a" "2 b" "3 c" 这三个参数,经过 $@ 处理后,得到的是 "1" "a" "2" "b" "3" "c" 六个参数。经过 "$@" 处理后,得到的还是 "1 a" "2 b" "3 c" 三个参数

同时也看到,即使只传入两个参数,引用 $3 也不会报错,只是会获取为空。

PS:介绍bash函数用法的系列文章完结~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值