在一个混淆的恶意 shell 脚本中发现了这一点,开头是:
${!#}${*^} <<<
...
找不到对 的任何引用${!#}
,但是当echo
'd 时,它会输出-bash
。这是对正在运行的 shell 的秘密引用吗?那为什么会有额外的破折号呢?
谢谢!
在一个混淆的恶意 shell 脚本中发现了这一点,开头是:
${!#}${*^} <<<
...
找不到对 的任何引用${!#}
,但是当echo
'd 时,它会输出-bash
。这是对正在运行的 shell 的秘密引用吗?那为什么会有额外的破折号呢?
谢谢!
这个答案是
bash
特定的,因为您尝试了echo
inbash
。并非所有 shell 的行为都相同。在
bash
中,如果$var1
是foo
,则${!var1}
与 相同$foo
。!
is间接扩展:它导致bash
从给定变量中检索变量名(foo
) 而不是值。现在替换
var1
为#
.$#
是参数的数量。如果$#
为 0,${!#}
则为$0
。如果$#
是 4,${!#}
是$4
。换句话说,${!#}
是最后一个位置参数,不管有多少位置参数。如果没有位置参数
$#
is0
,则结果为$0
,即 shell 或脚本的名称(参考)。在你的情况下,那是bash
(加上一个主要-
的意思是它是一个登录外壳)。快速测试: