我在bash
中有一个由字符串消息组成的数组。
我需要在python中将这些消息用作字典值。像这样:
**Array in Bash**
errorMessage+=("testing the message")
errorMessage+=("this is msg2")
**Function with Python code in Bash**
displayJsonOutput()
{
python - <<END
import json
dict1 = {}
dict1['ScriptName']="$scriptName";
dict1['CaseName']="$option"
dict4={}
dict4['LogFile']="$logFileName";
dict4['ReportFile']="$reportFileName";
for idx in "${!errorMessage[@]}":
dict4["Message $((idx + 1))"]="${errorMessage[$idx]}";
dict1["Details"]=dict4
print(json.dumps(dict1, indent=4))
END
}
Output shown:
"Details": {
"LogFile": "/home/output.log",
"Message 1": "testing the message",
"ReportFile": "/home/out.rpt"
},
当我尝试这个时,它只显示第一个消息值。不会通过errorMessage的循环。 我希望json输出值看起来如下所示errorMessage:
"Details": {
"LogFile": "/home/output.log",
"Message 1": "testing the message",
"Message 2": "this is msg2",
"ReportFile": "/home/out.rpt"
},
答案 0 :(得分:1)
导出bash数组以供任何其他语言使用的安全方法是NUL分隔的流。也就是说,对于不需要索引的常规数组:
printf '%s\0' "${errorMessage[@]}" >messageList
...然后在Python中......
errorMessages = open('messageList', 'r').read().split('\0')[:-1]
如果你做需要索引,那么它会改变一点:
for idx in "${!errorMessage[@]}"; do
printf '%s\0' "$idx" "${errorMessage[$idx]}"
done >messageDict
...在Python方面(构建为概念验证,而不是性能):
pieces = open('messageDict', 'r').read().split('\0')
result = {}
while len(pieces) >= 2:
k = pieces.pop(0); v = pieces.pop(0);
result[k] = v
如果用“as”作为一个Python字典,你的意思是“喜欢”一个Python字典,这就是一个关联数组的用途。您可以使用arrayName["key"]="value"
分配给其中一个;转换描述形式的列表可能如下所示:
declare -a errorMessage=( "Message1" "Message2" )
declare -A dict4=( )
for idx in "${!errorMessage[@]}"; do
dict4["Message $((idx + 1))"]="${errorMessage[$idx]}"
done