什么是特殊的美元符号外壳变量?


781

在Bash中,似乎有几个变量包含特殊的,一致的值。例如,

./myprogram &; echo $!

将返回后台进程的PID myprogram。我认识其他人,例如$?我认为是当前的TTY。还有其他吗?


15
其中有一些不是仅限Bash。它们还用在其他与Bourne相关的shell中,实际上是由POSIX指定的。
暂停,直到另行通知。

1
关于什么:IFS = $'\ n'请参阅:stackoverflow.com/questions/4128235/…–
sgu

1
@sgu这不是参数;这是一种特殊的报价方式。$'\n'是,从替换有向图产生字面值换行符\n与ASCII 10
chepner

如果你来到这里寻找${1}${*}等为主,括号只是为了消除歧义,而且往往是多余的。孤立地,${x}与完全等效$x
Tripleee '19

什么$!意思 我知道!$但不是。
Sridhar Sarnobat

Answers:


1357
  • $1$2$3,...是位置参数
  • "$@"是所有位置参数的类似数组的构造{$1, $2, $3 ...}
  • "$*"是所有位置参数的IFS扩展$1 $2 $3 ...
  • $# 是位置参数的数量。
  • $- 当前为外壳设置的选项。
  • $$ 当前外壳的pid(不是子外壳)。
  • $_ 最新参数(或在启动后立即启动当前shell的命令的abs路径)。
  • $IFS 是(输入)字段分隔符。
  • $? 是最新的前台管道退出状态。
  • $! 是最新后台命令的PID。
  • $0 是外壳程序或外壳程序脚本的名称。

上面的大多数内容都可以在Bash参考手册的“ 特殊参数”下找到。shell设置了所有环境变量

有关全面的索引,请参见《参考手册变量索引》


2
它们全部记录在bash手册页中。唯一奇怪的是,$_仅在MAILPATH变量中使用它的上下文中提到过。
chepner

4
@chepner在man(1) bash特殊参数”下查找的其余定义$_
kojiro 2012年

8
我在bash脚本中使用!$代替$_,因为后者有时会失败。
amc 2012年

不错的清单小次郎。我碰到了这种语法$ {1 +“ $ @”}是什么意思?
user178047 2014年

3
@amc:有关和之间的区别,请参见unix.stackexchange.com/questions/271659/…!$$_
tricasse

44
  • $_ 最后命令的最后一个参数
  • $# 传递给当前脚本的参数数量
  • $*/ $@以字符串形式传递给脚本的参数列表/分隔列表

从我头顶上掉下来。Google for bash特殊变量。


124
“我做到了。他们把我送到了这里。” -书店小品(官方文件:gnu.org/software/bash/manual/bashref.html#Special-Parameters
greggo,

1
我认为$@是字符串,并且$*是分隔列表(无论如何,根据上面接受的答案)。
RastaJedi '16

1
@RastaJedi:"$@"扩展为列表,"$*"扩展为单个字符串。$@在双引号内时,应用的特殊行为。
Keith Thompson

6
拒绝投票,因为这不是一个非常完整或有用的答案。说“ Google it”表示缺乏努力,尤其是考虑到大多数人最终都来自Google搜索。我认为您至少可以做的是添加指向官方文档的链接。TBH,我没有将其标记为删除的唯一原因是因为它至少是对该问题的部分答案。我知道它很旧,但是请考虑对其进行编辑以提供更多细节。
肖恩·比恩

15

为了帮助理解什么$#$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

4
!i在您的for循环中是什么意思?这就是为什么我在这里,却找不到答案的原因,因为我不知道该怎么称呼。
安东尼

7
@Anthony这称为变量间接。您可以在bash中很好地了解他的用法:间接扩展,请解释一下?
fedorqui'SO停止伤害

3

注意一些例子;$ 0可能包含一些前导路径以及程序名称。例如,将这两行脚本另存为./mytry.sh并执行。

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

输出:

parameter 0 --> ./mytry.sh

这是通过Slackware 14.2在Bash的当前版本(2016年)上进行的


5
$ 0是否包含路径取决于您首先运行脚本的方式。如果执行“ ./mytry.sh”,您将在$ 0中看到。如果输入“〜/ mytry.sh”,则会看到完整路径(因为外壳将展开为〜)。如果您执行了“ .mytry.sh”,则会看到“ bash”。
史蒂夫·弗利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.