4. 特殊 Shell 变量
在 Shell 脚本中,有一些特殊变量用于存储特定的信息,比如脚本参数、进程状态等。
Shell 中的特殊变量
变量
值说明
$0脚本文件名。
$1 ~$9第 1-9 个参数。
${10} ~${nn}第 10 到 nn 个参数(nn是大于 10 的整数)。
$#传递给脚本或函数的参数个数(数字)。
$*所有参数(合并成一个字符串)。
$@所有参数(独立字符串-数组)。
$?上一条命令的退出状态。
$$当前 shell 的 PID。
$!最后一个后台进程的 PID。
$_上一个命令的最后一个参数。
说明:
$ 是 Shell 脚本中的特殊标识符,如果在字符串中要打印此字符,需要用反斜杠(\)进行转义才能正常输出。如打印 $ 符号要写成 echo "\$"。
示例
写一个 Shell 脚本文件: echo_special_var.sh 写入如下信息:
#!/bin/bash
echo "参数的个数是\$#:$#"
echo "脚本文件名是\$0:$0"
echo "参数\$1~\${14}:$1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11},${12},${13},${14}"
echo "所有参数合并成字符串\$*:$*"
echo "所有参数合并成字符串\$@:$@"
mkdir /wei # 在根文件夹下创建文件夹
echo "上一个命令的退出值\$?:$?"
mkdir ~/wei # 在我的用户主目录下创建文件夹
echo "上一个命令的退出值\$?:$?"
echo "当前Shell 的PID:\$\$:$$"
/usr/bin/python3 always_run.py &
echo "最后一个后台进程的PID \$!:$!"
touch mynote.txt
echo "上一个命令 touch mynote.txt 的最后一个参数\$_:$_"
在当前 bash 进程内运行结果
weimingze@mzstudio:~$ source echo_special_var.sh aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
参数的个数是$#:14
脚本文件名是$0:-bash
参数$1~${14}:aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn
所有参数合并成字符串$*:aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
所有参数合并成字符串$@:aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
mkdir: cannot create directory ‘/wei’: Permission denied
上一个命令的退出值$?:1
上一个命令的退出值$?:0
当前Shell 的PID:$$:10127
最后一个后台进程的PID $!:10263
上一个命令 touch mynote.txt 的最后一个参数$_:mynote.txt
weimingze@mzstudio:~$ PID: 10263
weimingze@mzstudio:~$
在新的 bash 进程内内运行结果
weimingze@mzstudio:~$ bash echo_special_var.sh aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
参数的个数是$#:14
脚本文件名是$0:echo_special_var.sh
参数$1~${14}:aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn
所有参数合并成字符串$*:aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
所有参数合并成字符串$@:aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
mkdir: cannot create directory ‘/wei’: Permission denied
上一个命令的退出值$?:1
上一个命令的退出值$?:0
当前Shell 的PID:$$:10284
最后一个后台进程的PID $!:10289
上一个命令 touch mynote.txt 的最后一个参数$_:mynote.txt
weimingze@mzstudio:~$ PID: 10289
weimingze@mzstudio:~$ ./echo_special_var.sh aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
参数的个数是$#:14
脚本文件名是$0:./echo_special_var.sh
参数$1~${14}:aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn
所有参数合并成字符串$*:aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
所有参数合并成字符串$@:aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn
mkdir: cannot create directory ‘/wei’: Permission denied
上一个命令的退出值$?:1
上一个命令的退出值$?:0
当前Shell 的PID:$$:10301
最后一个后台进程的PID $!:10305
上一个命令 touch mynote.txt 的最后一个参数$_:mynote.txt
weimingze@mzstudio:~$ PID: 10305
weimingze@mzstudio:~$
命令的退出状态
在 Linux/UNIX 中,任何一个进程在退出时都有一个返回值,通常这个是 0 ~ 255 的的范围(8bit表示),通常 0 代表成功(真值),其他值代表失败(假值)。
在 Shell 中,使用特殊变量 $? 可以 返回上一条命令的进程退出时的值。
练习:
- 写个 Shell 脚本程序
mkdirs.sh,要求需要输入一个参数即文件夹的主名称,然后创建三个后缀为 1、2、3的三个文件夹。如:
source mkdir.sh MyDir
然后创建如下三个文件夹
MyDir1 MyDir2 MyDir3