【问题标题】:In bash, is there a way to substitue or nest a variable within a variable? [duplicate]在 bash 中,有没有办法在变量中替换或嵌套变量? [复制]
【发布时间】:2017-10-10 15:36:18
【问题描述】:

假设我有两个变量;

var_one_string=foo
var_two_string=bar

我将如何完成这样的事情(伪代码示例);

示例 1

for i in one two; do
  echo $var_${i}_string
done
# Desired output
foo
bar

示例 2

for i in one two; do
  echo $var_$(echo ${i})_string
done
# Desired output
foo
bar

我知道这是不好的替换,我只是想知道是否有办法将字符串嵌套在另一个变量调用中?

编辑:我能够让它工作

var_one_string=foo
var_two_string=bar

for i in $(echo ${!var_*}); do
    echo ${!i}
done
foo
bar

【问题讨论】:

  • 放入所需的输出。不确定你到底想要什么。
  • 添加了所需的输出。
  • 除了与许多其他 StackOverflow 问题重复之外,这是BashFAQ #6
  • @s3d83d, ...btw,至少无论是否经常,间接扩展最好用功能更强大的数据结构代替。 (一个关联数组,一个通过 nameref 访问的数字索引数组,&c)。
  • 感谢 Charles Duffy,我能够让它与间接扩展一起工作。

标签: bash


【解决方案1】:

bash 中使用内置的declare 以及间接变量扩展。首先将数组中动态性质的元素定义为

#!/bin/bash

list=(one two)
unset count

for var in "${list[@]}"; do 
    declare var_${var}_string="string"$((++count))
done

现在使用间接扩展访问创建的变量

for var in "${list[@]}"; do 
    dymv="var_${var}_string"
    echo "${!dymv}"
done

永远不要使用eval 来满足这个要求。由于不太可能使用有害命令进行代码注入,因此可能很危险。

【讨论】:

  • 好的,所以你告诉我我的问题不是我想要的,它仍然适用于我更新的问题。 (即 var_one_string=string1)
  • @s3d83d:检查我的更新
  • 哈哈哈,你让我知道我问问题很糟糕。同样,我不打算在 var 集中使用模式。我更新的问题怎么样。
  • @s3d83d:您需要即时将变量值分配给declare。如果脚本向用户询问变量并存储它可以吗?
  • 我希望它是自主的。到目前为止,用户输入仅限于 y/n....希望将其保留在那里。
【解决方案2】:

基本上可以使用eval:echo $(eval '$var_'"${i}")

但你也可以使用字典:

declare -A vars
vars=( ["one"]="number-one" ["two"]="number-two" )
i="one"
echo "${vars[${i}]}"

【讨论】:

  • 好的,所以数组可以与我的“原始”示例一起使用。但是,如果嵌套变量结构更像这样呢? var_one_string=string1;回显 $var_${i}_string。我会将此添加到我原来的问题中。
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多