Bash中的"延迟扩展"和嵌套变量。
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现在我可以轻松地使用所需的行了。
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+的。