【问题标题】:Nested for-loop and variable naming嵌套 for 循环和变量命名
【发布时间】:2016-11-02 18:20:05
【问题描述】:

我正在尝试使用 for 循环以下列方式命名我的变量:

for (( a=1; a<=10; a++ )); do
    for (( b=1; b<=100; b++ )); do
        line[$a]position[$b]="This is LINE $a at POSITION $b."
        eval echo "${line[a]position[b]}"
    done
done

这可能吗,我的代码错了?

【问题讨论】:

    标签: bash variables for-loop


    【解决方案1】:

    不,这不可能通过您尝试的方式进行。首先,[] 不允许出现在名称中(参见手册中的definitions),因此您必须使用类似line${a}position$b 的名称。

    一个(mostly frowned upon)选项是使用eval

    #!/bin/bash
    
    for (( a=1; a<=2; a++ )); do
        for (( b=1; b<=2; b++ )); do
            varname=line${a}position$b
            eval $varname=\"This is LINE \$a at POSITION \$b.\"
            echo "${!varname}"
        done
    done
    

    这首先创建用作变量名的字符串varname。对于每个循环,它变为line1position1line1position2 等等。

    然后,在这一行,我们将您的字符串分配给具有该名称的变量:

    eval $varname=\"This is LINE \$a at POSITION \$b.\"
    

    引用使得字符串扩展为,例如对于第一个循环,

    line1position1="This is LINE $a at POSITION $b."
    

    line1position1 的值变成了This is LINE 1 at POSITION 1.

    要访问这个变量的值,我们必须使用indirect expansion${!varname}中的!表示varname不是我们想要的变量名,而是扩展为它。

    话虽如此,Bash 4.3 引入了namerefs,它可以更优雅地解决这个问题:

    #!/bin/bash
    
    for (( a=1; a<=2; a++ )); do
        for (( b=1; b<=2; b++ )); do
            declare -n refvar=line${a}position$b
            refvar="This is LINE $a at POSITION $b."
            echo "$refvar"
        done
    done
    

    这里不需要eval

    两种解决方案的输出如下:

    This is LINE 1 at POSITION 1.
    This is LINE 1 at POSITION 2.
    This is LINE 2 at POSITION 1.
    This is LINE 2 at POSITION 2.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多