linux脚本编程(shell)浅介
linux腳本編程(shell)淺介
2006-01-10 11:45 27693人閱讀 評論(18) 收藏 舉報 腳本shelllinux編程bash語言
??linux腳本(shell)編程
?啊,昨天上網看到一篇講 linux/unix shell 的文章,想想自己最后寫這東西也是一年前的事了,想想都快忘光了。
?還是整理一下,做一次回顧,以后說不定還用得上;帖出來,方便第一次學習這東西的同道中人。
?如果發現有錯誤的地方,請指出,留一句即可,我會感激的。廢話少說了!!!
?linux 下最重要的腳本語言算是 bash 了,我也就寫點這個吧(我也只會這個:))。跟其他開發語言(如C)比,bash 是比較簡單的一種語言,主要用于寫一些腳本代碼,一些批處理或安裝程序。你可以看看在/etc/init.d/目錄下,那里就有很多用來控制各個服務的腳本文件。
?先看一個“hello world!”的例子:
?在某個目錄下新建一個文件,叫hello.sh,敲入以下代碼:
#!/bin/sh
echo "hello world!"
?好,就這些。保存,在命令提示符下進入保存“hello.sh”的目錄,這樣執行:
?
#sh hello.sh(回車)
?看到了吧?哈哈,不過你高興的不要太早了,只并不能說明什么,就象你在其他編程環境中做的“hello world.”一樣,離高手的距離還遠著呢。
?我們先看看bash腳本中變量的使用。
?修改上面的“hello world!”的例子,改成下面的樣子:
#!/bin/bash
# This is a very simple example
str="hello world!"
echo $str
?保存后按照上面的方法執行該腳本,你將看到和以前一樣的效果。我們看看每一句的意義:
?第一行,#! 是說明 hello.sh 這個文件的類型的,有點類似 Windows 系統下用文件后綴來表示不同文件類型的意思。Linux 系統根據 "#!" 及該字串后面的信息確定該文件的類型。在 BASH 中 第一行的 "#!" 及后面的 "/bin/bash" 就表明該文件是一個 BASH 程序,需要由 /bin 目錄下的 bash 程序來解釋執行。BASH 這個程序一般是存放在 /bin 目錄下。這一行的寫法是固定的。
?第二行的 "# This is a ..." 就是 BASH 程序的注釋,在 BASH 程序中從“#”號(沒有“!”號)開始到行尾的部分均被看作是程序的注釋,相當于C/C++語言中的“//”。
?第三行是為一個名稱為 str 的變量賦值。
?第四行的 echo 語句的功能是把 echo 后面的字符串或變量的內容輸出到標準輸出中去。需要注意的是 BASH 中的絕大多數語句結尾處都沒有分號。
?對于第三行,可能有人會問:在C/C++中,變量都屬于某個類型,在這變量 str 的類型是什么呢?在 BASH 中變量定義是不需要的,沒有 "int i" 這樣的定義過程。如果想用一個變量,只要他沒有在前面被定義過,就直接可以用,當然你使用該變量的第一條語句應該是對他賦初值了,如果你不賦初值也沒關系,只不過該變量是空( 注意:是 NULL,不是 0 )。
?關于變量的使用,要注意以下幾點:
?一,變量賦值時,“=”左右兩邊都不能有空格;
?二,BASH 中的語句結尾不需要分號(";");
?三,除了在變量賦值和在FOR循環語句頭中,BASH 中的變量使用必須在變量前加"$"符號。
?在比較詳細的 bash 文檔中,會規定使用變量要采用這樣的形式:${STR},如果你的腳本出了莫名其妙的錯誤,不妨看看是不是這個問題造成的。
?BASH 中的變量既然不需要定義,也就沒有類型一說,那是不是一個變量既可以存放整數,也可以存放字符串呢?對!
?一個變量即可以被定義為一個字符串,也可以被再定義為整數。如果對該變量進行整數運算,他就被解釋為整數;如果對他進行字符串操作,他就被看作為一個字符串。請看下面的例子:
#!/bin/bash
x=2006
let "x = $x + 1"
echo $x
x="a string."
echo $x
?執行一下看看?
?又出現了新的關鍵字:let。關于整數變量計算,有如下幾種:" + - * / % ",他們的意思和字面意思相同,在*和/之前必須冠以反斜線,已防被SHELL先行解釋。整數運算一般通過 let 和 expr 這兩個指令來實現,如對變量 x 加 1 可以寫作:let "x = $x + 1" 或者 x=`expr $x + 1`
?關于運行時參數,我們在執行腳本時有時很想傳個參數進去,如:#sh mysh.sh hdz(回車)好,很簡單,在 bash 中,使用這樣傳進來的變量時也要在前面加“$”符號。
$# 傳入腳本的命令行參數個數;
$* 所有命令行參數值,在各個參數值之間留有空格;
位置變元
$0 命令本身(shell文件名)
$1 第一個命令行參數;
$2 第二個命令行參數;
...
?好,編輯以下腳本:
#!/bin/sh
echo "number of vars:"$#
echo "values of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4
?保存文件名為 my.sh,執行時傳入參數:#sh my.sh a b c d e(回車),看到結果你就會更清楚各個變量的意思。如果訪問的參數在執行時沒有傳入,如有一條這樣的代碼:
?echo "value of var4:"$100
?而在執行時并沒有輸入100個參數,那取得的值為 NULL。
在 BASH 程序中如果一個變量被使用了,那么直到該程序的結尾,該變量都一直有效。為了使得某個變量存在于一個局部程序塊中,就引入了局部變量的概念。BASH 中,在變量首次被賦初值時加上 local 關鍵字就可以聲明一個局部變量,如下面這個例子:
#!/bin/bash
HELLO="var1"
echo $HELLO
function hello {
local HELLO="var2"
echo $HELLO
}
echo $HELLO
該程序的執行結果是:
var1
var2
var1
這個執行結果表明全局變量 $HELLO 的值在執行函數 hello 時并沒有被改變。也就是說局部變量 $HELLO 的影響只存在于函數那個程序塊中。
BASH 中的變量與 C 語言中變量的區別
??? 這里我們為原來不熟悉 BASH 編程,但是非常熟悉 C 語言的程序員總結一下在 BASH 環境中使用變量需要注意的問題。
??????? 1,BASH 中的變量在引用時都需要在變量前加上 "$" 符號( 第一次賦值及在For循環的頭部不用加 "$"符號 );
??????? 2,BASH 中沒有浮點運算,因此也就沒有浮點類型的變量可用;
??????? 3,BASH 中的整形變量的比較符號與 C 語言中完全不同,而且整形變量的算術運算也需要經過 let 或 expr 語句來處理;
?下面我們來看看變量之間的比較操作:
?在比較操作上,整數變量和字符串變量各不相同,詳見下表:
對應的操作?? 整數操作 字符串操作
相同????????? -eq???????? =
不同????????? -ne??????? !=
大于????????? -gt???????? >
小于????????? -lt???????? <
大于或等于??? -ge
小于或等于??? -le
為空????????????????????? -z
不為空??????????????????? -n
比如:
?比較整數 a 和 b 是否相等就寫做? if [ $a = $b ]
?判斷整數 a 是否大于整數 b 就寫做? if [ $a -gt $b ]
?比較字符串 a 和 b 是否相等就寫作:if [ $a = $b ]
?判斷字符串 a 是否為空就寫作: if [ -z $a ]
?判斷整數變量 a 是否大于 b 就寫作:if [ $a -gt $b ]
注意:在“[”和“]”符號的左右都留有空格。
?BASH 是 Linux 操作系統的 Shell,因此系統的文件必然是 BASH 需要操作的重要對象
運算符,下面說說對文件的操作:
含義( 滿足下面要求時返回 TRUE )
-e??文件已經存在
-f??文件是普通文件
-s??文件大小不為零
-d??文件是一個目錄
-r??文件對當前用戶可以讀取
-w??文件對當前用戶可以寫入
-x??文件對當前用戶可以執行
-g??文件的 GID 標志被設置
-u??文件的 UID 標志被設置
-O??文件是屬于當前用戶的
-G??文件的組 ID 和當前用戶相同
file1 -nt file2?文件 file1 比 file2 更新
file1 -ot file2?文件 file1 比 file2 更老
如 if [ -x /root ] 可以用于判斷 /root 目錄是否可以被當前用戶進入。
?上面有進行比較的 if 關鍵字,是的,bash 中有和 C 語言相似的流程控制語句,主要有:if、for、while、until、case 等語句。下面較詳細的介紹一下。
?if 語句用于判斷和分支,其語法規則和 C 語言的 if 非常相似。其幾種基本結構為:
if [ expression ]
then
#code block
fi
或者
if [ expression ]
then
#code block
else
#code block
fi
或者
if [ expression ]
then
#code block
else if [ expression ]
then
#code block
else
#code block
fi
或者
if [ expression ]
then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
?如果您為了簡潔,想把 then 和 if 放在一行,那就要這樣寫了:if [ expression ]; then。即在 then 前加一個“;”號(bash 里面每行的結束處沒有分號,那要把兩行的內容寫到一行,是不是要用“;”號隔開啊?哈哈,對!這樣說來,“if [ expression ]; then”只是把兩行內容寫到了一行,沒有什么新的東西。)。
for 循環結構與 C 語言中有所不同,在 BASH 中 for 循環的基本結構是:
for $var in [list]
do
#code block
done
其中 $var 是循環控制變量,[list] 是 var 需要遍歷的一個集合,do/done 對包含了循環體,相當于 C 語言中的一對大括號。另外如果do 和 for 被寫在同一行,必須在 do 前面加上 ";"。如: for $var in [list]; do 。下面是一個運用 for 進行循環的例子:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
# 如果列表被包含在一對雙引號中,則被認為是一個元素
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
exit 0
??? 注意上面的例子中,在 for 所在那行的變量 day 是沒有加 "$" 符號的,而在循環體內,echo 所在行變量 $day 是必須加上 "$" 符號的。另外如果寫成 for day 而沒有后面的 in [list] 部分,則 day 將取遍命令行的所有參數。如這個程序:
#!/bin/bash
for param
do
echo $param
done
exit 0
??? 上面這個程序將列出所有命令行參數。for 循環結構的循環體被包含在 do/done 對中,這也是后面的 while、until 循環所具有的特點。
while 循環的基本結構是:
while [ condition ]
do
#code block
done
這個結構請大家自己編寫一個例子來驗證。
until 循環的基本結構是:
until [ condition is TRUE ]
do
#code block
done
這個結構也請大家自己編寫一個例子來驗證。
case
BASH 中的 case 結構與 C 語言中的 switch 語句的功能比較類似,可以用于進行多項分支控制。其基本結構是:
case "$var" in
condition1 )
;;
condition2 )
;;
* )
default statments;;
esac
下面這個程序是運用 case 結構進行分支執行的例子:
#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[a-z] ) echo "Lowercase letter";;
[A-Z] ) echo "Uppercase letter";;
[0-9] ) echo "Digit";;
* ) echo "Punctuation, whitespace, or other";;
esac
exit 0
??? 上面例子中的第四行 "read Keypress" 一句中的 read 語句表示從鍵盤上讀取輸入。這個命令將在本講義的 BASH 的其他高級問題中講解。
break/continue
??? 熟悉 C 語言編程的都很熟悉 break 語句和 continue 語句。BASH 中同樣有這兩條語句,而且作用和用法也和 C 語言中相同,break 語句可以讓程序流程從當前循環體中完全跳出,而 continue 語句可以跳過當次循環的剩余部分并直接進入下一次循環。
?
關于bash在控制臺下的快捷鍵
ctrl+u 刪除光標以前的所有字符
ctrl+d 刪除光標以前的一個字符
ctrl+k 刪除光標以后的所有字符
ctrl+h 刪除光標以后的一個字符
ctrl+t 調換光標前兩個字符的次序
ctrl+a 移動光標到最前面
ctrl+e 移動光標到最后面
ctrl+p 上一個命令
ctrl+n 下一個命令
ctrl+s 鎖定輸入
ctrl+q 解除鎖定
ctrl+f 移動光標到后一個字符
ctrl+b 移動光標到前一個字符
ctrl+x 標記一個位置
ctrl+c 清除當前的輸入
總結
以上是生活随笔為你收集整理的linux脚本编程(shell)浅介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Decision Tree学习笔记(基础
- 下一篇: OpenCV中的Sobel算子