Shell 特殊变量
1.特殊变量名和含义
变量名 含义
$0 脚本名字
$1 位置参数 #1
$2 - $9 位置参数 #2 - #9
${10} 位置参数 #10
$# 位置参数的个数 sh test.sh XX YY , $#就是2 是表示参数的个数
$? 上个命令执行后,返回的执行命令状态结果, 或者是函数的返回值
"$*" 所有的位置参数(作为单个字符串) *
"$@" 所有的位置参数(每个都作为独立的字符串)
$$ 当前shell进程ID。
${#*} 传递到脚本中的命令行参数的个数
${#@} 传递到脚本中的命令行参数的个数
$_ 之前命令的最后一个参数
$! 运行在后台的最后一个作业的进程ID(PID)
2.【实例】
[root@10-222 ~]# more third.sh
#!/bin/bash
#parm
echo "this is shellname: $0"
echo "this is parm1 : $1"
echo "this is parm2 : $2"
echo "show parm number : $#"
echo "show parm list : $*"
echo "show parm list : $@"
echo "show parm number : ${#*}"
echo "show parm number : ${#@}"
echo "show process id: $$"
运行结果:
[root@10-222 ~]# sh third.sh no1var no2var
this is shellname: third.sh
this is parm1 : no1var
this is parm2 : no2var
show parm number : 2
show parm list : no1var no2var
show parm list : no1var no2var
show parm number : 2
show parm number : 2
show process id: 23650
[root@10-222 ~]# echo $_
no2var
3.$* 和 $@ 的区别
$@ $* 只在被双引号包起来的时候才会有差异
这部分是在网上看到的,原创已经不知道是哪位了。(这个例子很能说明)
精确来讲,两者只有在 "" (双引号) 中才有差异,否则,都表示"全部参数"( $0 除外)。
举例来说好了:
sh my.sh p1 "p2 p3" p4 的话,
不管是 $@ 还是 $* ,都可得到 p1 p2 p3 p4 就是了。
但是,如果置于 "" (双引号)中的话:
"$@" 则可得到 "p1" "p2 p3" "p4" 这三个不同的词段(word);
"$*" 则可得到 "p1 p2 p3 p4" 这一整串单一的词段。
我们可修改一下前面的 my.sh ,使之内容如下:
代码:
#!/bin/bash
my_fun() {
echo "$#"
}
echo ‘the number of parameter in "$@" is ‘$(my_fun "$@")
echo ‘the number of parameter in "$*" is ‘$(my_fun "$*")
然后再执行 sh my.sh p1 "p2 p3" p4 就知道 $@ 与 $* 差在哪了 ... ^_^
the number of parameter in "$@" is 3
the number of parameter in "$*" is 1
【$@ $* 的实例 说明】
[root@10-222 ~]# cat a.txt
aaaaaaa
[root@10-222 ~]# cat b.txt
bbbbbbb
[root@10-222 ~]# cat c.sh
#!/bin/sh
cat $1
[root@10-222 ~]# cat *.txt
aaaaaaa
bbbbbbb
[root@10-222 ~]# sh c.sh *.txt
aaaaaaa
在c.sh中写了cat $1 为什么只显示一个文件中的内容, 但如果在命令行下cat *.txt就会显示2个文件信息
将c.sh 改成 cat $@ 就正常了
[root@10-222 ~]# vim c.sh
#!/bin/sh
cat $@ #(改成$* 也是可以的)
[root@10-222 ~]# sh c.sh *.txt
aaaaaaa
bbbbbbb
4.$?
[root@10-222 ~]# echo `hostname`
10-222
[root@10-222 ~]# echo $?
0
[root@10-222 ~]# grep ‘cpu cores‘ /proc/cpuinfo
cpu cores : 1
[root@10-222 ~]# echo $?
0
以下几个部分在后续内容介绍
$? 在函数的返回值会在后续的章节说明
以上是个人点点总结和理解,水平不高,文笔水平很烂,请各位大大见谅。
可以一起交流学习。
我的QQ:610851588
可以加入我建的群(现在群人很少,希望慢慢多起来)
Linux 群:183932302
Python ,shell 交流群:469094734
本文出自 “走起运维” 博客,请务必保留此出处http://yuanji6699.blog.51cto.com/11568362/1773008
原文地址:http://yuanji6699.blog.51cto.com/11568362/1773008