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的字符数 |