前面已经介绍,变量只能由字母开头,并且只能包含字母,数字,下划线组成。
然而,shell中还有一类变量不符合这种命名规则,这种变量具有特殊含义,被称为特殊变量。shell中常见的特殊变量有 $0,$#,$*,$@,$?,$$和命令行参数。
特殊变量列表
变量 含义 $0 当前脚本的文件名 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本的所有你参数。被""包含时,与$*稍有不同 $n 传递给脚本或函数的参数。n是一个数字,代表第几个参数 $? 上个命令的退出状态或函数的返回值 $$ 当前shell的进程ID,就是脚本的ID。
命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
注意,$0其实可以合并到$n的范围内。因为,执行一个脚本时,命令中的第0个参数即为文件名。如:
./tesh.sh aaa bb
其中,./test.sh即为文件名$0,也即命令中的第0个参数$0。
$*和$@的区别
当$*和$@都不被""包含时,两者功能基本一致,即都以$1,$2,$3...的方式输出。
当$*和$@被""包含时,即"$*"和"$@","$*"会将所有参数当成一个整体,而"$@"依旧会被分割成$1,$2,$3...如我们执行./test.sh "a" "b" "c" "d",并且tesh.sh 中有如下内容:
#!/bin/bash echo $* #此处输出"a b c d" echo $@ #此处输出"a b c d",与$*相同 echo "$*" #此处输出"a b c d" echo "$@" #此处输出"a b c d" for var in $* do echo $var done #此处输出 #a #b #c #d for var in $@ do echo $var done #此处输出同上 for var in "$*" do echo $var done #此处输出"a b c d" #注意两都不同之处在此,"$*"把所有参数合并成一个参数了 for var in "$@" do echo $var done #此处输出 #a #b #c #d #可见,"$@"并没有把所有参数合并成一个参数
退出状态$?
使用$?可以获得上一个命令的退出状态,所谓退出状态即为上一个命令的返回结果。
退出状态在是个数值。