【问题标题】:Double expansion of a parameter in Bash script [duplicate]Bash脚本中参数的双重扩展[重复]
【发布时间】:2016-02-06 00:35:21
【问题描述】:

我想将一个参数展开两次,${$PARAM} 不行。

例如,如果我将两个变量设置为文件名,然后想要遍历这些变量并展开到它们的文件名:

INPF_1=input1.inp
INPF_2=input2.inp

# copy the input files to the execution directory
for input_param in ${!INPF_*}; do
    echo ${$input_param}
done

如何从 for 循环中的这些参数访问文件名?

即,扩展为 input1.inpinput2.inp

【问题讨论】:

  • 如果您使用单个数组,这会更容易。 infp=( input1.inp input2.inp )
  • 不过,您尝试执行的操作称为间接扩展。我们已经有了相关的问题和答案。

标签: bash


【解决方案1】:

你几乎得到它:只需使用 "${!input_param}" 而不是 ${$input_param}

在这种情况下,引用没有任何作用,但这是一个好习惯。

请注意与${!INPF_@} 的区别,当在双引号之间使用时,它会扩展为每个变量名称的单独单词,而"${!INPF_*}" 则不会。你几乎总是想要"${!INPF_@}"。看看区别:

$ for var in  "${!INPF_*}"; do echo "$var"; done
INPF_1 INPF_2
$ for var in  "${!INPF_@}"; do echo "$var"; done
INPF_1
INPF_2

查看manual 了解各种参数扩展。

【讨论】:

  • 这并没有让我得到文件名。我已经更新以使其更清晰。
  • @salotz 啊,我明白了。更新中。
  • 我实际上走了这么远,但我没有意识到 * 与 @ 的区别。重复的答案给出了其余的答案,或者像@Charles Duffy 所说的使用像普通编程语言一样的数组。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2012-11-12
  • 2019-08-10
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多