为什么我们不能使用 ${$#} 来获取传递给 shell 脚本的最后一个参数?

问题描述 投票:0回答:1

我正在阅读 Richard Blum 和 Christine Bresnahan 的《Linux 命令行和 Shell 脚本圣经》。在处理不同特殊变量(如

$#
$@
)的部分中,他们指出,虽然
$#
包含最终参数的索引,但它不能用于短路访问最终参数,如下所示:
${$#}
。相反,我们应该使用
${!#}
。对于为什么是这样的情况,没有给出太多解释,只是事实如此。

这一切都很好,我会记得我应该去做这样的事情 - 但是 bash 的机制中是否隐藏着一些更深层次的原因(或者甚至只是超出了介绍性文本范围的功能)来解释为什么

${$#}
不起作用?我花了一些时间在互联网上寻找答案,但没有找到太多答案。 bash 的手册页提到了它,但对我来说没有任何意义。

linux bash shell
1个回答
0
投票

为什么我们不能使用 ${$#} 来获取传递给 shell 脚本的最后一个参数?

我们不能使用

${$#}
来获取最后一个参数,因为变量扩展不是递归的,并且
{
}
的内容仅被 shell 解析一次。我们不能使用它,因为它从未实现过。我想这里真的没有太多解释,只是事实如此。

没有给出太多解释为什么会这样,只是说确实如此。

虽然我们无法在物理学中解释原因,但您可能认为我们可以在编程中解释原因。 “为什么”的唯一答案是“因为它是这样发明的”。编写(第一个)shell的人,将其编写为以这种方式工作,它得到了标准化,现在所有标准 shell 都以这种方式工作。

很可能是这样写的,因为它很容易做到。我认为这是我们能得到的最好的解释。

如果我确实 echo ${$#} 我会得到一个随机数(当我尝试时,我得到 5138)。这个数字有什么意义吗?

  • echo $$
    为您提供当前 shell 进程的 PID。
  • echo ${$}
    还给出当前 shell 进程的 PID。
  • ${var#string}
    从扩展 fo
    string
    的开头删除
    var
    • 例如
      a=1234; echo ${a#12}
      12
      的开头删除
      1234
      ,结果是
      34
  • ${$#}
    $$
    一样扩展到当前pid,然后
    #
    从变量的开头删除...“无”,所以它与
    $$
    相同。

请参阅 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

${parameter#word}
部分。

© www.soinside.com 2019 - 2024. All rights reserved.