在 Bash 中,似乎有几个变量具有特殊的、一致的含义值。例如,
./myprogram &; echo $!
将返回后台处理 myprogram
的进程的 PID。我知道其他人,例如我认为是当前 TTY 的 $?
。还有其他人吗?
$'\n'
是用 ASCII 10 替换二合字母 \n
产生的文字换行符。
${1}
、${*}
等,大括号只是为了消除歧义,而且通常是多余的。单独来看,${x}
完全等同于 $x
。
$1, $2, $3, ... 是位置参数。
"$@" 是所有位置参数 {$1, $2, $3 ...} 的类数组构造。
“$*”是所有位置参数的IFS展开,$1 $2 $3 ....
$# 是位置参数的数量。
$- 当前为 shell 设置的选项。
当前 shell(不是子 shell)的 $$ pid。
$_ 最近的参数(或启动后立即启动当前 shell 的命令的绝对路径)。
$IFS 是(输入)字段分隔符。
美元?是最近的前台管道退出状态。
美元!是最近的后台命令的 PID。
$0 是 shell 或 shell 脚本的名称。
以上大部分内容都可以在 Bash 参考手册的 Special Parameters 下找到。有所有的environment variables set by the shell。
如需综合索引,请参阅Reference Manual Variable Index。
$_ 最后一个命令的最后一个参数
$# 传递给当前脚本的参数数量
$* / $@ 作为字符串/分隔列表传递给脚本的参数列表
离开我的头顶。谷歌搜索 bash 特殊变量。
$@
是字符串,而 $*
是分隔列表(无论如何,根据上面接受的答案)。
"$@"
展开为列表,"$*"
展开为单个字符串。 $@
的特殊行为适用于它在双引号内时。
为了帮助理解 $#
、$0
和 $1
、...、$n
的作用,我使用以下脚本:
#!/bin/bash
for ((i=0; i<=$#; i++)); do
echo "parameter $i --> ${!i}"
done
运行它会返回一个有代表性的输出:
$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine
注意一些例子; $0 可能包括一些前导路径以及程序的名称。例如,将这两行脚本保存为 ./mytry.sh 并执行它。
#!/bin/bash
echo "parameter 0 --> $0" ; exit 0
输出:
parameter 0 --> ./mytry.sh
这是在当前(2016 年)版本的 Bash 上,通过 Slackware 14.2
bash
手册页中。唯一奇怪的是$_
仅在其在MAILPATH
变量中的使用上下文中被提及。man(1) bash
中查找$_
的其余定义。!$
而不是$_
,因为后者有时会失败。!$
和$_
之间的区别。