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 中,使用特殊变量 $? 可以 返回上一条命令的进程退出时的值。

练习:

  1. 写个 Shell 脚本程序 mkdirs.sh,要求需要输入一个参数即文件夹的主名称,然后创建三个后缀为 1、2、3的三个文件夹。如:
source mkdir.sh MyDir

然后创建如下三个文件夹

MyDir1 MyDir2 MyDir3