Bash @ 参数 - “特殊”数组?到底是什么?

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

我试图了解

(ba)sh
如何“在幕后”工作。我注意到一个困扰我的问题。大多数参数,例如
@
?
甚至
*
都可以视为只读变量。它们可以分配给具有完全相同“值”的变量(例如
STAR_VAR=$*
)。

@
是不同的,尤其是用作
"$@"
时。它更像是数组(我们称之为
SET
),可以使用特殊的非数组语法进行访问,例如
"$@"
而不是
"${SET[@]}"
。您可以了解如何以及何时使用它,但仍然是访问“编号”参数的相当混乱的方式(它更像数组,但您使用非数组语法进行访问)。

Bash
得到了很大的改进,用更“干净”的语法(如
``
)替换了像
$()
这样的遗留结构。我想知道为什么这个方面没有被清理以使
bash
语法不那么棘手,例如。添加到 shell 或函数的环境数组变量(例如
SET
),其中包含“编号”参数(当然可以选择使用旧语法)?

bash syntax
1个回答
0
投票

到底是什么?

"$@"
是一个超级非常特殊的 POSIX(不是 Bash)黑客,它是通过 POSIX shell 规范指定的超级非常特殊的语法来处理的。 https://pubs.opengroup.org/onlinepubs/9699919799/utilities /V3_chap02.html#tag_18_05_02 .

为什么这个方面没有被清理以使 bash 语法不那么棘手

便携性。 Bash 保持了 POSIX 的可移植性,甚至有时会在 POSIX 发生变化时破坏其行为。

(ba)sh 如何“在幕后”工作

Bash 在“底层”的工作方式与指定的方式完全相同。

"$@"
被位置参数的 words 替换,无需对这些单词运行单词拆分和文件名扩展,也无需加入这些单词。源代码在这里https://github.com/bminor/bash/blob/f3b6bd19457e260b65d11f2712ec3da56cef463f/subst.c#L10993https://github.com/bminor/bash/blob/f3b6bd19457e260b65d11f2712ec3 da56cef463f/subst.c# L10453.

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