2010-07-10 38 views

回答

8

Bash是一個shell,它並不意味着它是一個完整的編程語言,就像Perl/Python一樣。它沒有像模塊或包等東西。但是,bash shell帶有編程功能,例如數組,流控制,例如if/else,循環(for,while)等,它們允許您執行簡單的腳本編寫。爲了使bash shell幾乎等同於Python/Perl的強大功能,您應該將它與像sed/awk等unix工具一起使用。通過這些組合,bash腳本編程可以同樣強大。

我不同意海報菲利普關於避免Bash,因爲有些東西比shell和* nix工具更好地完成比其他語言。

總之,你應該嘗試學習bash,以及Perl或Python。你的知識將在下次派上用場。

+0

我同意你應該學習Bash,因爲通常你必須閱讀並維護其中的百萬Bash腳本。但是我發現很難發現任何問題,比如Python編程,Bash編程就像靈活,快速和可擴展一樣。我的措辭有點強烈,我沒有說「從不寫或學習Bash」,但如果一個初學者想要推薦,我什麼也不能做,只能告訴他儘可能遠離Bash。 – Philipp 2010-07-10 13:03:32

0

實際上Bash比Perl靈活得多。除了(索引或關聯)數組之外,Bash沒有算法或數據結構,除了函數之外沒有任何方法來構建或模塊化您的源代碼。除此之外(並且與其不靈活性相矛盾),Bash非常複雜且不直觀,並且引入難以發現的錯誤非常容易。所以我的建議是:儘可能避免Bash,其他許多語言對於通常的編程任務來說都更好。 Perl很好,但如果你是初學者,它可能太複雜和分散注意力 - 總是有很多方法可以做某些事情,這取決於你選擇哪一個最好。我會推薦Python。

如果您想要/必須學習Bash,請準備好大量信息或示例代碼是天真的或明顯錯誤的(當給定的文件名包含空格時,很多腳本已經中斷!)。我對Bash編程的建議是關於Greg Wooledge's wiki的大量文檔,例如Bash guideBash FAQBash pitfalls

對於可能的downvoters:我只是談論Bash作爲腳本語言使用時,而不是作爲交互式shell使用時,在這種情況下沒有問題。我並不認爲Bash很糟糕,閱讀關於Bash的各種線索,或者閱讀衆所周知的Bash陷阱:Bash中的大多數問題都是由於無法正確使用數據結構以及依賴外部程序做基本的數據處理。我估計,Bash程序員面臨的所有問題中的95%根本不可能出現在具有明智語法和真實數據結構和算法的語言中。

+4

「無」是一個非常強的詞。也許當你畢業時,你會發現兩者在現實世界中經常使用。但你說得對,python已經在很大程度上取代了perl。而且「幾乎所有其他語言都好得多」是錯誤的,取決於你的任務。 – Stephen 2010-07-10 12:51:13

+1

我一整天都在寫Bash腳本,並且使用一種版本控制系統,用我不喜歡的兩種語言(C和Bash)編寫,但我認爲Bash是現存最差的編程語言之一。通常我從一個簡單的Bash腳本開始,認爲它比類似的Python腳本更容易編寫,但幾乎在所有情況下,這證明是錯誤的。 – Philipp 2010-07-10 12:57:34

+0

但你說得對,措辭太強,我編輯了一下。我仍然會說,如果選擇是學習Bash還是學習Perl,Perl是理智的選擇。 – Philipp 2010-07-10 13:00:06

1

基本上,如果我只想設置並執行程序或運行一系列「內置」命令(如sed,grep或awk),我會使用Bash。如果我不得不做任何計算,數據操作或循環,我會使用perl。我一直在做Bourne shell腳本和perl超過20年。如果我剛剛開始,我會使用Python而不是perl。

5

Perl和Bash由兩個不同的目標組成。 Perl是一種通用語言,而bash只是具有一些編程功能的操作系統的接口。

1

我是使用腳本語言的新手。我遇到了兩種腳本語言,稱爲Perl和Bash shell腳本。

很酷。兩者都是有用的技術,都可能被過度擴展爲維護和調試的噩夢。

我想知道使用Perl腳本可以做什麼樣的事情,但不能使用Bash shell腳本來完成?

兩者都是turing complete,這樣你就可以在任何事情。但這不是一個有用的答案:) 兩者都有其優點,bash(或ksh,csh)通常用於配置腳本或驅動程序腳本。查看你的/etc/init.d目錄,查看這種味道的腳本列表。一旦你超越了這些腳本,bash往往變得比它的價值更難。

Perl是一個功能更強大一些的庫,等等。它是最大的優勢(所以我被告知,我沒有做太多的perl編程),這是文本處理。這很方便(我認爲它最初設計爲)解析文本文件,這使得系統管理員的生活更輕鬆。

你會建議什麼? (你沒有問這個,但我假裝你沒有:))

如果你想學習一種腳本語言,請學習python。這將是一個更爲熟悉的語言,它很容易學習,而且功能非常強大。知道bash和python,我從來沒有覺得有必要學習perl - 但是敬畏於「程序」中出現的破壞性語法混亂。

你會沿途欣賞bash,可能會閱讀一兩個教程,拿起幾個書籤。你將主要通過在命令行中入侵東西來學習它,或者一起扔幾行.bashrc或其他東西。不要擔心「學習」它。隨着時間的推移,你會吸收它,然後當你意識到需要時偷看到角落。

+0

「衝擊到\」節目\「中的破壞性語法混亂。」對於未經訓練的眼睛來說,就是。 – fengshaun 2010-07-10 21:35:59

+0

@fengshaun:絕對!我敢肯定,如果我知道perl這將是詩意的:) – Stephen 2010-07-10 21:41:30

1

要回答最基本的級別,用perl,你可以訪問CPAN,這(據我所知,無論如何),你不能用bash做。 CPAN包含要做的事情,幾乎所有你想用編程語言做的事。對於perl來說,使用bash無法(很容易)執行的操作最常見的事情之一就是與數據庫進行交互。

0

如果這是與系統管理員相關的工作,則必須知道這兩者。非常基礎的是shell,因爲這是你在unix上用來執行命令的東西。 Perl很重要,因爲我發現它更容易用於字符串處理(儘管大部分可以在shell中執行),您可以使用它來自動執行日誌報告和檢查,但也可以將幾個命令快速鏈接到一起。沒有一個shell不能做,但是現在有越來越多的文件是以xml格式(例如),並且在perl中更容易處理,與基於web的接口相同。

您還會注意到很多的工具將有可用於perl的模塊,或者很大一部分可能用perl編寫(例如來自賽門鐵克的某些產品)。

關於python,這是一個非常好的語言,主要在linux平臺上使用率很高(很多redhat & ubuntu工具都是用python編寫的)。雖然unix平臺上的情況並非如此(solaris,hpux-python甚至沒有默認安裝在這些平臺上),但仍然更傾向於perl。可能很重要,關於你的主要焦點是什麼操作系統。

4

這裏是tl; dr版本:如果你發現自己寫的不止是一頁bash,停止並用真正的編程語言重寫它。我不在乎它的Perl,Python或Ruby。只是不要製造不可維護的500線殼毛球。

現在,除了現有的答案...

Perl有一個調試器。

很多人不使用Perl調試器,但我非常依賴它。對我來說,這是一個噩夢,想要弄清楚一個大的shell腳本在做什麼。我發現這個循環:「在代碼周圍撒上調試回聲,運行,查看調試輸出,意識到我需要知道其他東西,撒上更多回聲,重複」非常緩慢和令人沮喪。在調試器中運行代碼可以讓您根據需要檢查數據,並在您更好地理解所需內容時執行更多檢查。

Perl是跨平臺的。

一個bash腳本不會在沒有幫助的情況下在Windows上工作,但那不是我真正想說的。 Bash依賴於Unix系統提供的命令行程序的沙拉......也許。假設它們存在,這些並不總是一樣的。比如findgrep。它是GNU版本嗎? BSD版本?也許是舊的Sun/AIX /版本?它是否支持你投擲的旗幟?

但是,嘿,你只使用Fedora或Debian或其他什麼,誰在乎?最終,你的發行將會改變一些不相容的東西,或者你想要轉向一個不同的系統,突然間你會發現自己的一團糟。 「爲什麼服務器仍在運行Redhat 7?!」通常是因爲它有一些脆弱的shell腳本來做重要的事情。

其中帶給我們的是...

Perl可以聲明它的依賴關係。

如果一個Perl程序需要某個特定版本的Perl和某些模塊,它可以通過將其作爲Perl模塊分發的相對簡單的措施以機器可讀的方式聲明。 Bash沒有這樣的機制(你可以製作一個dpkg或rpm,這是它自己的地獄),所以你不知道你的bash腳本做了什麼樣的假設。

Perl很容易測試。

我確定它可以分解和測試一個bash程序,並且有人在那裏編寫漂亮的架構shell代碼。它像滑雪上坡,或跳舞的熊。它非常令人印象深刻,但不是很實用。所以沒有人會這樣做。儘管Perl附帶了一個測試框架,但即使單個文件程序也容易測試,並且鼓勵您將大型程序分解爲庫,這些技巧都很簡單。

+0

我不同意,但我投了因爲我不完全不同意...... :) – 2013-03-19 15:17:14

+0

@btoueg你不同意? – Schwern 2013-03-20 05:02:44

相關問題