本文是本人學習linux shell入門收集整理,不徹底原創。html
參考博文:linux
http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html正則表達式
本人學習環境Ubuntu12.04 server虛擬機。shell
shell種類express
目前流行的Shell有ash, bash, ksh, csh, zsh等,你能夠用下面的命令來查看你本身的Shell類型:編程
# echo $SHELLbash
$SHELL是一個環境變量,它記錄用戶所使用的Shell類型。你能夠用命令:less
# Shell-name編程語言
來轉換到別的Shell,這裏Shell-name是你想要嘗試使用的Shell的名稱,如ash等。這個命令爲用戶又啓動了一個Shell,這個Shell在最初登陸的那個Shell以後,稱爲下級的Shell或子Shell。性能
使用命令:
# exit
能夠退出這個子Shell。
使用不一樣的Shell的緣由在於它們各自都有本身的特色,下面作一個簡單的介紹:
1.ash
ash Shell是由Kenneth Almquist編寫的,是Linux中佔用系統資源最少的一個小Shell,它只包含24個內部命令,於是使用起來很不方便。
2.bash
bash是Linux系統默認使用的Shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的縮寫,內部命令一共有40個。Linux使用它做爲默認的Shell是由於它有如下的特點:
(1)可使用相似DOS下面的doskey的功能,用上下方向鍵查閱和快速輸入並修改命令。
(2)自動經過查找匹配的方式,給出以某字串開頭的命令。
(3)包含了自身的幫助功能,你只要在提示符下面鍵入help就能夠獲得相關的幫助。
3.ksh
ksh是Korn Shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該Shell最大的優勢是幾乎和商業發行版的ksh徹底相容,這樣就能夠在不用花錢購買商業版本的狀況下嘗試商業版本的性能了。
4.csh
csh是Linux比較大的內核,它由以William Joy爲表明的共計47位做者編成,共有52個內部命令。該Shell實際上是指向/bin/tcsh這樣的一個Shell,也就是說,csh其實就是tcsh。
5.zch
zch是Linux最大的Shell之一,由Paul Falstad完成,共有84個內部命令。若是隻是通常的用途,是沒有必要安裝這樣的Shell的。
Ubuntu 默認爲bash。
Hello world
一、新建文件
vi helloworld.sh
1 #!/bin/bash //開頭必備 2 3 #print hello world in the console window 4 5 a="hello world" //=號兩邊不能有空格 6 7 echo $a
二、賦予權限
chmod +x filename.sh
三、執行
./helloworld.sh
詳細學習
這部分,我參考的博文就很好,這裏引用過來,方便查看。
下面咱們來看一個更復雜的例子,結合這個例子,咱們來說述Shell Script的語法。 1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if [ $# -lt 3 ]; then
4 cat<<HELP
5 ren -- renames a number of files using sed regular expressions
6
7 USAGE: ren 'regexp' 'replacement' files
8 EXAMPLE: rename all *.HTM files in *.html:
9 ren 'HTM$' 'html' *.HTM
10
11 HELP
12 exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f "$file" ]; then
23 newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
24 if [ -f "$newfile" ]; then
25 echo "ERROR: $newfile exists already"
26 else
27 echo "renaming $file to $newfile"
28 mv "$file" "$newfile"
29 fi
30 fi
31 done
咱們從頭來看,前面兩行上一個例子中已經解釋過了,從第三行開始,有新的內容。if語句和其餘編程語言類似,都是流程控制語句。它的語法是: if …; then … elif …; then … else … fi 與其餘語言不一樣,Shell Script中if語句的條件部分要以分號來分隔。第三行中的[]表示條件測試,經常使用的條件測試有下面幾種: [ -f "$file" ] 判斷$file是不是一個文件 [ $a -lt 3 ] 判斷$a的值是否小於3,一樣-gt和-le分別表示大於或小於等於 [ -x "$file" ] 判斷$file是否存在且有可執行權限,一樣-r測試文件可讀性 [ -n "$a" ] 判斷變量$a是否有值,測試空串用-z [ "$a" = "$b" ] 判斷$a和$b的取值是否相等 [ cond1 -a cond2 ] 判斷cond1和cond2是否同時成立,-o表示cond1和cond2有一成立 要注意條件測試部分中的空格。在方括號的兩側都有空格,在-f、-lt、=等符號兩側一樣也有空格。若是沒有這些空格,Shell解釋腳本的時候就會出錯。 $#表示包括$0在內的命令行參數的個數。在Shell中,腳本名稱自己是$0,剩下的依次是$0、$一、$2…、${10}、${11},等等。$*表示整個參數列表,不包括$0,也就是說不包括文件名的參數列表。 如今咱們明白第三行的含義是若是腳本文件的參數少於三個,則執行if和fi語句之間 的內容。而後,從第四行到第十一行之間的內容在Shell Script編程中被稱爲Here文檔,Here文檔用於將多行文本傳遞給某一命令。Here文檔的格式是以<<開始,後跟一個字符串,在 Here文檔結束的時候,這個字符串一樣也要出現,表示文檔結束。在本例中,Here文檔被輸出給cat命令,也即將文檔內容打印在屏幕上,起到顯示幫助 信息的做用。 第十二行的exit是Linux的命令,表示退出當前進程。在Shell腳本中可使用全部的Linux命令,利用上面的cat和exit,從一方面來講,熟練使用Linux命令也能夠大大減小Shell腳本的長度。 十4、十五兩句是賦值語句,分別將第一和第二參數賦值給變量OLD和NEW。緊接下來的兩句是註釋,註釋下面的兩條shift的做用是將參數列表中的第一個和第二個參數刪除,後面的參數依次變爲新的第一和第二參數,注意參數列表本來也不包括$0。 而後,自二十一行到三十一行是一個循環語句。Shell Script中的循環有下面幾種格式: while [ cond1 ] && { || } [ cond2 ] …; do … done for var in …; do … done for (( cond1; cond2; cond3 )) do … done until [ cond1 ] && { || } [ cond2 ] …; do … done 在上面這些循環中,也可使用相似C語言中的break和continue語句中斷 當前的循環操做。第二十一行的循環是將參數列表中的參數一個一個地放入變量file中。而後進入循環,判斷file是否爲一個文件,若是是文件的話,則用 sed命令搜索和生成新的文件名。sed基本上能夠當作一個查找替換程序,從標準輸入,例如管道讀入文本,並將結果輸出到標準輸出,sed使用正則表達式 進行搜索。在第二十三行中,backtick(`)的做用是取出兩個backtick之間的命令輸出結果,在這裏,也就是將結果取出賦給變量 newfile。此後,判斷newfile是否已經存在,不然就把file改爲newfile。這樣咱們就明白這個腳本的做用了,Shell Script編寫的其餘腳本與此類似,只不過是語法和用法稍有不一樣而已。