## Bash中的特殊变量
在Bash中有一些特殊的变量,他们分别是:
* $0 当前脚本的文件名
* $\# 传递给脚本或函数的参数个数。
* $\* 传递给脚本或函数的所有参数。
* $@ 传递给脚本或函数的所有参数。被双引号\(" "\)包含时,与 $\* 稍有不同,下面将会讲到。
* $? 上个命令的退出状态,或函数的返回值。
* $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
* $! 最近一次执行命令的进程号
### 1.$0 变量
$0变量是显示当前的文件名,譬如以下脚本为test.sh。
```
#!/bin/bash
echo $0 # 打印test.sh脚本名
echo $(dirname $0) # $0 还有一种用法就是通过dirname命令显示当前脚本所在的位置。
```
### 2.$\#变量
传递给脚本或函数的参数个数。
```
#!/bin/bash
echo $# # 输出当前位置变量的个数。
if [ $# -ne 3 ];then # 位置变量通常用于判断位置参数的个数
echo "please input three parameter!"
fi
```
## 3.$\* 和$@变量
$_ 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号\(" "\)包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号\(" "\)包含时,"$_" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数,以下是区别的案例。
```
#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
```
## 4.$?变量
判断上一个命令或函数的返回状态,其中0表示成功,非0表示失败。
```
[root@blog.puppeter.com_centos ~]# ls abc # 在Linux终端执行ls abc,其中abc文件不存在系统会包错
ls: abc: No such file or directory
[root@blog.puppeter.com_centos ~]# echo $? # 这时我执行$?就会显示一个非0的数字,表示上一次命令执行失败
1
[root@blog.puppeter.com_centos ~]# ls /etc/passwd # 查看/etc/passwd文件是否存在,很显然他存在
/etc/passwd
[root@blog.puppeter.com_centos ~]# echo $? # 会返回一个0的值,表示上一个命令返回成功。
0
```
我们在写脚本的过程中也可通过exit函数来告诉系统当前脚本的执行状态,譬如以下案例。
```
#!/bin/bash
echo "hello world"
exit 0 # 表示成功执行此脚本,退出状态码为0
```
## 5.$$变量
显示当前进程ID,我们在Linux系统中每执行一次命令或一个脚本都会启动一次进程,而进程ID就相当于唯一识别进程的身份证号。
```
[root@blog.puppeter.com_centos ~]# echo $$ # 他会打印出当前echo执行过程中的进程ID
1307
```
如果我们写了一个程序是常驻内存的,可以把此进程ID写到程序的pid文件中来告诉当前程序运行过程中的进程ID值,其实这有点像Apache和Nginx,这两款WEB服务都会将当前进程的ID值写入自己的pid文件中,当我要重启或关闭时其实就是获取pid文件中的进程ID并发送KILL信号。
## 6.$!变量
将一程序放在系统后台,打印$!放在后台这个程序的pid。
```
[root@blog.puppeter.com_centos ~]# sh 2.sh &
[1] 57947
[root@blog.puppeter.com_centos ~]# echo $!
57947
```
- Introduction
- 1.Shell编程基础
- 什么是Shell
- 编写第一个Bash程序
- 2.变量
- 什么是变量
- 变量四种赋值方式
- 指定变量类型
- 变量的类型
- 特殊变量
- 3.Bash符号相关
- Bash符号相关
- 特殊符号
- 数学运算符号
- 4.内建命令与外部命令
- 内建命令与外部命令
- 5.read命令
- read命令
- 6.条件语句
- if..then..fi
- if..then..else..fi
- if..then..elif..fi
- 空命令
- 文件测试符
- 字符串判断、与、或和非
- []与[[]]符号
- 7.Bash循环 && 分支语句
- while循环语句
- for循环
- for..in循环
- until循环
- select循环
- case分支语句
- 8.正则表达式
- 正则表达式
- 9.子Shell和受限Shell
- 子Shell
- 受限Shell
- 10.函数与函数的加载
- 函数语法与案例
- 递归函数
- 函数的加载
- 11.Bash脚本风格
- Bash脚本风格
- 12.Bash脚本调试
- Bash脚本调试
- 13.sed && awk
- sed
- 14.awk
- awk
- 15 Bash杂项 && 案例
- while循环的陷阱
- Bash的生命周期
- IO重定向
- /bin/bash和/bin/sh区别
- 命令杂项
- Shell加密
- 16.10.2.案例
- Bash版回收站
- 17.Bash中文速查表
- 中文速查表