我想从循环中导出变量。我无法做到。我不确定这里缺少什么。
任何建议都会有很大的帮助
var="ahs tcs amq tos"
for i in ${var}
do
${i}_log="/var/tmp/pmp_${i}_log"
#export ${i}_log
done
答案 0 :(得分:2)
这个想法是正确的,只需使用declare
变量即时创建变量。还要避免使用未引用的变量扩展(for i in ${var}
)进行循环。使用正确的数组语法
var=("ahs" "tcs" "amq" "tos")
for i in "${var[@]}"; do
declare ${i}_log="/var/tmp/pmp_${i}_log"
export "${i}_log"
done
作为良好实践的旁注,请始终指定解释程序来运行脚本。它可以是#!/bin/bash
或#!/bin/sh
,也可以是#!/usr/bin/env bash
答案 1 :(得分:0)
另一种方法是使用单个导出的关联数组而不是多个变量:
编辑:oops,这不起作用,因为无法导出数组。 :\
var="ahs tcs amq tos"
declare -A logs
for i in ${var}
do
logs[$i]="/var/tmp/pmp_${i}_log"
done
echo ${logs[@]}
#### export logs
另请参阅Inian's answer以获取有关循环和数组的更好实践。
答案 2 :(得分:0)
这适用于破折号和bash(只要i和插入它们的路径是合理的):
#!/bin/sh
var="a b c d"
for i in $var
do
export "${i}_log=/var/tmp/pmp_${i}_log"
#test
sh -c "echo \$${i}_log"
done
答案 3 :(得分:0)
这可以在没有循环的一行中完成
printf '%s\n' {ahs,tcs,amq,tos} | xargs -I {} bash -c 'export {}_log="/var/tmp/pmp_{}_log"; echo {}_log=${{}_log}'
或循环
#!/bin/bash
for i in {ahs,tcs,amq,tos}; do
#export
export "${i}_log=/var/tmp/pmp_${i}_log";
#test
bash -c 'echo '"${i}_log"'='"\$${i}_log"; done
done
${i}_log="/var/tmp/pmp_${i}_log"
失败的原因是因为${i}_log
未加引号,导出语法为export somevar=somedefintion
。为了动态生成变量名,请用引号括起语句,以便对其进行插值。即。 export "${dynamic}_var=${dynamic}_definition"