在一个混淆的恶意 shell 脚本中发现了这个,开头是:
${!#}${*^} <<<...
找不到对 的任何引用${!#},但是当echo'd 时,它输出-bash. 这是正在运行的 shell 的秘密推荐人吗?为什么会有一个额外的破折号呢?
谢谢!
G-M*_*ca' 36
这个答案是bash特定的,因为您尝试了echoin bash。并非所有 shell 的行为都相同。
在 中bash,如果$var1是foo,则${!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)