2013-07-09 90 views
0

這是我的問題。我有以下的bash片段:python/bash變量擴展for循環for json數組

#!/bin/bash 

R1=$(cat $HRESULTPATH/KEYLIST.OUT|grep "$KEYCHAIN") 
H1=$(echo $R1|tr -d [[:space:]]) 
O1=$(echo $H1|tr -d '\"') 
S1=$(echo $KEYCHAIN|tr -d [[:space:]]) 

export TESTCASE1=`echo "CLI - Test Case $tcindex - Was the Card read and listed as an active Keychain?"` 
export OUTFILE1="KEYLIST.OUT" 
if [[ $S1 =~ $O1 ]]; then 
    export RESULT1=`echo -e "PASS"` 
    export MESSAGE1=`echo -e "\"$KEYCHAIN\" was list as an active Keychain"` 
else 
    export RESULT1=`echo -e "FAIL"` 

export MESSAGE1=`"\"$KEYCHAIN\" was not listed and not active"` 
Rf=$(cat $HRESULTPATH/KEYLIST.OUT|grep "$KEYCHAIN") 
Zf=$(echo $Rf|sed 's/~~*/~/g') 
export ERRORDIFF1=`(echo -ne "\"$KEYCHAIN\" was expected");(echo " -- \"$Zf\" was captured from Guest")` 
fi 

tcindex=$((tcindex+1)) 

R2=$(cat $HRESULTPATH/DUMP.OUT|grep "$DUMP") 
H2=$(echo $R2|tr -d [[:space:]]) 
O2=$(echo $H2|tr -d '\"') 
S2=$(echo $DUMP|tr -d [[:space:]]) 

export TESTCASE2=`echo "CLI - Test Case $tcindex - Did the tool report the user in AD? and belonging to a Zone?"` 
export OUTFILE2="DUMP.OUT" 
if [[ $S2 =~ $O2 ]]; then 
    export RESULT2=`echo -e "PASS"` 
    export MESSAGE2=`echo -e "sctool -d reflected $SCUSER as \"in AD and zoned\""` 
    else 
    export RESULT2=`echo -e "FAIL"` 
    export MESSAGE2=`echo -e "sctool -d did not reflect $SCUSER in AD or zoned or both"` 
Rf=$(cat $HRESULTPATH/DUMP.OUT|grep -i "zone") 
Zf=$(echo $Rf|sed 's/~~*/~/g') 
export ERRORDIFF2=`(echo -ne "\"$DUMP\" was expected");(echo " -- \"$Zf\" was captured from Guest")` 
fi 

我這個做什麼,然後導出了的「指數」變量,如「MESSAGE1,RESULT1或RESULT2 ... X成JSON對象,然後。目前的數據網絡的形式裏面不是最完美的解決方案,但它爲我,我是「畜生」迫使蟒蛇陣列,意義的創造,我將列出了以下工作:

results = [{'TCID':1, 'Date': '$DATESTAMP','Time': '$TIMESTAMP', 'Build':'$BUILD', 'TestCase': '$TESTCASE1', 'Result': '$RESULT1', 'Message':'$MESSAGE1', 'OutFile': '$OUTFILE1', 'ErrorDiff':'$ERRORDIFF1'}, {'TCID':2, 'Date': '$DATESTAMP','Time': '$TIMESTAMP', 'Build':'$BUILD','TestCase': '$TESTCASE2', 'Result': '$RESULT2', 'Message':'$MESSAGE2', 'OutFile': '$OUTFILE2', 'ErrorDiff':'$ERRORDIFF2'}, {'TCID':3, 'Date': '$DATESTAMP','Time': '$TIMESTAMP', 'Build':'$BUILD', 'TestCase': '$TESTCASE3', 'Result': '$RESULT3', 'Message':'$MESSAGE3', 'OutFile': '$OUTFILE3', 'ErrorDiff':'$ERRORDIFF3'}] … 

我正在重新編寫所有這些代碼,以便1)更容易維護,2)擁有a能夠更輕鬆,更高效地將測試和結果添加到陣列中。我認爲Python代碼將是最簡單的部分,因爲我可以創建一個簡單的for循環來綁定來自bash代碼的變量的索引,然後動態地創建python數組,但它並沒有實現好。

這裏是我的實驗Python代碼(在第一外面寫的,測試理論),然後嵌入在bash腳本里面:

TFILE="`basename $0`.$$.py" 
cat <<END >$TFILE 
#!/usr/bin/env python 
import os 
results = [] 
for i in range(1,2): 
a = "TCID" 
b = i 
c = 'Message' 
d = '$MESSAGE' 
e = str(i) 
f = 'Date' 
g = '$DATESTAMP' 
h = 'Time' 
j = '$TIMESTAMP' 
k = 'Build' 
l = '$BUILD' 
m = 'TestCase' 
n = '$TESTCASE' 
p = 'Result' 
q = '$RESULT' 
r = 'OutFile' 
s = '$OUTFILE' 
t = 'ErrorDiff' 
u = '$ERRORDIFF' 

results.append({a:b,c:d+e,f:g,h:j,k:l,m:n+e,p:q+e,r:s+e,t:u+e}) 

with open('file.json', 'w') as f: 
    json.dump(results, f, sort_keys=True, ensure_ascii=False) 

end 

運行此以外的bash,蟒蛇創建下面的數組,這正是我想要的東西:

[{"Build": "$BUILD", "Date": "$DATESTAMP", "ErrorDiff": "$ERRORDIFF1", "Message": "$MESSAGE1", "OutFile": "$OUTFILE1", "Result": "$RESULT1", "TCID": 1, "TestCase": "$TESTCASE1", "Time": "$TIMESTAMP"}] 

(記住,陣列將繼續對46種不同的結果,因此郵件等,每次都會被索引,像上面的蠻力例子)

然而,當在bash腳本中運行這個時,我沒有得到所有變量的變量擴展,只有那些沒有添加索引的變量,所以$ BUILD被添加,但是「$ MESSAGE1」沒有,只有指數被添加:現在

[{"Build": "831", "Date": "07-08-13", "ErrorDiff": "1", "Message": 1, "OutFile": "1", "Result": "1", "TCID": 1, "TestCase": "1", "Time": "16:45:27"}, {"Build": "831", "Date": "07-08-13", "ErrorDiff": "2", "Message": 2, "OutFile": "2", "Result": "2", "TCID": 2, "TestCase": "2", "Time": "16:45:27"}]]… 

,如果我添加以下(os.environ.get)的蟒蛇:

results = [] 
for i in range(1, $tcindex): 
    a = "TCID" 
    b = i 
    c = 'Message' 

    ** d = os.environ.get(str('$MESSAGE'+str(i))) ** 

    e = str(i) 

我得到如下:

[{"Build": "831", "Date": "07-08-13", "ErrorDiff": "1", "Message": null, "OutFile": "1", "Result": "1", "TCID": 1, "TestCase": "1", "Time": "16:45:27"}, {"Build": "831", "Date": "07-08-13", "ErrorDiff": "2", "Message": null, "OutFile": "2", "Result": "2", "TCID": 2, "TestCase": "2", "Time": "16:45:27"}]]... 

現在,而不是索引,我得到一個「null」值,這意味着我可能在正確的軌道上,但我仍然卡住,我覺得這裏的人會很快看到我的方式和錯誤讓我走上正軌。請記住,我不是最精明的python人,但我當然明白,但一點幫助總是一件好事。

問題:如何爲bash腳本內的嵌入式Python代碼安排一個變量擴展,其中問題變量具有索引,如上面的代碼。

+0

爲什麼不使用bash數組而不是附加數字的變量? – Barmar

+0

實際上,這並沒有幫助,因爲'i'是一個Python變量,而不是一個shell變量,並且循環發生在Python中,而不是shell。 – Barmar

回答

2

當調用os.environ.get時,不應包含$前綴,這是外殼變量語法的一部分。你應該寫os.environ.get('MESSAGE'+str(i)))

+0

謝謝!這就是我需要的...... –