【问题标题】:Bash for loop to set a variable, its value, and evaluate it?Bash for 循环设置一个变量,它的值,并评估它?
【发布时间】:2017-06-22 04:47:01
【问题描述】:

我如何使用for循环来定义一个变量,它的值,能够评估它?

我无法弄清楚评估部分,但使用 for 循环定义变量 它的值似乎有效。具体来说,

for i in {1..4}
do
    export my${i}var="./path${i}_tofile"
   # or
   # export my${i}var=./path${i}_tofile
   # or
   # eval "my${i}var=\"./path${i}_tofile\""
    echo $[my${i}var]
done

echo 没有正确计算,但 shell 确实正确地创建了变量和值。

echo $my1var

返回

./path1_tofile

但我需要使用 $i 作为变量名称的一部分来评估变量。

【问题讨论】:

  • my${i}var="./path${i}_tofile" 无效有效。你可以启动一个新的shell并再次检查吗?

标签: bash shell


【解决方案1】:

您应该改用数组变量:

declare -a myvar
for i in {1..4}
do
    myvar[$i]="./path${i}_tofile"
done

更多详情:http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html

【讨论】:

    【解决方案2】:

    如果您使用数组,事情就会变得复杂:

    for i in {1..4}
    do
        declare my${i}var="./path${i}_tofile"
        tmpvar=my${i}var             # temporary variabled needed for...
        echo "$tmpvar=${!tmpvar}"    # bash indirect variable expansion
    done
    

    【讨论】:

    • 这很棒。如果您可以为最后一部分添加解释"$tmpvar=${!tmpvar}" 对于像我这样的新手来说太棒了:-)
    • 检查这个答案以获得很好的解释:stackoverflow.com/a/10820497/7552
    • 间接扩展。我认为听起来像 eval。
    • 没有。 eval 将执行潜在的命令替换。间接扩展不会。用这个测试:tmpvar='foo`execute nasty command`'; echo "${!tmpvar}"; eval echo "${tmpvar}"——间接扩展本质上是“变量未找到,替换空字符串”,eval 执行讨厌的命令。
    【解决方案3】:

    只需将您正在使用的 echo 替换为:

    v=my${i}var
    echo ${!v}
    

    然后,脚本:

    #!/bin/bash
    
    for i in {1..4}
    do
        export my${i}var="./path${i}_tofile"
        v=my${i}var
        echo ${!v}
    done
    

    将执行为:

    $ ./script
    ./path1_tofile
    ./path2_tofile
    ./path3_tofile
    ./path4_tofile
    

    但是,老实说,使用间接变量绝非易事。
    请考虑使用索引数组(在这种情况下,即使是普通数组也可以):

    declare -A myvar
    
    for i in {1..4}
    do
        myvar[i]="./path${i}_tofile"
        echo "${myvar[i]}"
    done
    

    【讨论】:

    • 看起来像数组是要走的路 - 谢谢!稍后我将需要在同一脚本中引用新变量,因此使用数组索引是能够进入另一个 for 循环并重新引用相同变量的最佳方法。间接扩展解释适用于当前循环并正确设置变量值,但不允许我随后使用相同索引引用变量 ...for I in {1..4} 循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2016-07-26
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多