${!#} 在 Shell 脚本中是什么意思?

dz9*_*902 27 shell-script

在一个混淆的恶意 shell 脚本中发现了这个,开头是:

${!#}${*^} <<<...

找不到对 的任何引用${!#},但是当echo'd 时,它输出-bash. 这是正在运行的 shell 的秘密推荐人吗?为什么会有一个额外的破折号呢?

谢谢!

G-M*_*ca' 36

这个答案是bash特定的,因为您尝试了echoin bash。并非所有 shell 的行为都相同。

在 中bash,如果$var1foo,则${!var1}与 相同$foo。这!间接扩展:它导致bash从给定的变量中检索一个变量名( foo) 而不是一个

现在替换var1#$#是参数的数量。如果 $#为 0,${!#}则为$0。如果 $#是 4,${!#}$4。换句话说,${!#}是最后一个位置参数,无论有多少个位置参数。

如果没有位置参数,$#则为0,因此结果为$0,即 shell 或脚本的名称(参考)。在你的情况下,那是bash(加上一个主要的-意思是它是一个登录shell)。

快速测试:

$ echo ${!#}
-bash

$ set the quick brown fox

$ echo ${!#}
fox
Run Code Online (Sandbox Code Playgroud)

  • 您的回答仅适用于“bash”,但您没有提及。在所有其他 shell 中,`${!#}` 将扩展为最后一个后台命令(`$!`)的 PI​​D,并从开头删除一个空字符串(`${var#pat}` 形式的参数扩展)。 (19认同)
  • 评论确实是为了澄清答案;虽然可以假设 bash,但鉴于问题中的文本,(协作!)编辑此答案以指示特定于 shell 的行为当然是合理的。 (2认同)