shell編程

一、簡介

Shell腳本語言是Linux/Unix系統上一種重要的腳本語言,在Linux/Unix領域應用極爲廣泛,利用Shell腳本語言可以簡潔地實現複雜的操作,而且Shell腳本程序往往可以在不同版本的Linux/Unix系統上通用。Shell腳本語言簡單、易學、易用,適合處理文件和目錄之類的對象,以簡單的方式快速完成某些複雜的事情通常是創建腳本的重要原則。

二、基本格式

Shell腳本的文件名後綴通常是.sh,當然你也可以使用其他後綴或者沒有後綴,.sh是爲了規範。

#!/bin/bash --或者寫成!/bin/sh,是shell腳本的固定開頭格式,其實你不寫也沒關係,只是不規範。

#第一個shell小程序 --shell中註釋使用#開頭

echo "This is current directory." --echo命令和java中的system.out.println()相似,打印輸出內容

/bin/pwd --查看當前目錄

echo --輸出空行

echo "This is files."

/bin/ls --查看當前目錄的文件列表

/bin/date +%F >> /test/shelldir/ex2.info --將當前時間以yyyy-MM-dd的形式輸出追加到/test/shelldir/ex2.info文件中,如果使用">"則不是追加而是覆蓋了

執行shell腳本方法:

1、可以通過命令"sh xxx.sh"來執行,通過這種方式執行的話腳本開頭就可以不寫"#!/bin/bash",因爲sh命令已經說明這是shell腳本;

2、通過全路徑或者相對路徑執行,全路徑比如:/usr/local/shell/test.sh,相對路徑(當前就在/usr/local/shell目錄下)比如:./test.sh。通過這種方式執行的話,腳本開頭需寫上"#!/bin/bash",以表明這是shell腳本,並且當前用戶需擁有該腳本的執行權限,否則會報Permission denied的錯誤。

三、shell的變量

變量是shell傳遞數據的一種方法,用來代表每個取值的符號名。shell有兩類變量:臨時變量和永久變量。

使用set命令可以查看系統內的所有變量,unset命令刪除指定的變量。

3.1 臨時變量

臨時變量是shell程序內部定義的,其使用範圍僅限於定義它的程序,對其它程序不可見。包括,用戶自定義變量、位置變量等。

3.1.1 自定義變量

用戶定義的變量由字母或下劃線開頭,有字母、數字或下劃線組成,並且區分大小寫,變量名長度沒有限制。一般習慣上變量用大寫字母表示,並且由英文字母開頭。變量的賦值使用"=",並且兩邊不能有空格,要緊挨着。在使用變量時,在變量名前加上前綴"$"。

可以將一個命令的執行結果賦值給變量,但需要使用命令替換符號"`",即在英文模式下按波浪鍵。

單引號和雙引號是有區別的,雙引號會把裏面的變量用變量值替換,而單引號就是純粹的字符串,會原封不動輸出。

#!/bin/sh

DATE=`/bin/date +%Y%m%d` --把獲取當前時間的命令的執行結果賦值給變量DATE

echo 'TODAY IS $DATE' --輸出字符串,輸出結果就是TODAY IS $DATE沒有一點變化

echo "TODAY IS $DATE" --輸出字符串,其中$DATE會被替換爲實際值

3.1.2 位置變量

比如ex1.sh腳本如下:

/bin/ls -l $1 --查看1號位置變量(也就是參數1)所指定的目錄下的文件

/bin/ls -l $2 --查看2號位置變量(也就是參數2)所指定的目錄下的文件

/bin/ls -l $3 --查看3號位置變量(也就是參數3)所指定的目錄下的文件

然後執行:sh ex1.sh /test1 /test2 /test3,輸出結果就是根目錄下的test1目錄、test2目錄、test3目錄這三個目錄下的文件列表。

在shell腳本中,位置變量最多10個,用$0-$9表示,其中$0表示的是執行的shell腳本文件名,其他的就是對應的輸入參數。

3.1.3 特殊變量

除了$(0-9)這些位置變量外,在shell腳本中還有一些特殊變量,如下:

$* --這個程序的所有參數

$# --這個程序的參數個數

$$ --這個程序的PID

$! --執行上一個後臺命令的PID

$? --執行上一個命令的返回值

3.1.4 鍵盤入錄

在shell腳本中可以通過read命令從鍵盤讀入數據,賦給變量,比如有個ex1.sh腳本:

#!/bin/sh

read f s t --使用read命令從鍵盤讀入三個變量,變量名可以隨便取

echo "the first is $f" --依次輸出三個變量

echo "the second is $s"

echo "the third is $t"

然後執行:sh -x ex1.sh,其中-x選項是讓腳本執行過程中輸出每行語句,可以當做調試shell腳本使用。執行結果就是輸出read f s t後一直等待着鍵盤輸入,輸入三個變量值,每個用空格隔開,再按回車,即可繼續執行腳本。

3.2 永久變量

永久變量是環境變量,其值不隨shell腳本的執行結束而消失,比如:

echo $PATH --和windows裏的環境變量path一樣,存放的是一些目錄,這些目錄下的命令可以在任何目錄直接調用

echo $LANG --$LANG變量存放的是系統的默認語言,比如我安裝的CentOS7的語言是zh_CN.UTF-8

四、shell的運算

使用expr命令對整數進行運算,不能計算非整數。

注意點:

1、expr的運算必須用空格間隔開。

2、乘法需使用\*來表示轉義字符。

3、運算時會先算乘除後算加減,如果需要優先運算則需要加命令替換符。

4、也可以對變量進行運算操作。

 

五、test測試命令

test命令用來檢查文件和比較值,一般配合控制語句使用,不應該單獨使用。用法如下:

  1)判斷表達式

  if test  (表達式爲真)

  if test !表達式爲假

  test 表達式1 –a 表達式2                  兩個表達式都爲真

  test 表達式1 –o 表達式2                 兩個表達式有一個爲真

  2)判斷字符串

  test –n 字符串                                   字符串的長度非零

  test –z 字符串                                    字符串的長度爲零

  test 字符串1=字符串2                    字符串相等

  test 字符串1!=字符串2               字符串不等

  3)判斷整數

  test 整數1 –eq 整數2                        整數相等

  test 整數1 –ge 整數2                        整數1大於等於整數2

  test 整數1 –gt 整數2                         整數1大於整數2

  test 整數1 –le 整數2                         整數1小於等於整數2

  test 整數1 –lt 整數2                          整數1小於整數2

  test 整數1 –ne 整數2                        整數1不等於整數2

  4)判斷文件

  test  File1 –ef  File2        兩個文件具有同樣的設備號和i結點號

  test  File1 –nt  File2        文件1比文件2 新

  test  File1 –ot  File2        文件1比文件2 舊

  test –b File        文件存在並且是塊設備文件

  test –c File        文件存在並且是字符設備文件

  test –d File        文件存在並且是目錄

  test –e File        文件存在

  test –f File         文件存在並且是正規文件

  test –g File        文件存在並且是設置了組ID

  test –G File        文件存在並且屬於有效組ID

  test –h File        文件存在並且是一個符號鏈接(同-L)

  test –k File        文件存在並且設置了sticky位

  test –b File        文件存在並且是塊設備文件

  test –L File        文件存在並且是一個符號鏈接(同-h)

  test –o File        文件存在並且屬於有效用戶ID

  test –p File        文件存在並且是一個命名管道

  test –r File        文件存在並且可讀

  test –s File        文件存在並且是一個套接字

  test –t FD        文件描述符是在一個終端打開的

  test –u File        文件存在並且設置了它的set-user-id位

  test –w File        文件存在並且可寫

  test –x File        文件存在並且可執行

在shell腳本中,test命令可以使用[]來替換,比如test -d File等價於[ -d File ],注意別忘了空格,即["空格" -d File "空格"]。

六、控制語句

6.1 if語句

#!/bin/sh

# if test -d $1 then ... else ... fi

if [ -d $1 ] --等價於if test -d $1

then

echo "this is a directory!" --如果條件成立,即$1存在並且是個目錄,就走這裏

else

echo "this is not a directory!" --else後面不用跟then

fi --if語句結束

6.2 elif語句

#!/bin/sh

# if test then ... elif test then ... else ... fi

if [ -d $1 ]

then

echo "is a directory!"

elif [ -f $1 ]

then

echo "is a file!"

else

echo "error!"

fi

6.3 邏輯與和邏輯或

shell中使用-a和-o表示邏輯與和邏輯或。

#!/bin/sh

# -a -o

if [ $1 -eq $2 -a $1 = 1 ]

then

echo "param1 == param2 and param1 = 1"

elif [ $1 -ne $2 -o $1 = 2 ]

then

echo "param1 != param2 or param1 = 2"

else

echo "others"

fi

6.4 for循環

#!/bin/sh

# for var in [params] do ... done

for var in 1 2 3 4 5 6 7 8 9 10 --這種循環沒多大用,要循環的列表是死的,不能寫成變量的形式,如果你要循環1-100,用這種方式要寫很長。

do

echo "number is $var"

done --for循環結束

6.5 select循環

select循環用的也不多。

#!/bin/sh

# select var in [params] do ... done

select var in "java" "c++" "php" "linux" "python" "ruby" "c#"

do

break

done

echo "you selected $var"

執行該腳本後會輸出java~c#這7個選項,然後等你選擇,比如你輸入1後就會輸出you selected java,如下圖所示:

 

6.6 case語句

#!/bin/sh

read op --等等輸入一個值,會賦值給op,然後繼續執行

case $op in

a) --如果輸入的是a,則執行它下面的語句

echo "you selected a";;

b)

echo "you selected b";;

c)

echo "you selected c";;

*) --如果以上的都不符合,則執行它下面的語句

echo "error"

esac --case語句結束

6.7 while循環

#!/bin/sh

#while test do ... done

num=1 --自定義變量

sum=0

while [ $num -le 100 ] --如果滿足條件$num<=100,則執行do和done之間的語句

do

sum=`expr $sum + $num` --把sum和num兩個變量求和再賦值給sum

num=`expr $num + 1` --num變量自增1

done --while循環結束

echo $sum --輸出sum變量的最終值,其實就是對1~100進行求和,輸出結果是5050

 

while循環還可以搭配continue和break使用,這也是很常見的:

#!/bin/sh

i=0

while [ $i -le 100 ]

do

i=`expr $i + 1`

if [ $i -eq 5 -o $i -eq 10 ] --如果i==5或者i==10則執行下面的continue,直接繼續下一個循環

then continue; --最後的分號加不加都可以

else

echo "this number is $i"

fi

 

if [ $i -eq 15 ] --如果i==15則執行下面的break,直接跳出循環,while循環結束

then break;

fi

done

綜上,上面的控制語句在shell編程中最常用的是if、elif、case、while。

 

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