2017-06-08 58 views
1

我想從循環中導出變量。我無法做到。我不確定這裏缺少什麼。從while循環中導出變量

任何建議將是巨大的幫助

var="ahs tcs amq tos" 

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

是'$ i'你希望它是價值?也許你應該「回聲」以確保。 – jww

回答

1

的想法是正確的,只是使用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

+2

最後選民可以解釋它的原因嗎?我沒有做任何事情,但展示了遵循 – Inian

+0

(或)的最佳實踐,它只會成爲另一個無腦無望的投降? – Inian

+0

我沒有downvoted,但你可以將兩行合併成一個('declare -x key = val'或'export key = val')。 – PSkocik

0

另一種可能是使用一個單一的出口關聯數組,而不是多個變量:

編輯:哎呀,這是不行的,因爲數組不能出口。 :\

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,以獲取更好的循環和數組實踐。

+3

不幸的是,陣列無法導出 – MichalH

+0

@Mike哦,正確...謝謝。 TIL 當我嘗試導出它時,不會幫助該bash不會引發任何錯誤。 – swalladge

+0

@Mike爲什麼你會說陣列不能出口?此外,你甚至可以導出一個換行符或空格分隔的列表(取決於你的'$ IFS'),稍後用'real_list =($ seperated_list)'解析它。然後你可以通過'first_var = $ {real_list [0] }' – yosefrow

0

這部作品破折號和bash(只要我的,對他們插值到路徑是合理的):

#!/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 
+0

我試過這個,它給了我期望..結果...感謝您的幫助 –

+0

@SunilSharma我不需要感謝:D給我你的upvotes和接受! :d – PSkocik

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