30分鐘搞定BASH腳本編程

查看自己所只用的shell的命令

echo $0

 

查看shell 的路徑

echo $SHELL


這篇指南將通過一些例子來幫助大家學習功能強大的shell腳本編程.

 

一個最經典的HelloWorld程序
#!/bin/bash
echo "HelloWorld"

個腳本只有二行,它的第一行這個腳本程序由那個程序來解釋.第二行只有一個簡單的動作,它的功能是在終端上打印出一行”HelloWorld”。如果你測試着執行這個命令時(./hello.sh),你將會得到一個command not found的信息,這種情況大部分可能是你的第一行#!/bin/bash這個程序有問題,你一定要確保bash可以找到並且可用。(一般情況下你還要對這個腳本附一個可執行權限)
#chmod o+x hello.sh


一個非常簡單的備份腳本
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

在這個腳本中,它替換了上一個例子的將一行信息打印在終端上的功能,取爾代之的是一個備份/home目錄的tar備份命令。


關於重定向的一些信息
最基本的理論基礎
這裏有對於三個文件的重定向定義:stdin(標準輸入),stdout(標準輸出),stderr(標準錯誤輸出)(std=standard).
基本上你可以
1.重定向stdout到一個文件
2.重定向stderr到一個文件
3.重定向stdout到stderr
4.重定向stderr到stdout
5.重定向stderr到stdout中並且成爲一個文件
6.重定向stderr and stdout  to stdout
7.重定向stderr ands tdout  to stderr
在linux中1代表'標準輸出',2代表’標準錯誤’


標準輸出
這個例子將會使ls的顯示結果重定向到一個文件中.
ls -l>ls -l.txt

 

標準錯誤
這個例子將會使grep命令在運行過程中出現的錯誤輸出到一個文件中
grep da*2>grep -errors.txt

 

管道
這一節我們將解釋一個非常簡單的並且你以後一定會用到的功能,它就是管道。
爲什麼大家都會用到管道?
管道可以使你非常方便的將一個程序的結果轉向到另外一個程序中。
一個sed的例子
這個例子使用了非常簡單的管道功能:
ls-l|sed-e"s/[aeio]/u/g"

當我們執行以下命令後:首先ls–l會先執行並且它會輸出結果信息但是如果它的後面跟是一個管道符的話,那麼它就會將結果重新定向到sed這個程序中,sed使用了替換功能,所以這個例子執行完會,會將ls–l結果中所有含有aeio的英文單詞替換成單詞u.
通過另外的方法實現ls–l*.txt
也許這種方法不同於ls–l*.txt,但是它避免了出現一條NoSuchfileOrDirectory這種信息。
ls-l|grep".txt"

當ls–l執行後,它會將程序結果輸出到grep這個程序中,並且去匹配.txt這條信息。
變量
你可在任何編程語言中使用變量,但是在腳本編程中它們是沒有類型的,簡稱弱類型編程語言,在這個變量中可以保含一個數字,一個字符串,一個單詞等。你並不需要聲明這個變量,它會在引用這個變量時創建它。
使用變量來實現一個簡單的HelloWorld
#!/bin/bash
STR="HelloWorld!"
echo$STR

第二行建立一個STR的變量並且爲其附了一個“HelloWorld”的字符串變量值。當在這個變量前面加上一個$符號時,我們就將會得到這個變量的值。
例子(一個使用變量的備份腳本)
#!/bin/bash
OF=/var/my-backup-$(date Ymd).tgz
tar-cZf$OF/home/me/

局部變量
局部變量的生命是有限的,請看下面的例子
#!/bin/bash
HELLO=Hello
functionhello{
localHELLO=World
echo$HELLO
}
echo$HELLO
hello
echo$HELLO

條件語句
條件語句可以使你決定是完成一個運作或是不去完成一個動作時,通過一些判斷來實現,一般情況都是通過一些操作符來實現判斷。
條件語句可以有許多實現方法,最多的情況是基於ifexPRessionthen這種情況,也就是大家常常說的if判斷語句。它的語法基本結構如下:
if[expression];
then
codeif'expression'istrue.
fi
一個最基本的使用if...then的例子
#!/bin/bash
if["foo"="foo"];then
echoexpressionevaluatedastrue
fi

這段代碼執行if判斷,如果foo等於foo的話,那麼你就會執行then語句下的輸出語句,最後通過fi來結束,這裏我要強調一點,就是很多新手在輸入源碼時特別是在if語句後面沒有空格,在大括號後面沒有空格,在等號兩邊沒有空格,這些都會製造出一些麻煩的。
一個簡單的控制if..then...else
#!/bin/bash
if["foo"="foo"];then
echoexpressionevaluatedastrue
else
echoexpressionevaluatedasfalse
fi

6.4通過變量進行判斷控制
#!/bin/bash
T1="foo"
T2="bar"
if["$T1"="$T2"];then
echoexpressionevaluatedastrue
else
echoexpressionevaluatedasfalse
fi

7.循環結構
在這一節中,你將會學習for、while、untilloops循環
對於for循環它有一點不同於其他的編程語言,它有一點像VB中的foreach語句,就是所謂的遞歸的循環。
對於while循環,它其實是一個加強的if語句,如果它的條件爲真,那麼它就一直執行while循環中的語句中的內容。
7.1Forsample
#!/bin/bash
foriin$(ls);do
echoitem:$i
done

在第二行上,我們聲明瞭一個i的變量,它將一直將ls命令的結果全部循環出來。其中do和done之間是所要執行的代碼。
While循環例子
#!/bin/bash
COUNTER=0
while[$COUNTER-lt10];do
echoThecounteris$COUNTER
letCOUNTER=COUNTER 1
done
這裏面大家可能看到一個-lt的命令選項,這裏它代表小於等於
-eq等於
-ne不等於
-gt大於
-ge大於等於
-lt小於
-le小於等於
Until的例子
#!/bin/bash
COUNTER=20
until[$COUNTER-lt10];do
echoCOUNTER$COUNTER
letCOUNTER-=1
done

函數
對於大多數編程語言,你都可以調用函數來執行一段代碼,這樣可以使用減少重複的書寫代碼。
函數的例子
#!/bin/bash
functionquit{
exit
}
functionhello{
echoHello!
}
hello
quit
echofoo

在2-4行包含了一個quit函數,在5-7行包含了hello函數,如果你不是很確定這個腳本是是什麼意思,那麼我建議試試它。Noticethatafunctionsdon'tneedtobedeclaredinanyspecificorder.
當你運行這個腳本時你的程序將會最先調用hello函數,以後再調用quit函數最後才執行echo輸出命令。
在函數中使用參數
#!/bin/bash
functionquit{
exit
}
functione{
echo$1
}
eHello
eWorld
quit
echofoo


這個腳本幾乎和前一個腳本沒有什麼不能,但最主要的不同是e這個函數可以使用參數了。
用戶接口
使用select命令製作簡單的菜單
#!/bin/bash
OPTIONS="HelloQuit"
selectoptin$OPTIONS;do
if["$opt"="Quit"];then
echodone
exit
elif["$opt"="Hello"];then
echoHelloWorld
else
clear
echobadoption
fi
done

如果你運行這個腳本你將會看到一個非常簡單的菜單
使用read讀入用戶輸入
在多數情況下你可能會用到提示請進行輸入這種狀態並且有幾種方法可以用。這是其中的一種方法:
#!/bin/bash
echoPlease,enteryourname
readNAME
echo"Hi$NAME!"

對於變量來說,你可以通過多個值來讀入。
#!/bin/bash
echoPlease,enteryourfirstnameandlastname
readFNLN
echo"Hi!$LN,$FN!"

算術操作
使用以下的命令:
echo1 1
如果你希望看到2,那麼你會很失望,那麼我們應該如何進行操作哪?echo$((1 1))
我們可以使用以下方法:
echo$[1 1]

算術操作

-
*
/
(remainder)
關係操作
-lt(<)
-gt(>)
-le(<=)
-ge(>=)
-eq(==)
-ne(!=)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章