从while循环中导出变量

时间:2017-06-08 07:15:57

标签: linux bash shell

我想从循环中导出变量。我无法做到。我不确定这里缺少什么。

任何建议都会有很大的帮助

var="ahs tcs amq tos"

for i in ${var}
do
   ${i}_log="/var/tmp/pmp_${i}_log"
   #export ${i}_log
done

4 个答案:

答案 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"

请参阅http://wiki.bash-hackers.org/syntax/quoting