Linux常用命令筆記-Shell Script

Shell Script

顧名思義,Shell Script就是利用 shell所寫的一個腳本,簡單來說就是將許多shell指令集合起來,可以一次執行。相當於dos中的.bat批次文件。

Shell腳本是最常用的系統管理工具,一般用來結合程序完成工作。

--------------------------------Demo--------------------------------

#!/bin/bash

# Program:

# This programis used to show "Hello World !" in screen.

# History:

# 2005/08/23VBird First release

PATH=$PATH:~/jscai/bin;  export PATH

echo -e"Hello World ! \a \n"

exit 0

 

第一行,用#指定內核的解析器,避免誤用解析器,而浪費性能。一般爲 #!/bin/bash

第二行開始用來說明整個程序的狀態。一般來說:

1. 內容與功能; 2. 版本信息; 3. 作者與聯絡方式; 4. 建檔日期;5. 歷史紀錄 等等。

指明主要環境變量,如此一來,則可讓我們直接下達指令,而不必寫絕對路徑呢!

最後,我們通過 $? 這個變量來判斷程序是否執行成功,然後退出程序exit 0

 

參數

執行Shell腳本的命令行參數,一般由數字來命名,如$0, $1,$2等。由於歷史原因,超過9的要加大括號${10},${11}

 

sh

sh指令用於執行script,也可以直接用點.來執行,格式如下:

sh [-nvx]scripts.sh

參數:

-n :不要執行 script,僅查詢語法的問題;

-v :再執行 sccript 前,先將 scripts 的內容輸出到屏幕上;

-x :將使用到的 script內容顯示到屏幕上,有debug的效果

 

&&/||

&& 與,|| 或 符,不僅可以用在條件判斷中,也可以在平時的指令中用到。

         $ ls /jscai && ls -l jscai >list.txt    先看有沒有jscai文件夾,有則執行

       $ ls /jscai || mkdir                        同理||,先看有沒有jscai文件夾,沒有則創建

                  $ ls /jscai && echo"exist" || echo "not exist"   結合使用,有則exist,無則not

一個是前面true執行後面的,另一個是前面false執行後面的

 

test

         但是test不會輸出,而只是返回一個true/false,所以我們可以通過&&和||來輸出,檢測zip是否存在:

$ test -e zip &&echo 1||echo 2

 

文件類型----------------------------------

-e :該『檔名』是否存在?(常用)

-f :該『檔名』是否爲檔案(file)?(常用)

-d :該『文件名』是否爲目錄(directory)?(常用)

-b :該『文件名』是否爲一個block device 裝置?

-c :該『文件名』是否爲一個character device 裝置?

-S :該『檔名』是否爲一個Socket 檔案?

-p :該『檔名』是否爲一個FIFO (pipe) 檔案?

-L :該『檔名』是否爲一個連結檔?

 

文件權限----------------------------------

-r :偵測該文件名是否具有『可讀』的屬性?

-w :偵測該檔名是否具有『可寫』的屬性?

-x :偵測該檔名是否具有『可執行』的屬性?

-u :偵測該文件名是否具有『SUID』的屬性?

-g :偵測該文件名是否具有『SGID』的屬性?

-k :偵測該文件名是否具有『Stickybit』的屬性?

-s :偵測該檔名是否爲『非空白檔案』?

 

兩個文件的比較----------------------------------

-nt :(newer than)判斷 file1 是否比 file2 新

-ot :(older than)判斷 file1 是否比 file2 舊

-ef :判斷 file2 與 file2 是否爲同一檔案,可用在判斷hard link 的判定上。主要意義在判定,兩個檔案是否均指向同一個 inode 哩!

 

兩個數的比較----------------------------------

-eq :兩數值相等(equal)       等效 ==

-ne :兩數值不等 (notequal)    等效 !=

-gt :n1 大於 n2(greater than)

-lt :n1 小於 n2 (lessthan)

-ge :n1 大於等於 n2(greater than or equal)

-le :n1 小於等於 n2 (lessthan or equal)

 

5. 判定字符串的數據

test -z string

判定字符串是否爲 0 ?若 string 爲空字符串,則爲 true

test -n string    等效於   test string

判定字符串是否非爲 0 ?若 string 爲空字符串,則爲false。注: -n 亦可省略

test str1 = str2

判定 str1 是否等於 str2 ,若相等,則回傳 true

test str1 !=str2

判定 str1 是否不等於 str2 ,若相等,則回傳false

6. 多重條件判定,例如:test -r filename -a -x filename

-a

(and)兩狀況同時成立!例如test -r file -a -x file,則 file 同時具有 r 與 x 權限時,纔回傳 true。

-o

(or)兩狀況任何一個成立!例如test -r file -o -x file,則file 具有 r 或 x 權限時,就可回傳 true。

!

反相狀態,如 test ! -x file,當 file 不具有 x 時,回傳 true

 

我們還可以使用判斷符號[ ]來代替test,一般用在if then fi 中,判斷符號[]需要在裏面的兩邊都加空格。 所以上面test一開始的例子可以寫成:

$ [ -e zip]&& echo 1 || echo 2

        

同理有:[ $param1 == $param2], [ $param1 != $param2 ], [ $param1 -gt $param2 ], [ $param1 -lt $param2 ], [ $param1-ge $param2 ]

$ [ $param ] && echo 1 || echo 2  等效於test string  :$param已初始化,且非空白字符串

相當於java的:   if (parma != null && parma.trim() != "")

 

if…then

基本句式:

if [  ]; then

elif [  ]; then

else

fi

 

遇到複雜的條件,可以搭配&&和||來使用:

if [ -d worker ]&& [ $1 == “work” ]; then

         echo “Start to work!”

elif [ $1 == “stop” ];then

         echo “Stop working!”

else

         echo “No command ~”

if

 

case…esac

case使用於多個條件的情況,但是語法比較複雜,所以用得也不是很多。如下:

case $1 in

  "A")   #條件1

    echo "Bingo!"

    ;;   #條件結束符

  "B")   #條件2

    echo "Pass, pls try again."

    ;;

  *)     #條件else

    echo "Your cmd is wrong."

    ;;

esac     #結束符

 

function 函數

在script中定義函數,然後就可以直接使用,裏面也是同樣使用$1等作爲入參。

function printit(){

echo -n "Your choice is "

}

         printit ABC

 

for do done

這裏的for和一般程序語言的for類似,都是三個條件控制。

for  (( 初始值; 限制值; 執行步階 ))

do

程序段

done

 

如:

for (( i=0; i<=10; i=i+1 ))

do

    echo $i;

done

 

也可以寫成枚舉形式,一般遍歷文件也是用這種方式:forfile in `ls tmp_*`

for word in A B C

do

    echo $word;

done

 

for line in `cat for.sh`

do

   echo $line;

done

 

while do done

while 是『當....時』,所以,這種方式說的是『當 condition 條件成立時,就進行循環,直到 condition 的條件不成立才停止』的意思。

而until do done 則相反,當…時終止。

 

param="";

while [ "$param" !="true" ]

do

  echo "Looping";

  param=true;

done

 

逐行讀取文件,下面兩種方式是等效的。

while read line

do

    echo $line;

done< for.sh

 

cat for.sh | while read line

do

    echo $line;

done


參考《鳥哥的Linux私房菜》:http://download.csdn.net/detail/tiwerbao/6564193

發佈了44 篇原創文章 · 獲贊 11 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章