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

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

我正在寻找与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 shshell 没有与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

相关内容