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