$ bash < ex1
可以讀入
ex1中的程序,並執行
其一般形式為:
$ bash 腳本名稱[參數]
例如:
$ bash ex2 /usr/meng /usr/zhang
其執行過程與上一種方式一樣,但這種方式的好處是能在腳本名稱後面帶有參數,從而將參數值傳遞給程式中的命令,使一個Shell 腳本可以處理多種情況,就如同函數呼叫時可依具體問題傳遞對應的實參。
如果以當前Shell (以
·表示)執行一個Shell 腳本,則可以使用如下簡便形式:
$ · ex3[參數]
將Shell 腳本的權限設為可執行,然後在提示下直接執行它。
具體辦法:
$ chmod a+x ex4$ ./ex4
這個要求在Shell 腳本的開頭指明執行該腳本的具體Shell,例如
/bin/bash:
#!/bin/bash
Shell 接收使用者輸入的命令(腳本名稱),並進行分析。如果檔案被標記為可執行,但不是被編譯過的程序,Shell 就認為它是一個Shell 腳本。 Shell 將讀取其中的內容,並加以解釋執行。所以,從使用者的觀點來看,執行Shell 腳本的方式與執行一般的可執行檔的方式相似。
因此,使用者開發的Shell 腳本可以駐留在命令搜尋路徑的目錄之下(通常是
/bin、
/usr/bin等),像普通指令一樣使用。這樣,也就開發出自己的新指令。如果打算重複使用編好的Shell 腳本,那麼採用這種方式就比較方便。
可以將一個指令的執行結果賦值給變數。有兩種形式的命令替換:一種是使用倒引號引用命令,其一般形式是:
命令表。
例如:將目前工作目錄的全路徑名稱存放到變數dir中,輸入以下命令列:
$ dir=`pwd`
另一種形式是:
$(命令表)。上面的命令列也可以改寫為:
$ dir=$(pwd)
Bash只提供一維數組,且沒有限定數組的大小。類似與C 語言,陣列元素的下標由0 開始編號。取得數組中的元素要利用下標。下標可以是整數或算術表達式,其值應大於或等於0 。使用者可以使用賦值語句對數組變數賦值。
對陣列元素賦值的一般形式是:
數組名[下標]=值,例如:
$ city[0]=Beijing$ city[1]=Shanghai$ city[2]=Tianjin
也可以用
declare命令明確宣告一個數組,一般形式是:
$ declare -a 數組名
讀取數組元素值的一般格式為:
${數組名[下標]},例如:
$ echo ${city[0]}Beijing
一個陣列的各個元素可以利用上述方式一個元素一個元素地賦值,也可以組合賦值。定義一個陣列並為其賦初值的一般形式是:
數組名=(值1 值2 ... 值n)
其中,各個值之間以空格分開。例如:
$ A=(this is an example of shell script)$ echo ${A[0]} ${A[2]} ${A[3]} ${A[6]}this an example script$ echo ${ A[8]}
由於值表中初值共有7 個,所以
A的元素個數也是7 。
A[8]超出了已賦值的數組
A的範圍,就認為它是一個新元素,由於預先沒有賦值,所以它的值是空串。
若沒有給出數組元素的下標,則數組名表示下標為0 的數組元素,如
city就等價於
city[0]。
使用
*或
@做下標,則會以數組中所有元素取代。
$ echo ${A[*]}this is an example of shell script
$ echo ${#A[*]}7
假如要寫一個Shell 來求兩個數的和,可以怎麼實現呢?為了介紹參數傳遞的用法,就寫這樣一個腳本:
$ cat > addlet sum=$1+$2echo $sum
儲存後,執行一下:
$ chmod a+x ./add$ ./add 5 1015
可以看出5 和10 分別傳給了
$1和
$2,這是Shell 自己預設的參數順序,其實也可以先定義好變量,然後再傳遞進去。
例如,修改上述腳本得到:
let sum=$X+$Yecho $sum
再次執行:
$ X=5 Y=10 ./add15
可以發現,同樣可以得到正確結果。
export一個環境變數:
$ export opid=True
這樣就可以,如果要登陸後都生效,可以直接加入到
/etc/profile或者
~/.bashrc裡頭。
可以透過
read來讀取變數值,例如,來等待使用者輸入一個值並且顯示出來:
$ read -p 請輸入一個值: input ; echo 你輸入了一個值為: $input請輸入一個值: 21500 你輸入了一個值為: 21500
有些重要的Shell 變量,賦值後不應該修改,那麼可設定它為
readonly:
$ oracle_home=/usr/oracle7/bin$ readonly oracle_home
文法:
test 表達式如果表達式為真,則傳回真,否則,傳回假。
先給出數值比較時常見的比較符:
-eg =;-ne !=;-gt >;-ge >=;-lt <;-le <=
$ test var1 -gt var2
文件的可讀、可寫入、可執行,是否為普通文件,是否為目錄分別對應:
-r; -w; -x; -f; -d
$ test -r filename
串的長度為零:
-z; 非零:-n,如:
$ test -z s1
如果串
s1長度為零,傳回真。
相等
s1=s2; 不相等s1!=s2
還有比較串的方法(可以用字典序來比較):
$ if [[ 'abcde' < 'abcdf' ]]; then echo yeah,果然是誒; fiyeah,果然是誒
可用此指令進行的運算有:
算術運算:
+ - * / %;邏輯運算:= ! < <= > >=
如:
$ i=5;expr $i+5
另外,
bc是一個命令列計算器,可以進行一些算術計算。
if命令舉例:如果第一個參數是一個普通文件名,那麼分頁打印該文件;否則,如果它為目錄名,則進入該目錄並打印該目錄下的所有文件,如果也不是目錄,那麼提示相關信息。
if test -f $1then pr $1>/dev/lp0elif test-d $1then (cd $1;pr *>/dev/lp0)else echo $1 is neither a file nor a directoryfi
case命令是一個基於模式匹配的多路分支命令,下面將根據使用者鍵盤輸入情況決定下一步將執行那一組命令。
while [ $reply!=y ] && [ $reply!=Y ] #下面將學習的循環語句do echo nAre you want to continue?(Y/N)c read reply #讀取鍵盤case $replay in ( y|Y) break;; #退出循環(n|N) echo nnTerminatingn exit 0;; *) echo nnPlease answer y or n continue; #直接返回內層循環開始出繼續esacdone
文法:
while/until 指令表1do 指令表2done
差異是,前者執行指令表1 後,如果退出狀態為零,則執行
do後面的指令表2,然後回到起始處,而後者執行指令表1 後,如果退出狀態非零,才執行類似操作。例子同上。
文法:
for 變數名in 字串表do 指令表done
舉例:
FILE=test1.c myfile1.f pccn.hfor i in $FILEdo cd ./tmp cp $i $i.old echo $i copieddone
現在來看看Shell 裡頭的函數用法,先看個例子:寫一個函數,然後呼叫它顯示
Hello, World!
$ cat > show# 函數定義function show{ echo $1$2;}H=Hello,W=World!# 呼叫函數,並傳給兩個參數H和Wshow $H $W
演示:
$ chmod 770 show$./showHello,World!
看什麼蹊蹺了嗎?
$ show $H $W
咱們可以直接在函數名後面跟實參。
實參順序對應「虛參」的
$1,$2,$3……
注意:如果要傳入一個參數,如果這個參數中間有空格,怎麼辦? 先試試看。
來顯示
Hello World(兩個字之間有個空格)
function show{ echo $1}HW=Hello Worldshow $HW
如果直接
show $HW,肯定不行,因為
$1只接受了
Hello,所以結果只顯示
Hello,原因是字串變數必須用包含起來。
有興趣的話繼續學習吧!
還有好多強大的東西等著呢,例如
cut,
expr,
sed,
awk等等。