Linux下的shell編程入門

來源:互聯網
上載者:User

標籤:使用   os   io   檔案   for   ar   代碼   linux   

通常情況下,我們從命令列輸入命令每輸入一次就能夠得到系統的一次響應。一旦需要我們一個接著一個的輸入命令而最後才得到結果的時候,這樣的做法顯然就沒有效率。要達到這樣的目的,通常我們利用shell程式或者shell指令碼來實現。

  一、簡介

  Shell編程有很多類似C語言和其他程式語言的特徵,但是又沒有程式設計語言那樣複雜。Shell程式就是放在一個檔案中的一系列Linux命令和公用程式,在執行的時候,通過Linux一個接著一個地解釋和執行每個命令。

  下面我們來看一個簡單的shell程式:

  1、首先建立一個內容如下的檔案,名字為date,將其存放在目錄下的bin子目錄中。

  #Program date

  #usageto ::show the date in this way (注釋)

  echo “Mr.$USER,Today is:”

  echo date “+%B%d%A”

  echo “Whish you a lucky day !”

  2、編輯完該檔案之後它還不能執行,我們需要給它設定可執行許可權。使用如下命令:

  chmod +x date

  通過以上過程之後,我們就可以像使用ls命令一樣執行這個shell程式.

  [[email protected] bin]$ date

  Mr.beichen,Today is:

  January 13 Friday

  Whish you a lucky day !

  為了在任何目錄裡都可以執行這個程式,可以將bin的這個目錄添加到路徑中去。

  [[email protected] bin]$ PATH=$PATH:$HOME/bin

  (註:這裡的$HOME代替的是/home/beichen,而bin目錄是自己建的一個目錄)

  另外一種執行date的方法就是把它作為一個參數傳給shell命令:

  [[email protected] /]$ bash date

  Mr.beichen,Today is:

  January 13 Friday

  Whish you a lucky day !

  儘管在前面我們使用chmod +x date將date設定為可執行,其實不設定也沒有關係,但在Linux裡執行它,需要先告訴系統它是一個可執行檔指令碼。

  [[email protected] /]$ .date

  Mr.beichen,Today is:

  January 13 Friday

  Whish you a lucky day !

  即在date前面加上一個點”.”,並且用空格與後面的shell指令碼的檔案名稱隔開。當然,不推薦這樣做。

  二、shell參數

  如同ls 命令可以接受目錄等作為它的參數一樣,在shell編程時同樣可以使用參數。Shell有位置參數和內部參數。

  1、 位置參數

  由系統提供的參數稱為位置參數。位置參數的值可以用$N得到,N是一個數字,如果為1,即$1.類似C語言中的數組,Linux會把輸入的命令字串分段並給每段進行標號,標號從0開始。第0號為程式名字,從1開始就表示傳遞給程式的參數。如$0表示程式的名字,$1表示傳遞給程式的第一個參數,以此類推。

  2、 內部參數

  上述過程中的$0是一個內部變數,它是必須的,而$1則可有可無。和$0一樣的內部變數還有以下幾個。

  $# ----傳遞給程式的總的參數數目

  $? ----上一個代碼或者shell程式在shell中退出的情況,如果正常退出則返回0,反之為非0值。

  $* ----傳遞給程式的所有參數組成的字串。

  下面舉例進行說明:

  建立一個內容為如下的程式P1:

  echo “Program name is $0”

  echo “There are totally $# parameters passed to this program”

  echo “The last is $?”

  echo “The parameters are $*”

  執行後的結果如下:

  [[email protected] bin]$ P1 this is a test program //傳遞5個參數

  Program name is /home/beichen/bin/P1 //給出程式的完整路徑和名字

  There are totally 5 parameters passed to this program //參數的總數

  The last is 0 //程式執行結果

  The parameters are this is a test program //返回有參數組成的字串
下面我們利用內部變數和位置參數編寫一個名為del的簡單刪除程式:

  #name: del

  #author: liangnian

  #this program to compress a file to the dustbin

  if test $# -eq 0

  then

  echo “Please specify a file!”

  else

  gzip $1 //先對檔案進行壓縮

  mv $1.gz $HOME/dustbin //移動到資源回收筒

  echo “File $1 is deleted !”

  fi

  三、Variant 運算式

  在上面我們編寫的小程式中我們用到了一個關鍵字test,其實它是shell程式中的一個運算式?D?D比較(test)。通過和shell提供的if等條件陳述式(後面我們會介紹)相結合我們可以方便的完判斷。

  其用法如下:

  test 運算式

  運算式所代表的操作符有字串操作符、數字操作符、邏輯操作符以及檔案操作符。其中檔案操作符是一種shell獨特的操作符,因為shell裡的變數都是字串,為了達到對檔案進行操作的目的,於是才提供了這樣的一種操作符。

  1、 字串比較

  作用:測試字串是否相等、長度是否為零,字串是否為NULL(註:bash區分零長度字串和Null 字元串)

  常用的字元穿操作符有:

  = 比較兩個字串是否相同,同則為“是”!= 比較兩個字串是否相同,不同則為“是”

  -n 比較字串長度是否大於零,如果大於零則為“是”

  -z 比較字串的穿度是否等於零,如果等於則為“是”

  2、 數字比較

  這裡區別於其他程式設計語言,test語句不使用>?類似的符號來表達大小的比較,而是用整數式來表示這些。

  -eq 相等

  -ge 大於等於

  -le 小於等於

  -ne 不等於

  -gt 大於

  -lt 小於

  3、 邏輯操作! 反:與一個邏輯值相反的邏輯值

  -a 與(and):兩個邏輯值為“是”傳回值才為“是”,反之為“否”

  -o 或(or):兩個邏輯值有一個為“是”,傳回值就為“是”

  4、 檔案操作

  檔案測試運算式通常是為了測試檔案的資訊,一般由指令碼來決定檔案是否應該備份、複製或刪除。由於test關於檔案的操作符有很多,我們只列舉一些常用的。

  -d 對象存在且為目錄傳回值為“是”

  -f 對象存在且為檔案傳回值為“是”

  -L 對象存在且為符號串連傳回值為“是”

  -r 對象存在且可讀則傳回值為“是”

  -s 對象存在且長度非零則傳回值為“是”

  -w 對象存在且可寫則傳回值為“是”

  -x 對象存在且可執行則傳回值為“是”

  file1 ?Cnt(-ot) file2 檔案1比檔案2新(舊)

  四、迴圈結構語句

  shell常見的迴圈語句有for迴圈、while迴圈、until迴圈

  for 迴圈

  文法:for 變數 in 列表

  do

  操作

  done

  註:變數是要在迴圈內部用來指代當前所指代的列表中的那個對象的。

  列表是在for 迴圈的內部要操作的對象,可以是字串也可以是檔案,如果是檔案則為檔案名稱。

  例:刪除垃圾箱中的所有.gz檔案

  #delete all file with extension of “gz” in the dustbin

  for I in $HOME/dustbin/*.gz

  do

  rm ?Cf $i

  echo “$i has been deleted!”

  done

  執行結果如下:

  [[email protected] bin]$.f_rmgz

  /home/beichen/dustbin/nessus-4.0.0.2.tar.gz has been deleted!

  /home/beichen/dustbin/gftp-2.2.1.tar.gz has been deleted!

While迴圈

 

  文法:while 運算式

  do

  操作

  done

  只要while運算式成立,do和done之間的操作就一直會進行。

  until迴圈

  文法:until 運算式

  do

  操作

  done

  重複do和done之間的操作直到運算式成立為止。

  例:

  #test until

  #add from 1 to 100

  total=0

  num=0

  until test num ?Ceq 100

  do

  total=`expr $total + $num` //注意,這裡的引號是反引號,下同

  num=`expr $num+1`

  done

  echo “The result is $total”

  執行結果如下:

  [[email protected] bin]$until

  The result is 5050!

  五、條件陳述式

  Shell程式中的條件陳述式主要有if語句、case語句;

  If語句

  文法:if 運算式1 then

  操作

  elif 運算式2 then

  操作

  elif 運算式3 then

  操作

  …..

  else

  操作

  fi

  Linux裡的if的結束標誌是將if反過來寫成fi;而elif其實是else if的縮寫

  其中elif理論上可以有無限多個。
Case語句

  文法:case 字串 in

  值1|值2)

  操作::

  值3|值4)

  操作::

  值5|值6)

  操作::

  *}

  操作::

  esac

  case的作用就是當字串與某個值相同是就執行那個值後面的操作。如果同一個操作對於多個值,則使用”|”將各個值分開。在case的每一個操作的最後面都有兩個”::”,分號是必須的。

  例:

  case $USER in

  beichen)

  Echo “You are beichen!”;;

  liangnian)

  echo “You are liangnian”; //注意這裡只有一個分號

  echo “Welcome!”;; //這裡才是兩個分號

  root)

  echo “You are root!:echo Welcome!”;; //將兩命令寫在一行,用一個分號作為分隔字元

  *)

  echo “Who are you?$USER?”;;

  esac

  執行結果:

  [[email protected] bin]$ test

  You are liangnian

  Welcome!

  關於shell編程基礎的東西就介紹這麼多,如果你想更進一步瞭解shell編程的知識,請查閱相關書籍

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.