2013年5月編程語言排行榜:UNIX下的Bash
原創(chuàng)【51CTO獨家特稿】2013年5月9日,Tiobe公司發(fā)布新一期編程語言排行榜。新一期榜單前10位沒有太多的變化,只是Objective-C與C++,Ruby與JavsScript在互相交換位置罷了。今天我們要關(guān)注的是排在TOP 20后半部的一門語言——Bash。
大家先請看本期TOP20榜單
從2013年4月的編程語言排行榜我們驚異的發(fā)現(xiàn)Bash這門UNIX下的殼語言,竟然有了飛速的上升。從第34位最高上升到第13位。究竟這門語言有什么獨特之處?
Bash語言2013年以來的增長勢頭
Bash的誕生
Bash這個單詞的來源十分晦澀,它的名字是一系列縮寫:Bourne-Again SHell — 這是關(guān)于Bourne shell(sh)的一個雙關(guān)語(Bourne again / born again)。
Bash語言之父Stephen R. Bourne
Bash是大多數(shù)Linux系統(tǒng)以及Mac OS X v10.4默認(rèn)的shell,它能運行于大多數(shù)Unix風(fēng)格的操作系統(tǒng)之上,甚至被移植到了Microsoft Windows上的Cygwin系統(tǒng)中,以實現(xiàn)windows的POSIX虛擬接口。此外,它也被DJGPP項目移植到了MS-DOS上。
Bash是Linux的敲門磚,如果不懂Bash那其他東西就不用學(xué)習(xí)了。Linux透過終端下達(dá)指令,都是通過Bash來執(zhí)行。
Bash語法
用vi編輯器編輯一個hello文件如下:
- #!/bin/bash
- # This is a very simple example
- echo Hello World
這樣最簡單的一個 BASH 程序就編寫完了。這里有幾個問題需要說明一下:
一,第一行的 #! 是什么意思
二,第一行的 /bin/bash 又是什么意思
三,第二行是注釋嗎
四,echo 語句
如何執(zhí)行該程序呢?有兩種方法:一種是顯式制定 BASH 去執(zhí)行:
$ bash hello 或$ sh hello(這里 sh 是指向 bash 的一個鏈接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)
或者可以先將 hello 文件改為可以執(zhí)行的文件,然后直接運行它,此時由于 hello 文件第一行的 "#! /bin/bash" 的作用,系統(tǒng)會自動用/bin/bash 程序去解釋執(zhí)行 hello 文件的:
- $ chmod u+x hello
- $ ./hello
此處沒有直接 “$ hello”是因為當(dāng)前目錄不是當(dāng)前用戶可執(zhí)行文件的默認(rèn)目錄,而將當(dāng)前目錄“.”設(shè)為默認(rèn)目錄是一個不安全的設(shè)置。
需要注意的是,BASH 程序被執(zhí)行后,實際上 Linux 系統(tǒng)是另外開設(shè)了一個進(jìn)程來運行的。
Bash命令行參數(shù)
在使用wget的時候,我喜歡加上一個-c的參數(shù),這樣可以讓wget啟用斷點續(xù)傳功能。這里的-c就是一個命令行參數(shù)。
在寫c語言的時候,我們使用字符串?dāng)?shù)組存儲命令行參數(shù),像我們所熟悉的argv[]。當(dāng)然我們也需要命令行參數(shù)的個數(shù),這存儲在名為argc的整型變量中。argc和argv是約定俗成的名稱,當(dāng)然你可以使用自己的名稱作為main函數(shù)的形參。
在編寫B(tài)ash腳本的時候,也同樣可以使用命令行參數(shù)。在Bash函數(shù)中也可以使用參數(shù),特殊的是,Bash中的函數(shù)是沒有參數(shù)列表的,例如function foo
這樣便完成了一個函數(shù)頭的定義,但是沒有任何的形參名稱,這是由于Bash中特殊的參數(shù)傳遞方法所致。
這里需要說明的是,在Bash編程中命令行參數(shù)和函數(shù)的形參都采用統(tǒng)一的規(guī)則。
Bash的函數(shù)規(guī)則
在Bash中,所有變量在賦值是賦值號左側(cè)直接寫變量名。而在引用變量的值時,變量名的左側(cè)需要加上$符號。寫過PHP腳本可能對此深有印象,不過PHP是賦值和引用都要寫。
Bash的參數(shù)是按照位置傳遞的,而且自動給出變量名稱,例如$1就表示第一個參數(shù),當(dāng)然$2就是第二個參數(shù),參數(shù)之間用空格區(qū)分。這樣你可以順序?qū)懙?n(n表示一個正整數(shù)),有幾個參數(shù)都可以按照順序引用。
$0表示當(dāng)前運行命令的名稱,這個其實是特殊的參數(shù),但是往往很少用到。
如果你想得到參數(shù)的個數(shù),它保存在一個特殊名稱的變量里,叫做$#。
$*和$@表示所有的參數(shù),具體區(qū)別和其他一些特殊參數(shù)請見這里。
注:后面我們會用到一個$?參數(shù),這表示上一條獨立命令運行的結(jié)果。我們才c語言寫程序的時候,常常以return 0作為程序正常退出的標(biāo)志,這個0就被返回給Bash,而$?可以引用到上一個程序運行的結(jié)果。還記得Bash函數(shù)的參數(shù)和命令行參數(shù)是相同的嗎?如果剛剛執(zhí)行完一個Bash函數(shù),$?里就保存著這個函數(shù)的運行結(jié)果,即return的值。
Bash學(xué)習(xí)資料(繁體版)http://linux.vbird.org/linux_basic/0320bash.php#bash
Bash相關(guān)資源下載:http://www.gnu.org/software/bash/
#p#
前10名編程語言走勢圖
20到50名語言排行
Position | Programming Language | Ratings |
---|---|---|
21 | MATLAB | 0.591% |
22 | SAS | 0.587% |
23 | Ada | 0.583% |
24 | R | 0.543% |
25 | ABAP | 0.501% |
26 | COBOL | 0.458% |
27 | Fortran | 0.419% |
28 | Scheme | 0.396% |
29 | Prolog | 0.326% |
30 | Haskell | 0.323% |
31 | Erlang | 0.315% |
32 | Common Lisp | 0.307% |
33 | Scratch | 0.303% |
34 | D | 0.301% |
35 | Scala | 0.300% |
36 | Logo | 0.282% |
37 | NXT-G | 0.243% |
38 | F# | 0.240% |
39 | Smalltalk | 0.237% |
40 | APL | 0.226% |
41 | Forth | 0.220% |
42 | ActionScript | 0.204% |
43 | ML | 0.204% |
44 | RPG (OS/400) | 0.178% |
45 | Awk | 0.162% |
46 | Tcl | 0.152% |
47 | PL/I | 0.149% |
48 | LabVIEW | 0.138% |
49 | Ladder Logic | 0.137% |
50 | JScript.NET | 0.136% |
下面是第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
【編輯推薦】