简单的问题。bash shell 是否支持在编写 shell 脚本时使用指针?
${var[@]}
在迭代数组时,我熟悉扩展符号,$var
但不清楚这是利用指针来迭代数组索引。bash 是否像其他语言一样提供对内存地址的访问?
如果 bash 不支持使用指针,那么其他 shell 会做什么?
简单的问题。bash shell 是否支持在编写 shell 脚本时使用指针?
${var[@]}
在迭代数组时,我熟悉扩展符号,$var
但不清楚这是利用指针来迭代数组索引。bash 是否像其他语言一样提供对内存地址的访问?
如果 bash 不支持使用指针,那么其他 shell 会做什么?
指针(指向内存位置)在任何比 C 更高级别的东西中都不是一个有用的概念,无论是 Python 还是 shell。对对象的引用当然在高级语言中很有用,甚至可能是构建复杂数据结构所必需的。但在大多数情况下,从内存地址的角度思考太低级了,没有什么用处。
在 Bash(和其他 shell)中,您可以使用
${array[index]}
符号获取数组元素的值,将它们分配给array[index]=...
并使用${#array[@]}
. 括号内的表达式是算术表达式。作为一个虚构的例子,我们可以为所有数组成员添加一个常量前缀:(如果我们只关心值,而不关心索引,就
for x in "${array[@]}" ; do...
可以了。)对于关联数组或稀疏数组,数字循环没有多大意义,但我们需要使用
${!array[@]}
. 例如除此之外,Bash 有两种方法可以间接指向另一个变量:
${!var}
,它使用名称为 in的变量的值var
,以及declare
内置函数(或ksh
兼容的同义词,typeset
)创建。declare -n ref=var
对变量进行ref
引用var
。Namerefs 也支持索引,如果我们有
arr=(a b c); declare -n ref=arr;
then${ref[1]}
将扩展为b
. Using${!p[1]}
将取而代之p
作为一个数组,并引用由其第二个元素命名的变量。在 Bash 中,namerefs 的字面意思是,通过name引用,并且在函数内部使用 nameref 将使用命名变量的本地值。这将打印
local value of var
.BashFAQ 也有一篇关于间接的较长文章。
不,
bash
没有“指针”,但它确实有引用:从
bash
手册页:不,shell 不使用“指针”(如 C 中所理解的那样)。
数组可以使用索引:
echo "${array[2]}"
但@
在您的示例中,它并不是真正的“指针”。这是一种表达“数组值列表”的方式。shell 解析器理解的东西。类似于a的方式:扩展到所有“位置参数”列表。
虽然可以像这样迭代地定义和访问 bash 整数索引数组;
bash 中的关联或基于字符串的索引数组需要以下迭代定义;
回答有关指针的问题并使用 bash 中的指针;编译后的 bash 二进制文件的内部功能确实使用了指向堆栈上分配的内存的指针,并且使用
eval
. 见[间接引用] http://tldp.org/LDP/abs/html/ivr.html )有龙;由于安全隐患,
eval
应谨慎使用