参数

说明

$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