在Bash中,似乎有几个变量保存着特殊且一致含义的值。例如,
./myprogram &; echo $!
将返回myprogram
在后台运行的进程的PID。我知道其他的方法,比如$?
,我认为它是当前TTY的编号。还有其他的吗?
./myprogram &; echo $!
将返回myprogram
在后台运行的进程的PID。我知道其他的方法,比如$?
,我认为它是当前TTY的编号。还有其他的吗?
$1
、$2
、$3
等是位置参数。"$@"
是一个类似数组的结构,包括所有的位置参数,如{$1, $2, $3 ...}
。"$*"
是所有位置参数的IFS扩展,即$1 $2 $3 ...
。$#
是位置参数的数量。$-
是当前shell设置的选项。$$
是当前shell的进程ID(而不是子shell)。$_
是最近一个参数(或在启动后立即启动当前shell的命令的绝对路径)。$IFS
是(输入)字段分隔符。$?
是最近前台管道的退出状态码。$!
是最近一个后台命令的进程ID。$0
是shell或shell脚本的名称。大多数内容可以在Bash参考手册的特殊参数中找到。这里是shell设置的所有环境变量。此处。
有关完整的索引,请参见参考手册变量索引。
man(1) bash
中查看 特殊参数 以获取 $_
的其余定义。 - kojiro!$
代替$_
,因为后者有时会失败。 - user339222!$
和 $_
的区别。 - tricasse$_
是上一条命令的最后一个参数。$#
是传递给当前脚本的参数数量。$*
/ $@
是以字符串/分隔列表的形式传递给脚本的所有参数列表。随便想想,可以在 Google 上搜索 Bash 特殊变量。
$@
是字符串,而$*
则是一个分隔列表(按照上述被接受答案). - RastaJedi"$@"
会扩展成一个列表,而"$*"
则会扩展成一个单独的字符串。当"$@"
在双引号内时,它具有特殊的行为。 - Keith Thompson为了帮助理解$#
、$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
$'\n'
是一个字面上的换行符,它是通过将双字母组\n
替换为ASCII 10而得到的结果。 - chepner${1}
,${*}
等,大括号只是为了消除歧义,通常是多余的。在上下文中,${x}
与$x
完全等价。 - tripleee$IFS
的信息,请参见 What is the exact meaning ofIFS=$'\n'
。 - Peyman Mohamadpour$?
不是TTY
- 它是上一个执行命令的返回值。tty
是它的简单命令。 - Timo