在bash $ {var_ $ i}中使用For循环的变量

时间:2013-08-14 06:48:27

标签: bash

我在循环中调用已定义的变量,它向我显示“错误替换”错误。我知道我在脚本中做错了什么,或者这不是做这件事的权利。但理论上,我应该能够在for循环中调用这些变量,这样我的脚本就可以执行这些变量定义的次数。

#!/bin/bash

export CONFIG_FILE=$1

. $CONFIG_FILE

for ((  i = 1 ;  i <= $Deploys;  i++  ))
do
        echo ${Source_Path_$i}
        echo ${Dest_Server_$i}
        echo ${Dest_Path_$i}
done

CONFIG_FILE的内容

export Deploys=2

export Source_Path_1=./Source1
export Dest_Server_1=Server1
export Dest_Path_1=/Destination1


export Source_Path_2=./Source2
export Dest_Server_2=Server2
export Dest_Path_2=/Destination2

这是我执行bash脚本时遇到的错误

line 9: ${Source_Path_$i}: bad substitution

2 个答案:

答案 0 :(得分:2)

您可以使用${!var}的变量间接来可靠地解决问题。但是,它有点冗长:

for (( i = 1 ;  i <= $Deploys;  i++ )); do
    source="Source_Path_$i"
    echo "${!source}"
    server="Dest_Server_$i"
    echo "${!server}"
    path="Dest_Path_$i"
    echo "${!path}"
done

答案 1 :(得分:1)

由于您“获取”配置文件,因此不再需要使用导出,并且最好只使用数组:

Deploys=2

Source_Path[1]=./Source1
Dest_Server[1]=Server1
Dest_Path[1]=/Destination1

Source_Path[2]=./Source2
Dest_Server[2]=Server2
Dest_Path[2]=/Destination2

并有一个这样的脚本:

#!/bin/bash

CONFIG_FILE=$1

. "$CONFIG_FILE"

for (( i = 1; i <= Deploys; i++ ))
do
    echo "${Source_Path[i]}"
    echo "${Dest_Server[i]}"
    echo "${Dest_Path[i]}"
done

你可以尝试一个安全的eval,除了已经提供了一个例子的变量间接,但它并不是一个值得称赞的解决方案:

#!/bin/bash

CONFIG_FILE=$1

. "$CONFIG_FILE"

for (( i = 1; i <= Deploys; i++ ))
do
    eval "echo \"\${Source_Path_$i}\""
    eval "echo \"\${Dest_Server_$i}\""
    eval "echo \"\${Dest_Path_$i}\""
done