如何在shell脚本中动态设置变量名?

kai*_*iya 3 shell scripting shell-script variable

我正在寻找sh与以下内容等效的内容(是的,真的。)

#!/bin/bash

exe1='filepath'
n=1
var=exe${n}
echo ${!var}
Run Code Online (Sandbox Code Playgroud)

回声应该输出的地方filepath。我想使用普通的 sh。

我已经玩了很多代码,但到目前为止我没有设法得到正确的输出。

我想实现一个类似数组的结构,我只想使用循环迭代已知数量的变量的变量名。

对于数组,我在符合 POSIX 的 shell 中找到了Arrays,但出于好奇,我仍在寻找问题的答案;)

Kus*_*nda 6

sh与问题中显示的内容等效的脚本:

#!/bin/sh

exe1='filepath'
n=1
var=exe$n
eval "echo \"\$$var\""   # or: eval 'echo "$'"$var"'"'
Run Code Online (Sandbox Code Playgroud)

eval行将在当前环境中将给定的字符串评估为命令。给定的字符串是echo \"\$$var\",在变量被扩展等之后,它会变成echo "$exe1"。这被传递给eval重新评估,并且命令打印字符串filepath


您还提到了数组。确实,POSIX shshell 没有与 egbash具有相同意义的命名数组,但它仍然具有位置参数列表。

有了它,您可以做大多数需要在 shell 中使用列表做的事情。

例如,

set -- 'filepath1' 'filepath2' 'filepath3'

for name in "$@"; do    # or: for name do
    echo "$name"
done
Run Code Online (Sandbox Code Playgroud)

这和刚才一样

for name in 'filepath1' 'filepath2' 'filepath3'
do
    echo "$name"
done
Run Code Online (Sandbox Code Playgroud)

由于我很确定您要实现的目标,因此我无法提出更有趣的示例。但是在这里你有一个类似数组的结构,你可以迭代它。为什么要迭代变量名仍然不清楚。