2016-08-24 71 views
0

我想讓我的工作更輕鬆一些。因此,在這裏我有一個腳本,它將從diff文件中收集IP。問題是awk的輸出不存儲/錯誤的語法是錯誤的。我使用bash。用於存儲命令輸出的變量的字符串Shell腳本

MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}") 
echo "Test=MGR${count_IP}" 

for ((count=1;count<=$Manager_Count;count++)) 
do 
    MasterFile=/etc/ansible/tmp/tmp_list 
    MgrFile=/etc/ansible/tmp/tmp_mgr$count 
    echo "$count-$MgrFile" 

    grep -r "Manager_$count" $MasterFile > "${MgrFile}" 
    echo "Copy List of IP and name Info to temp file" 

    echo "Get MGR$count IP" 
    MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}") 
    echo "MGR${count_IP}" 
done 

發行部分

echo "Get MGR$count IP" 
    MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}") 
    echo "MGR${count_IP}" 

登錄:

1-/etc/ansible/tmp/tmp_mgr1 
Copy List Info to temp file 
Get MGR1 IP 
./2.sh: line 47: MGR=172.16.16.11: command not found 
MGR 
2-/etc/ansible/tmp/tmp_mgr2 
Copy List Info to temp file 
Get MGR2 IP 
./2.sh: line 47: MGR=172.16.16.14: command not found 
MGR 
+2

殼是從中調用工具的環境。它不是操縱文字的工具。如果您希望幫助您做任何正確的嘗試,然後發佈[mcve],包括簡潔,可測試的示例輸入和預期輸出,以便我們可以爲您提供幫助。 –

+0

@EdMorton自從1970年以來,Ken Thompson,Steve Bourne,David Korn,Bill Joy,Brian Fox以及所有其他UNIX shell實現者都會非常沮喪地瞭解到,他們浪費了所有時間和精力處理字符串操作功能!不過,我想微軟收到了備忘錄。;-) –

+0

一點也不,字符串操作功能在處理文件和進程以及對工具進行排序調用的上下文中是非常有用和必要的,這些工具是shell的用途。如果我們不能'cmd'$ file「>」$ {file%.csv} .txt「等,我們會在哪裏?由於UNIX工具有很多種方法可以從給定的示例輸入中生成所需的輸出,因此爲每項工作學習正確的工具非常重要,而不是用螺絲刀敲擊指甲並用鑿子驅動螺絲。 –

回答

-2

這看起來像一個簡單的混淆:

  • 您的變量稱爲$count直到第一線問題部分
  • 後,它被稱爲$count_IP

所以

echo "Get MGR$count IP" 
eval "MGR$count=\$(awk -F '[=;]' '{print \$2;}' '$MgrFile')" 
echo "MGR${count}" 

應該工作

+0

雖然腳本的第一行有'$ count_IP',但肯定是某種混合。 –

+0

我可以說它的部分回聲「MGR $ {count}」不包含awk的輸出。 – samir

+0

問題Pat的描述如下。這裏帶回聲「Get MGR $ count IP」,我得到「Get MGR1 IP」。在第二行awk將返回我的IP,我試圖存儲在一個新的變量與計數變量。變量的名稱將像MGR1_IP.By第三行我期待MGR1_IP = 10.10.10.10 – samir

-1

沒有任何其他方向,外殼將只評估一次每個行/表達。然而,你正在做一些特別的事情:你正在爲一個不是常量的變量名賦值(即,它的名字包含一個必須在賦值發生之前展開的變量)。這意味着你必須告訴shell來評估表達式兩次;一次擴展變量名稱,第二次分配一個變量值。因此,您需要一個eval在您遇到問題的線路前。

eval MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}")

第一遍將例如產生

MGR47=172.16.16.11(或其他)

第二遍(這是什麼eval究竟是幹什麼)將實際執行該分配。

編輯:有許多其他方法的OP可以寫他的劇本,但我限制了我的答案東西便攜,簡單和無害中,將解決他的問題的任擇議定書的例子的情況下。一位評論者指出,不加區別地使用eval會導致意想不到的後果,比如天網的崛起,出現一羣蝗蟲,或者你的整個硬盤被刪除。如果您想進一步教育自己在這個問題上,請閱讀鏈接的SO問題:

Why should eval be avoided in Bash, and what should I use instead?

+0

@EdMorton ...它可能會像拿着雕刀一樣去除你所有的四肢:)谷歌搜索」eval是邪惡的「與」bash「沒有任何關係,但與但是,在這裏更貼心的SO答案:[爲什麼應該在Bash中避免eval,並且我應該使用什麼呢?](http://stackoverflow.com/questions/17529220/why-should-eval-be-avoided在應該我應該使用,而不是) –

+1

@EdMorton感謝您的鏈接,我沒有讀它。使用'eval'可能是一件壞事,但在OP的問題和我的回答中,'eval'的具體和有限的使用不太可能導致任何硬盤驅動器被刪除。埃德,我有更大的問題,但:我使用C Shell_。自1988年以來!即使**我相信沒有什麼好的可以來!祝你有美好的一天 :) –

相關問題