本文是本人學習linux shell入門收集整理,不完全原創。
參考博文:
http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html
本人學習環境Ubuntu12.04 server虛擬機。
shell種類
目前流行的Shell有ash, bash, ksh, csh, zsh等,你可以用下面的命令來查看你自己的Shell類型:
# echo $SHELL
$SHELL是一個環境變量,它記錄用戶所使用的Shell類型。你可以用命令:
# 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
1、新建文件
vi helloworld.sh
1 #!/bin/bash //開頭必備 2 3 #print hello world in the console window 4 5 a="hello world" //=號兩邊不能有空格 6 7 echo $a
2、賦予權限
chmod +x filename.sh
3、執行
./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、$1、$2…、${10}、${11},等等。$*表示整個參數列表,不包括$0,也就是說不包括文件名的參數列表。 現在我們明白第三行的含義是如果腳本文件的參數少於三個,則執行if和fi語句之間 的內容。然后,從第四行到第十一行之間的內容在Shell Script編程中被稱為Here文檔,Here文檔用於將多行文本傳遞給某一命令。Here文檔的格式是以<<開始,后跟一個字符串,在 Here文檔結束的時候,這個字符串同樣也要出現,表示文檔結束。在本例中,Here文檔被輸出給cat命令,也即將文檔內容打印在屏幕上,起到顯示幫助 信息的作用。 第十二行的exit是Linux的命令,表示退出當前進程。在Shell腳本中可以使用所有的Linux命令,利用上面的cat和exit,從一方面來說,熟練使用Linux命令也可以大大減少Shell腳本的長度。 十四、十五兩句是賦值語句,分別將第一和第二參數賦值給變量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編寫的其他腳本與此相似,只不過是語法和用法稍有不同而已。