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