Bash中的"延迟扩展"和嵌套变量。

17 浏览
0 Comments

Bash中的"延迟扩展"和嵌套变量。

我以前可以批处理完成以下操作,但是现在死活不知道如何在bash中实现,所以需要一些帮助。基本上,我使用了一个for循环和延迟展开来设置变量,当for循环遍历数组时。大致如下所示:\n

FOR /L %%A in (1,1,10) DO (
   SET someVar = !inputVar[%%A]!
)

\n括号仅用于清晰表述。\n现在我在bash中遇到了类似的问题,但是无法弄清楚“延迟展开”(如果bash中真的是这样称呼的话)如何工作:\n

for (( a=1; a<=10; a++ )); do
   VAR${!a}= some other thing
done

\n我完全搞错了吗?\n更新:\n看起来我完全搞错了,@muru提到的XY问题提示我重新审视了我的做法。我真正问题的简单解决方法是这样的:\n

readarray -t array < /filepath

\n现在我可以轻松地使用所需的行了。

0
0 Comments

Bash中的“延迟扩展”和嵌套变量的问题

在上述内容中,提到了使用eval来解决问题,不确定是否是最佳选项,但可以起作用。

INPUT_VAR=(fish cat elephant)
SOME_VAR=
for i in `seq 0 3`;do
    SOME_VAR[$i]='${INPUT_VAR['"$i"']}'
done
echo "${SOME_VAR[2]}"        # ${INPUT_VAR[2]}
eval echo "${SOME_VAR[2]}"   # elephant

关于eval的解释:

eval command in Bash and its typical uses

在Bash中使用数组也可能会有帮助:

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html

需要注意的是,数组只在新版本的Bash中支持。

这是Bash 4.0及更高版本,对吗?

所以,为了确保我理解你的意思,没有使用"eval"的echo只会将"${SOME_VAR[2]}"显示为字符串,而eval会显示实际的变量?

实际上并不是这样,我现在可以看到我选择的变量名并不是很好。在${SOME_VAR[2]}中,这是变量扩展,在这种情况下,它是变量SOME_VAR在索引2上的值(与标准的$VAR_NAME相同)。其中放置了字符串"${INPUT_VAR[2]}"。如果您想扩展该字符串并将其用作变量,eval将为您提供服务-将普通字符串"${SOME_VAR[2]}"作为变量进行评估,结合echo显示$SOME_VAR在索引2上的内容。

好的,我再次正确阅读了一遍,是的。就是这样。在${SOME_VAR[2]}中,字符串作为变量名,如果您想将该字符串作为变量使用,eval将为您服务。另外,看起来支持是针对Bash 4.0+的。

0