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