2016-12-29 36 views
-1

我的下一段代碼:添加每個元素命名值在循環

echo -n "{ \"data\":" > test.json 
echo -n " [" >> test.json 

sqcur=0 
sqtotal=`ls /etc/squid?.conf | wc -l` 
tcp_ports=$(grep "port" /etc/squid?.conf |awk '{print $2}' |sed 's|.*[0-9]*\:||g'|sort|uniq|xargs) 

for squidconf in `ls /etc/squid?.conf`; do 
    let "sqcur+=1" > /dev/null 
    squidident=`echo $squidconf | sed 's/.*\///' | awk -F '.' '{print $1}'` 
    tcp_ports=$(grep "port" $squidconf |awk '{print $2}' |sed 's|.*[0-9]*\:||g'|sort|uniq|xargs) 
    if [ $sqcur -lt $sqtotal ]; then 
    echo -n " { \"{#SQPROC}\": \"/usr/local/squid/bin/squid\", \"{#SQPROC_IDENT}\": \"${squidident}\", \"{#SQPROC_ARGS}\": \"-D -C -F -f ${squidconf}\", \"{#SQPROC_PORT}\": \"${tcp_ports}\", \"{#SQPROC_CONF}\": \"${squidconf}\" }," >> test.json 
    else 
    echo -n " { \"{#SQPROC}\": \"/usr/local/squid/bin/squid\", \"{#SQPROC_IDENT}\": \"${squidident}\", \"{#SQPROC_ARGS}\": \"-D -C -F -f ${squidconf}\", \"{#SQPROC_PORT}\": \"${tcp_ports}\", \"{#SQPROC_CONF}\": \"${squidconf}\" }" >> test.json 
    fi 
done 

echo -n " ]" >> test.json 
echo "}" >> test.json 

它給出了JSON文件中的下一個內容:

{ 
     "data": [ 
      { 
       "{#SQPROC}": "/usr/local/squid/bin/squid", 
       "{#SQPROC_IDENT}": "squid1", 
       "{#SQPROC_ARGS}": "-D -C -F -f /etc/squid1.conf", 
       "{#SQPROC_PORT}": "1111 2222", 
       "{#SQPROC_CONF}": "/etc/squid1.conf" 
      }, 

但我想在多個值的情況下,端口獲得下一個結果:

{ 
     "data": [ 
      { 
       "{#SQPROC}": "/usr/local/squid/bin/squid", 
       "{#SQPROC_IDENT}": "squid1", 
       "{#SQPROC_ARGS}": "-D -C -F -f /etc/squid1.conf", 
       "{#SQPROC_PORT_1111}": "1111", 
       "{#SQPROC_PORT_2222}": "2222", 
       "{#SQPROC_CONF}": "/etc/squid1.conf" 
      }, 

請問您可以幫忙嗎?

+0

聽起來像一個程序員的工作。 – melpomene

回答

1

你可能尋找一個這樣的事情:

for port in $tcpports 
do 
    all_ports="${all_ports} \"{#SQPROC_PORT_$port}\": \"$port\"," 
done 

在這個循環結束時,您將有一個包含一些all_ports變量,如:

"{#SQPROC_PORT_1111}": "1111", "{#SQPROC_PORT_2222}": "2222", 

例如。

要在您已有的代碼中輕鬆集成,我會在您的for -loop中提出一些小改動。對於每次迭代建立一個變量json_content將擁有這個數據在該次迭代,並在迭代結束的JSON,只打印$json_content

echo -n "{ \"data\":" > test.json 
echo -n " [" >> test.json 

sqcur=0 
sqtotal=`ls /etc/squid?.conf | wc -l` 

for squidconf in `ls /etc/squid?.conf`; do 
    let "sqcur+=1" > /dev/null 
    squidident=`echo $squidconf | sed 's/.*\///' | awk -F '.' '{print $1}'` 
    tcp_ports=$(grep "port" $squidconf |awk '{print $2}' |sed 's|.*[0-9]*\:||g'|sort|uniq|xargs) 
    json_content="{ \"{#SQPROC}\": \"/usr/local/squid/bin/squid\", \"{#SQPROC_IDENT}\": \"${squidident}\", \"{#SQPROC_ARGS}\": \"-D -C -F -f ${squidconf}\"," 
    for port in $tcp_ports 
    do 
     json_content="$json_content \"{#SQPROC_PORT_$port}\": \"$port\"," 
    done 
    json_content="$json_content \"{#SQPROC_CONF}\": \"${squidconf}\" }" 
    if [ $sqcur -lt $sqtotal ]; then 
     json_content="${json_content}," 
    fi 
    echo -n " ${json_content}" >> test.json 
done 

echo -n " ]" >> test.json 
echo "}" >> test.json 

我無法驗證循環的其餘部分。我沒有魷魚!但是當你重新計算for循環中的tcp_ports時,我刪除了for循環之前的初始化

希望這會有所幫助,
祝你好運!