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

Z D*_*las 751 bash environment-variables dollar-sign

在Bash中,似乎有几个变量具有特殊的,一致意义的值.例如,

./myprogram &; echo $!
Run Code Online (Sandbox Code Playgroud)

将返回后台进程的PID myprogram.我知道其他人,比如$?我认为是目前的TTY.还有其他人吗?

koj*_*iro 1292

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

以上大部分内容可以在Bash参考手册中的特殊参数下找到.shell设置了所有环境变量.

有关综合索引,请参阅参考手册变量索引.

  • 我在bash脚本中使用`!$`而不是`$ _`,因为后者有时会失败. (8认同)
  • @chepner在$ Special _*下查看`man(1)bash`以获取`$ _`的其余定义. (4认同)
  • 它们都记录在`bash`手册页中.唯一奇怪的是`$ _`仅在其在MAILPATH`变量中使用的上下文中提及. (2认同)
  • @amc:请参阅https://unix.stackexchange.com/questions/271659/vs-last-argument-of-the-preceding-command-and-output-redirection以了解`!$`和`$ _`之间的差异. (2认同)
  • @Timo 如果命令不在后台,你如何向 shell 询问 pid? (2认同)

Dan*_*Dan 44

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

脱离我的头顶.谷歌为bash特殊变量.

  • "我做了.他们把我送到了这里." - 书店小品(官方文档:http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters) (117认同)
  • Downvoted,因为这不是一个非常完整或有用的答案.说"谷歌它"显示缺乏努力,特别是考虑到绝大多数人最终来自谷歌搜索.我认为你至少可以添加官方文档的链接.TBH,我没有将其标记为删除的唯一原因是因为它至少是问题的_partial_答案.我知道它已经过时了,但请考虑编辑它以提供更多细节. (4认同)

fed*_*qui 13

为了帮助理解做什么$#,$0$1...,$n做什么,我使用这个脚本:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done
Run Code Online (Sandbox Code Playgroud)

运行它会返回一个代表性输出:

$ ./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
Run Code Online (Sandbox Code Playgroud)

  • @Anthony这称为[变量间接](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html).你可以在[bash:间接扩展,请解释一下吗?](http://stackoverflow.com/a/8515492/1983854)找到他的用法的一个很好的解释. (6认同)
  • 什么是!我在你的for循环中意味着什么?这就是为什么我在这里,我无法在任何地方找到答案,因为我不知道该怎么称呼它. (4认同)