我正在寻找与sh
以下内容等效的内容(是的,确实如此。)
#!/bin/bash
exe1='filepath'
n=1
var=exe${n}
echo ${!var}
echo 应该输出的地方filepath
。我想使用普通的 sh。
我已经对代码进行了很多尝试,但到目前为止我还没有设法获得正确的输出。
我想实现一个类似数组的结构,我只想使用循环迭代已知数量的变量的变量名。
对于我找到的数组符合 POSIX 标准的 shell 中的数组但出于好奇,我仍在寻找问题的答案;)
答案1
sh
与问题中呈现的内容等效的脚本:
#!/bin/sh
exe1='filepath'
n=1
var=exe$n
eval "echo \"\$$var\"" # or: eval 'echo "$'"$var"'"'
该eval
行将把给定的字符串评估为当前环境中的命令。给定的字符串是echo \"\$$var\"
,在变量扩展等之后,它将变成echo "$exe1"
。这将被传递eval
以进行重新评估,并且该命令会打印字符串filepath
。
您还提到了数组。确实,POSIX sh
shell 没有与eg 相同意义上的命名数组bash
,但它仍然具有位置参数列表。
有了它,您可以完成需要在 shell 中使用列表完成的大部分操作。
例如,
set -- 'filepath1' 'filepath2' 'filepath3'
for name in "$@"; do # or: for name do
echo "$name"
done
这与刚才的相同
for name in 'filepath1' 'filepath2' 'filepath3'
do
echo "$name"
done
因为我很清楚你想要实现的目标,所以我无法想出一个更有趣的例子。但这里有一个类似数组的结构,可以对其进行迭代。为什么你想要迭代变量的名称仍然不清楚。
答案2
如果您想迭代多个文件(从exe1=filepath
示例中隐含),简单的 for 循环是否有效?
final_file
是保存与 file_pattern 匹配的最后一个文件的变量 - 复制 bash ${!var}
(最后一个参数引用)。
#/bin/sh
final_file=''
file_pattern='*.txt'
for f in $file_pattern
do
echo $f
final_file=$f
done
echo $final_file