${!} 和 ${!!} 在 bash 脚本中意味着什么?

${!} 和 ${!!} 在 bash 脚本中意味着什么?

如果有人能回答我,我将不胜感激,而不是只是删除痴迷地说这个那个那个,而不是真正回答。

我有一个命令

#/bin/sh 
while :; \
do sleep 6h & wait $${!}; \ 

$$是否指的是第二个进程,即SLEEP?这意味着什么${!}?我真的不知道语法(我的意思是我理解流程,但我无法确切地找到为什么它有两个 $$ 符号,以及 {!} 的用途。

如果有人能在删除我的问题之前启发我,我将非常感激,谢谢。

答案1

官方文档说:

($!) 扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用 bg 内置函数执行(请参阅作业控制内置函数)。

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameters

以及$${!}都是${!!}错误。

如果您按照发布的方式运行脚本,则应该会出现错误:

./tst.sh: line 3: wait: `1234{!}': not a pid or valid job spec

这里 1234 是 shell 本身的 pid,从$$.并且{!}只是一个字符串常量。

在语法上是${!!}正确的,但尝试对变量进行间接扩展!,并且由于此类变量不可能真正存在 - 错误是:${!!}: bad substitution

间接解释如下: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion

如果您确实有该代码(带有$${!}它确实有效。那么这很可能不是 shell 脚本,而是将 shell 脚本嵌入到其他语言中。也用于$标记变量的那个。大多数此类语言使用重复的美元符号作为转义,因此在宿主语言使用包含 shell 脚本的字符串完成后就$$anything变成了 a 。$anything

相关内容