Bash語言2013年以來的增長勢頭
Bash的誕生
Bash這個單詞的來源十分晦澀,它的名字是一系列縮寫:Bourne-Again SHell — 這是關於Bourne shell(sh)的一個雙關語(Bourne again / born again)。
Bash語言之父Stephen R. Bourne
Bash 是大多數Linux系統以及Mac OS X v10.4默認的shell,它能運行於大多數Unix風格的操作系統之上,甚至被移植到了Microsoft Windows上的Cygwin系統中,以實現windows的POSIX虛擬接口。此外,它也被DJGPP項目移植到了MS-DOS上。
Bash是Linux的敲門磚,如果不懂Bash那其他東西就不用學習了。Linux透過終端下達指令,都是通過Bash來執行。
Bash語法
用vi編輯器編輯一個hello文件如下:
這樣最簡單的一個 BASH 程序就編寫完了。這裡有幾個問題需要說明一下:
一,第一行的 #! 是什麼意思
二,第一行的 /bin/bash 又是什麼意思
三,第二行是注釋嗎
四,echo 語句
如何執行該程序呢?有兩種方法:一種是顯式制定 BASH 去執行:
$ bash hello 或$ sh hello(這裡 sh 是指向 bash 的一個鏈接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)
或者可以先將 hello 文件改為可以執行的文件,然後直接運行它,此時由於 hello 文件第一行的 "#! /bin/bash" 的作用,系統會自動用/bin/bash 程序去解釋執行 hello 文件的:
此處沒有直接 “$ hello”是因為當前目錄不是當前用戶可執行文件的默認目錄,而將當前目錄“.”設為默認目錄是一個不安全的設置。
需要注意的是,BASH 程序被執行後,實際上 Linux 系統是另外開設了一個進程來運行的。
Bash命令行參數
在使用wget的時候,我喜歡加上一個-c的參數,這樣可以讓wget啟用斷點續傳功能。這裡的-c就是一個命令行參數。
在寫c語言的時候,我們使用字符串數組存儲命令行參數,像我們所熟悉的argv[]。當然我們也需要命令行參數的個數,這存儲在名為argc的整型變量中。argc和argv是約定俗成的名稱,當然你可以使用自己的名稱作為main函數的形參。
在編寫Bash腳本的時候,也同樣可以使用命令行參數。在Bash函數中也可以使用參數,特殊的是,Bash中的函數是沒有參數列表的,例如function foo
這樣便完成了一個函數頭的定義,但是沒有任何的形參名稱,這是由於Bash中特殊的參數傳遞方法所致。
這裡需要說明的是,在Bash編程中命令行參數和函數的形參都采用統一的規則。
Bash的函數規則
在Bash中,所有變量在賦值是賦值號左側直接寫變量名。而在引用變量的值時,變量名的左側需要加上$符號。寫過PHP腳本可能對此深有印象,不過PHP是賦值和引用都要寫。
Bash的參數是按照位置傳遞的,而且自動給出變量名稱,例如$1就表示第一個參數,當然$2就是第二個參數,參數之間用空格區分。這樣你可以順序寫到$n(n表示一個正整數),有幾個參數都可以按照順序引用。
$0表示當前運行命令的名稱,這個其實是特殊的參數,但是往往很少用到。
如果你想得到參數的個數,它保存在一個特殊名稱的變量裡,叫做$#。
$*和$@表示所有的參數,具體區別和其他一些特殊參數請見這裡。
注: 後面我們會用到一個$?參數,這表示上一條獨立命令運行的結果。我們才c語言寫程序的時候,常常以return 0作為程序正常退出的標志,這個0就被返回給Bash,而$?可以引用到上一個程序運行的結果。還記得Bash函數的參數和命令行參數是相同的嗎?如果剛 剛執行完一個Bash函數,$?裡就保存著這個函數的運行結果,即return的值。
Bash學習資料(繁體版)http://linux.vbird.org/linux_basic/0320bash.php#bash
Bash相關資源下載:http://www.gnu.org/software/bash/
前10名編程語言走勢圖
20到50名語言排行
下面是第50到100的編程語言排名
(Visual) FoxPro, ABC, Agilent VEE, Algol, Alice, Apex, ATLAS, AutoLISP, bc, BlitzMax, C shell, CFML, CL (OS/400), Clarion, Clipper, Clojure, Dart, Dylan, Eiffel, Emacs Lisp, Fantom, Gambas, Go, Groovy, Heron, Icon, IDL, Informix-4GL, J, JavaFX Script, Lasso, LPC, MUMPS, Oberon, OCaml, Occam, OpenCL, Oz, Pike, PowerShell, REXX, S, sed, SPARK, thinBasic, VBScript, VHDL, WebDNA, xBase, XSLT