特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)

转自https://www.cnblogs.com/davidshen/p/10234178.html
shell编程中有一些特殊的变量可以使用。这些变量在脚本中可以作为全局变量来使用。

名称说明
$0脚本名称
$1-9脚本执行时的参数1到参数9
$?脚本的返回值
$#脚本执行时,输入的参数的个数
$@输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表)
$*输入的参数的具体内容(将输入的参数作为一个单词)
$$Shell本身的PID(ProcessID)
$!Shell最后运行的后台Process的PID

$@与$*的区别:
相同点:
$@与$* 都可以使用一个变量来来表示所有的参数内容,但这两个变量之间有一些不同之处。
不同点:
$@:将输入的参数作为一个列表对象
$*:将输入的参数作为一个单词

源代码: 
 1 echo "脚本的名字是:"$0
 2 n=1
 3 echo "使用\$@的参数列表为:"$@
 4 for temstr in "$@"
 5 do
 6         echo "第$n个参数是:" $temstr
 7         let n+=1
 8 done
 9 
10 
11 n=1
12 echo "使用\$*的参数列表为:"$*
13 for temstr in "$*"
14 do
15         echo "第$n个参数是:" $temstr
16         let n+=1
17 done

执行结果:

1 $ ./test.sh 1 2 3 4
2 脚本的名字是:./test.sh
3 使用$@的参数列表为:1 2 3 4
4 第1个参数是: 1
5 第2个参数是: 2
6 第3个参数是: 3
7 第4个参数是: 4
8 使用$*的参数列表为:1 2 3 4
9 第1个参数是: 1 2 3 4

在上面的例子中,使用 $@与$*是,都是用双引号引起来,但当$*不使用双引号时,结果与$@的结果相同。

原因分析:
  当都使用双引号时,我们可以看到参数列表输出都是一样的,说明确实两个变量都可以存储所有的参数内容,也就显示出来两个变量之间的对参数处理的不同,即一个将其作为列表处理,一个讲所有参数作为一个单词处理。
  当$*不适用双引号时,执行到for语句时,会首先将$*的值(1 2 3 4 )取出来,然后循环语句就变成了 for tem in 1 2 3 4 ,最后的输出结果也就变成了列表的循环输出。

 1 源码:
 2 #!/bin/bash
 3 n=1
 4 for tem in $*
 5 do 
 6     echo $n is $tem
 7     let n+=1
 8 done 
 9 

执行结果:

# ./test.sh 1 2 3 4 
1 is 1
2 is 2
3 is 3
4 is 4

如果参数个数太多,达到或者超过了 10 个,那么就得用${n}的形式来接收了,例如 ${10}、${23}。{ }的作用是为了帮助解释器识别参数的边界,这跟使用变量时加{ }是一样的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值