【问题标题】:dynamically allocate variables in bash在bash中动态分配变量
【发布时间】:2014-10-06 01:44:09
【问题描述】:

我在我的 bash 脚本中遇到了问题。 我需要根据我文件夹中的文件分配新变量,并根据脚本获得的参数数量(无论它是否是脚本)为它们分配一个数字。 我正在尝试编写这样的脚本:

n_${array[*]}=`arg_count ${array[*]}`

而 arg_count 检查脚本获得了多少参数。 为了进一步使用,如果需要具有不同参数的函数,我将更改这些变量。

提前致谢!

【问题讨论】:

  • 考虑发布您的脚本吗?
  • ${array[*]} 将数组中的元素与 IFS 的第一个字符组合在一起,然后(当不带引号时,如此处)将它们拆分为 IFS 中的所有字符和 glob-expands。在将内容传递给arg_count 时,它非常非常非常不太可能符合您实际想要实现的行为。请考虑 "${array[@]}"(带引号)。
  • 另外,请参阅 BashFAQ #6 关于间接分配给变量:mywiki.wooledge.org/BashFAQ/…
  • ...好吧,如果您只想计算数组中元素的数量,那就是${#array[@]}

标签: bash variables dynamic


【解决方案1】:

通常,您可以使用 declare 内置函数来完成此操作,因为它是一个命令,其参数是类似于赋值的字符串。

declare "n_${array[*]}=$(arg_count ${array[*]})"

但是,请注意,除非您适当地设置了 IFS 并且数组内容是可以接受的,否则 ${array[*]} 的扩展不会是构成有效标识符一部分的字符串。

您可能想要使用关联数组,

declare -A n
n[${array[*]}]=$(arg_count ${array[*]})

或使用适当支持数据结构的编程语言编写代码。

【讨论】:

  • 如何使 IFS 适应?我尝试设置它,但我最终切断了部分字符串
  • @NatanhelPoliszuk,这取决于哪些字符可以合法地出现在您的数据中。供参考的默认值为$' \t\n'
  • ${array[*]} 生成一个字符串,其中数组的元素由IFS 的第一个字符连接。默认为空格,变量名不能包含空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多