【问题标题】:What are the special dollar sign shell variables?什么是特殊的美元符号 shell 变量?
【发布时间】:2011-07-06 23:54:02
【问题描述】:

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

./myprogram &; echo $!

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

【问题讨论】:

  • 其中有几个不是 Bash-only。它们也用于其他与 Bourne 相关的 shell,实际上由 POSIX 指定。
  • 怎么样:IFS=$'\n' 见:stackoverflow.com/questions/4128235/…
  • @sgu 这不是参数;这是一种特殊类型的引用。 $'\n' 是一个文字换行符,由用 ASCII 10 替换二合字母 \n 产生。
  • 如果您来这里寻找${1}${*} 等,大括号只是为了消除歧义,而且通常是多余的。单独来看,${x} 完全等同于 $x

标签: bash environment-variables dollar-sign


【解决方案1】:

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

#!/bin/bash

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

输出:

parameter 0 --> ./mytry.sh

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

【讨论】:

  • $0 是否包含路径取决于您最初运行脚本的方式。如果您执行“./mytry.sh”,这就是您将在 $0 中看到的内容。如果您输入“~/mytry.sh”,您将看到完整路径(因为外壳会扩展~)。如果你做了“.mytry.sh”,你会看到“bash”。
【解决方案2】:
  • $1, $2, $3, ... 是positional parameters
  • "$@" 是所有位置参数的类数组构造 {$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 手册页中。唯一奇怪的是,$_ 仅在 MAILPATH 变量中使用它的上下文中被提及。
  • @chepner 在 Special Parameters 下的 man(1) bash 中查找 $_ 的其余定义。
  • 我在 bash 脚本中使用 !$ 而不是 $_,因为后者有时会失败。
  • @amc:请参阅 unix.stackexchange.com/questions/271659/… 了解 !$$_ 之间的差异。
  • @Timo 如果命令不在后台,你如何向 shell 请求 pid?
【解决方案3】:

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

【讨论】:

  • 你的 for 循环中的 !i 是什么意思?这就是为什么我在这里,我无法在任何地方找到答案,因为我不知道该怎么称呼它。
  • @Anthony 这被称为variable indirection。您可以在bash: indirect expansion, please explain? 中找到他的用法的一个很好的解释。
【解决方案4】:
  • $_ 最后一个命令的最后一个参数
  • $# 传递给当前脚本的参数数量
  • $* / $@ 作为字符串/分隔列表传递给脚本的参数列表

在我的脑海中。 Google for bash 特殊变量。

【讨论】:

  • “我做到了。他们派我来这里的。” -- 书店短剧(官方文档:gnu.org/software/bash/manual/bashref.html#Special-Parameters
  • 我认为$@ 是字符串,$* 是分隔列表(无论如何,根据上述接受的答案)。
  • @RastaJedi:"$@" 扩展为一个列表,"$*" 扩展为单个字符串。 $@ 的特殊行为适用于双引号内。
  • 投反对票,因为这不是一个非常完整或有用的答案。说“谷歌它”表明缺乏努力,特别是考虑到绝大多数人最终来自谷歌搜索。我认为您至少可以添加指向官方文档的链接。 TBH,我没有将其标记为删除的唯一原因是因为它至少是对问题的部分答案。我知道它很旧,但请考虑对其进行编辑以提供更多详细信息。
猜你喜欢
  • 2011-10-13
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2011-08-21
  • 2020-01-20
  • 2011-12-17
相关资源
最近更新 更多