不会跑

work for life

23 Feb 2016

Linux 下特殊变量:($N $* $@ $! $? $0 $$ !$ )

Linux Shell 中有一些特殊变量,在写脚本的时候经常用到,下面逐一记录下它们的含义和用法。

$N – 位置参数

表示第N个参数,例如 $1, $2, $3$0 比较特殊,表示脚本本身的名字。

#!/bin/bash
# test.sh
echo "脚本名: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"

# 执行: bash test.sh hello world
# 输出:
# 脚本名: test.sh
# 第一个参数: hello
# 第二个参数: world

$* 和 $@ – 所有参数

两者都表示所有传入的参数,区别在于加双引号时的行为:

  • $*:把所有参数作为一个字符串
  • $@:把每个参数单独作为一个字符串
#!/bin/bash
# 测试 $* 和 $@ 的区别
echo '--- $* ---'
for arg in "$*"; do
    echo "$arg"
done

echo '--- $@ ---'
for arg in "$@"; do
    echo "$arg"
done

# 执行: bash test.sh a b c
# 输出:
# --- $* ---
# a b c          (一整个字符串)
# --- $@ ---
# a              (三个独立的字符串)
# b
# c

$# – 参数个数

表示传入的参数个数:

#!/bin/bash
echo "参数个数: $#"

# 执行: bash test.sh a b c
# 输出: 参数个数: 3

$? – 上一条命令的退出码

取值范围 0~255,0 表示命令成功执行,非0表示出错:

ls /tmp
echo $?  # 0,表示ls执行成功

ls /not_exist_dir
echo $?  # 2,表示ls执行失败

$$ – 当前进程的PID

echo "当前脚本的PID: $$"
# 输出类似: 当前脚本的PID: 12345

$! – 上一个后台进程的PID

注意和 $$ 区分,$$ 是当前进程,$! 是最近一个后台进程:

sleep 100 &
echo "后台进程PID: $!"
# 输出类似: 后台进程PID: 12346

kill $!  # 杀掉刚才的后台进程

!$ – 上一条命令的最后一个参数

这个是 bash 的历史扩展功能,不是严格的特殊变量,但很常用:

mkdir /tmp/test_dir
cd !$
# 等价于 cd /tmp/test_dir

${#var} – 变量的字符数

var="hello world"
echo ${#var}  # 11

name="Python"
echo ${#name}  # 6

汇总表

变量 含义
$0 脚本本身的名字
$N 第N个参数
$# 参数个数
$* 所有参数(作为一个字符串)
$@ 所有参数(各自独立)
$? 上一条命令的退出码
$$ 当前进程PID
$! 最近后台进程PID
!$ 上一条命令最后一个参数
${#var} 变量var的字符数
comments powered by Disqus