1

我在循环中调用定义的变量,它向我显示“错误替换”错误。我知道我在脚本中做错了什么,或者这不是这样做的权利。但理论上,我应该能够在 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
4

2 回答 2

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
于 2013-08-14T06:54:32.340 回答
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

除了已经提供了示例的变量间接之外,您也可以尝试一个安全的评估,但这并不是一个真正值得称道的解决方案:

#!/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
于 2013-08-14T07:05:45.587 回答