参数 | 说明 |
---|---|
$0 | 当前脚本的文件名(间接运行时还包括绝对路径) |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1 |
$# | 传递给脚本或函数的参数个数 |
$* | 传递给脚本或函数的所有参数 |
$@ |
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号 ("") 包含时,都以"$1 " "$2 " … "$n " 的形式输出所有参数。但是当它们被双引号 ("") 包含时,"\$* "会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式输出所有参数;"$@ "会将各个参数分开,以"$1""$2" … "$n" 的形式输出所有参数。 |
$? | 上个命令的退出状态,或函数的返回值 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID |
$_ | 上一个命令的最后一个参数 |
$! | 后台运行的最后一个进程的 ID 号 |
#!/bin/bash
echo $0 # 当前脚本的文件名(间接运行时还包括绝对路径)。
echo $n # 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1 。
echo $# # 传递给脚本或函数的参数个数。
echo $* # 传递给脚本或函数的所有参数。
echo $@ # 传递给脚本或函数的所有参数。被双引号 (" ") 包含时,与 $* 不同,下面将会讲到。
echo $? # 上个命令的退出状态,或函数的返回值。
echo $$ # 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
echo $_ # 上一个命令的最后一个参数
echo $! # 后台运行的最后一个进程的 ID 号
拿$!
举个例子:
#!/bin/bash
set -x
set -e
sleep 10s &
pid1="$!"
sleep 5s &
pid2="$!"
wait ${pid1}
res1="$?"
wait ${pid2}
res2="$?"
if [[ ${res1} -eq 0 && ${res2} -eq 0 ]];then
echo "success"
fi
输出为:
+ set -e
+ pid1=27717
+ sleep 10s
+ pid2=27718
+ wait 27717
+ sleep 5s
+ res1=0
+ wait 27718
+ res2=0
+ [[ 0 -eq 0 ]]
+ [[ 0 -eq 0 ]]
+ echo success
success
Bash shell内置了wait命令,wait命令可以使当前shell进程挂起,等待所指定的由当前shell产生的子进程退出后,wait命令才返回。wait命令的参数可以是进程ID或是job specification。
wait命令一个很重要用途就是在Bash shell的并行编程中,可以在Bash shell脚本中启动多个后台进程(使用&),然后调用wait命令,等待所有后台进程都运行完毕,Bash shell脚本再继续向下执行。像下面这样:
command1 &
command2 &
wait