2010-08-27 48 views
6

我需要編寫一個腳本來做到以下幾點:優點bash腳本訴的Python腳本殼牌命令重實用程序

  1. 監控的排隊系統,它是由shell命令訪問。
  2. 使用內嵌文本編輯,cp/mv,命令行腳本和編譯後的C++程序的混合模板創建目錄。
  3. 檢查錯誤情況。
  4. 在錯誤條件下寫入文件。

注意:二維數組對於我的程序會略微有用,但是我目前正在使用幾個1D數組(由於Bash腳本數組的限制)。

這些任務似乎有點「殼重」,因爲它可以很容易地執行一堆shell命令,所以我認爲Bash腳本將是一種自然的方式。迄今爲止我的結果一直不錯,但在開始重構和完成我的代碼之前,我想知道將它移植到Python是否更好。我在很多地方都看過Python比bash更「優越」。我已經做了一些Python腳本編寫,據我所知,這是因爲它有更多的內置庫,並且支持面向對象的編程。然而,所有我一直在使用shell命令看到的腳本,比如這一個: http://magazine.redhat.com/2008/02/07/python-for-bash-scripters-a-well-kept-secret/

實施討厭的語法,就像定義命令作爲變量,就像這樣:

#You could add another bash command here 
#HOLDING_SPOT="""fake_command""" 

#Determines Home Directory Usage in Gigs 
HOMEDIR_USAGE = """ 
du -sh $HOME | cut -f1 
""" 

#Determines IP Address 
IPADDR = """ 
/sbin/ifconfig -a | awk '/(cast)/ { print $2 }' | cut -d':' -f2 | head -1 
""" 

...和需要包裝功能和其他樂趣。

我只是很傻或者看起來不那麼直觀?在涉及到shell腳本命令時,使用Python的速度優勢是否會超過Bash的簡單優勢?或者是bash的語法(沒有二維數組,括號/圓括號的複雜性)的理由跳到Python?

+2

好的,我的道歉。我回顧了我最後幾個問題,並接受了我認爲最好的答案。我也提高了其中的一些。稍微簡單一點吧。謝謝你的提示。 – 2010-08-27 16:30:43

回答

7

如果你找不到理由切換它可能是因爲沒有理由。

我開始切換python,因爲我的一些腳本需要一些模板化過程,在shell腳本以外更容易實現。

還有另外一個腳本需要配置文件解析或參數解析,這讓我學到了更多的python,最後是另一個處理trac(用python編碼)讓我切換到python的腳本。

但是,如果你可以在bash中快速且乾淨地勾勒你的腳本,而不需要其他工具,那就留在bash中,這是一個很好的工具。

+0

在我所僱用的地方,有一個用Python編寫的工具,幾乎完全由shell命令組成。對於Python來說,Python幾乎肯定是錯誤的選擇,但實際情況仍然是,您可以(經常)按照每種相應的語言完成最好的工作,然後在問題更適合不同的語言時切換語言。 – 2010-08-27 18:32:30

3

Bash在與系統的實際接口上很好,因爲它很容易運行外部程序以及處理流中的數據。 Python擅長使用較少的表面積,涉及更多的循環,邏輯,數據結構等等。課程的馬匹。

如果不知道問題的詳細信息,很難告訴您要使用哪一種,或者如何使用兩者。但從它的聲音來看,這是我完全用shell腳本完成的事情。不過,我會找到一種不用數組的方法。關鍵是不要在C++中思考,並開始在bash中思考。

+0

我真的不用C/C++。我只是說我可以將某些變量組合在一起。例如,對於許多名稱BC0,BC1 ...我創建了9個目錄(所以我創建了90個目錄)。我需要用這三個獨特的數字來代替這兩個數字。所以如果bash支持3D數組,我可以將所有的#s存儲在一個數組中。因此,這種減少將從(#名稱*#的唯一數字條目需要)減少到1.這是我目前的實現從54個陣列減少到1個。當然,你會看到這會有幫助嗎? – 2010-08-27 17:41:35

+0

至於你的抽象,我的程序有更多的表面區域(很多shell類型的操作和很少的循環/邏輯)。因此,看來Bash腳本可能是更好的答案。我嘗試做一個很好的工作,列出我的程序的詳細信息(大量的shell命令,其功能描述),而不需要提供精確的代碼清單。這方面的下一次具體建議? – 2010-08-27 17:42:32

+0

我想你已經描述過了,而且沒有細節。可悲的是,有些問題不能得出具體的答案,也沒有詳細說明。我對數組的評論可能比我的一般建議更適合我自己的風格偏好;我傾向於通過將它們轉換爲循環來處理像這樣的問題,這些循環只需要在循環體內一次跟蹤一件事情。當然,在你的情況下不可能。 – 2010-08-29 21:29:45

3

這實際上取決於你想要做什麼,但這裏有一些一般的區別。

shell,包括bash,希望將所有變量視爲字符串並通過簡單的文本替換來訪問變量值。有時候這很方便;有時候不是那麼多。

在shell腳本中,您傾向於通過管理各種實用程序來操作數據。有時候這很方便;有時候不是那麼多。

Python有非常好的字符串操作,所以如果你正在做大量的文本文件註冊,它可以更快(寫和運行)來做它在Python中,而不是找出你想要的sed或awk咒語。

這是另一回事 - 你將在shell腳本中使用的許多工具都有很多選項,它們基本上是它們自己的迷你語言,其中一些簡潔到了鈍化的地步。 Python可以比調用大量這些迷你語言的shell腳本更具可讀性,因爲它在語法上是一致的。

有些項目適合使用面向對象的方法,Python可以輕鬆支持,而bash ...並不是那麼多。 Python還支持一些功能強大的技術,這些技術對於某些項目來說非常方便,而bash ...你可以得到照片。

簡而言之,shell的腳本語言旨在將各種單一功能實用程序捆綁在一起,同時使用起來更方便,而Python則是一種強大的編程語言,您可以在其中構建完整的GUI或Web應用程序如果你喜歡。

我個人也發現Python的整體語法比shell腳本語言好得多;我的程序傾向於做我想要的東西而不需要太多的擺弄,當它們不這樣做時,通常是因爲邏輯錯誤,而不是將我想要的語言翻譯成語言的錯誤。對我而言,Python在這方面幾乎是獨一無二的,儘管我聽說Ruby程序員對他們最喜歡的語言有類似的看法。

如果您熟悉並喜歡shell腳本,Perl可能會更容易一步,因爲它最初意圖替換shell腳本(和sed/awk)。