ChatGPT解决这个技术问题 Extra ChatGPT

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

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

./myprogram &; echo $!

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

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

f
fedorqui

$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 手册页中。唯一奇怪的是 $_ 仅在其在 MAILPATH 变量中的使用上下文中被提及。
@chepner 在 Special Parameters 下的 man(1) bash 中查找 $_ 的其余定义。
我在 bash 脚本中使用 !$ 而不是 $_,因为后者有时会失败。
@amc:请参阅 unix.stackexchange.com/questions/271659/…,了解 !$$_ 之间的区别。
@Timo 如果命令不在后台,您如何向 shell 询问 pid?
D
Dan

$_ 最后一个命令的最后一个参数

$# 传递给当前脚本的参数数量

$* / $@ 作为字符串/分隔列表传递给脚本的参数列表

离开我的头顶。谷歌搜索 bash 特殊变量。


“我做到了。他们把我送到了这里。” -- 书店短剧(官方文档:gnu.org/software/bash/manual/bashref.html#Special-Parameters
我认为 $@ 是字符串,而 $* 是分隔列表(无论如何,根据上面接受的答案)。
@RastaJedi:"$@" 展开为列表,"$*" 展开为单个字符串。 $@ 的特殊行为适用于它在双引号内时。
否决,因为这不是一个非常完整或有用的答案。说“谷歌它”表明缺乏努力,特别是考虑到绝大多数人最终来自谷歌搜索。我认为您至少可以添加官方文档的链接。 TBH,我没有将其标记为删除的唯一原因是因为它至少是该问题的部分答案。我知道它很旧,但请考虑对其进行编辑以提供更多详细信息。
f
fedorqui

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

!i 在你的 for 循环中是什么意思?这实际上就是为什么我在这里,我无法在任何地方找到答案,因为我不知道该怎么称呼它。
@Anthony 这称为 variable indirection。您可以在 bash: indirect expansion, please explain? 中找到对他用法的一个很好的解释。
a
asachet

注意一些例子; $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”。