日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下的shell语言编程入门

發(fā)布時間:2024/4/18 linux 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下的shell语言编程入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通常情況下,我們從命令行輸入命令每輸入一次就能夠得到系統(tǒng)的一次響應(yīng)。一旦需要我們一個接著一個的輸入命令而最后才得到結(jié)果的時候,這樣的做法顯然就沒有效率。要達到這樣的目的,通常我們利用shell程序或者shell腳本來實現(xiàn)。

  一、簡介

  Shell編程有很多類似C語言和其他程序語言的特征,但是又沒有編程語言那樣復(fù)雜。Shell程序就是放在一個文件中的一系列Linux命令和實用程序,在執(zhí)行的時候,通過Linux一個接著一個地解釋和執(zhí)行每個命令。

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

  1、首先建立一個內(nèi)容如下的文件,名字為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、編輯完該文件之后它還不能執(zhí)行,我們需要給它設(shè)置可執(zhí)行權(quán)限。使用如下命令:

  chmod?+x?date

  通過以上過程之后,我們就可以像使用ls命令一樣執(zhí)行這個shell程序.

  [beichen@localhost?bin]$?date

  Mr.beichen,Today?is:

  January?13?Friday

  Whish?you?a?lucky?day?!

  為了在任何目錄里都可以執(zhí)行這個程序,可以將bin的這個目錄添加到路徑中去。

  [beichen@localhost?bin]$?PATH=$PATH:$HOME/bin

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

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

  [beichen@localhost?/]$?bash?date

  Mr.beichen,Today?is:

  January?13?Friday

  Whish?you?a?lucky?day?!

  盡管在前面我們使用chmod?+x?date將date設(shè)置為可執(zhí)行,其實不設(shè)置也沒有關(guān)系,但在Linux里執(zhí)行它,需要先告訴系統(tǒng)它是一個可執(zhí)行的腳本。

  [beichen@localhost?/]$?.date

  Mr.beichen,Today?is:

  January?13?Friday

  Whish?you?a?lucky?day?!

  即在date前面加上一個點”.”,并且用空格與后面的shell腳本的文件名隔開。當然,不推薦這樣做。

  
二、shell參數(shù)

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

  1、?位置參數(shù)

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

  2、?內(nèi)部參數(shù)

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

  $#?----傳遞給程序的總的參數(shù)數(shù)目

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

  $*?----傳遞給程序的所有參數(shù)組成的字符串。

  下面舉例進行說明:

  建立一個內(nèi)容為如下的程序P1:

  echo?“Program?name?is?$0”

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

  echo?“The?last?is?$?”

  echo?“The?parameters?are?$*”

  執(zhí)行后的結(jié)果如下:

  [beichen@localhost?bin]$?P1?this?is?a?test?program?//傳遞5個參數(shù)

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

  There?are?totally?5?parameters?passed?to?this?program?//參數(shù)的總數(shù)

  The?last?is?0?//程序執(zhí)行結(jié)果

  The?parameters?are?this?is?a?test?program?//返回有參數(shù)組成的字符串
 
  下面我們利用內(nèi)部變量和位置參數(shù)編寫一個名為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

 
 三、變量表達式

  在上面我們編寫的小程序中我們用到了一個關(guān)鍵字test,其實它是shell程序中的一個表達式?D?D比較(test)。通過和shell提供的if等條件語句(后面我們會介紹)相結(jié)合我們可以方便的完判斷。

  其用法如下:

  test?表達式

  表達式所代表的操作符有字符串操作符、數(shù)字操作符、邏輯操作符以及文件操作符。其中文件操作符是一種shell獨特的操作符,因為shell里的變量都是字符串,為了達到對文件進行操作的目的,于是才提供了這樣的一種操作符。

  1、?字符串比較

  作用:測試字符串是否相等、長度是否為零,字符串是否為NULL(注:bash區(qū)分零長度字符串和空字符串)

  常用的字符穿操作符有:

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

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

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

  2、?數(shù)字比較

  這里區(qū)別于其他編程語言,test語句不使用>?類似的符號來表達大小的比較,而是用整數(shù)式來表示這些。

  -eq?相等

  -ge?大于等于

  -le?小于等于

  -ne?不等于

  -gt?大于

  -lt?小于

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

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

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

  4、?文件操作

  文件測試表達式通常是為了測試文件的信息,一般由腳本來決定文件是否應(yīng)該備份、復(fù)制或刪除。由于test關(guān)于文件的操作符有很多,我們只列舉一些常用的。

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

  -f?對象存在且為文件返回值為“是”

  -L?對象存在且為符號連接返回值為“是”

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

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

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

  -x?對象存在且可執(zhí)行則返回值為“是”

  file1??Cnt(-ot)?file2?文件1比文件2新(舊)

  
四、循環(huán)結(jié)構(gòu)語句

  shell常見的循環(huán)語句有for循環(huán)、while循環(huán)、until循環(huán)

  for?循環(huán)

  語法:for?變量?in?列表

  do

  操作

  done

  注:變量是要在循環(huán)內(nèi)部用來指代當前所指代的列表中的那個對象的。

  列表是在for?循環(huán)的內(nèi)部要操作的對象,可以是字符串也可以是文件,如果是文件則為文件名。

  例:刪除垃圾箱中的所有.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

  執(zhí)行結(jié)果如下:

  [beichen@localhost?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循環(huán)

  語法:while?表達式

  do

  操作

  done

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

  until循環(huán)

  語法:until?表達式

  do

  操作

  done

  重復(fù)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”

  執(zhí)行結(jié)果如下:

  [beichen@localhost?bin]$until

  The?result?is?5050!

 
 五、條件語句

  Shell程序中的條件語句主要有if語句、case語句;

  If語句

  語法:if?表達式1?then

  操作

  elif?表達式2?then

  操作

  elif?表達式3?then

  操作

  …..

  else

  操作

  fi

  Linux里的if的結(jié)束標志是將if反過來寫成fi;而elif其實是else?if的縮寫

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

  語法:case?字符串?in

  值1|值2)

  操作::

  值3|值4)

  操作::

  值5|值6)

  操作::

  *}

  操作::

  esac

  case的作用就是當字符串與某個值相同是就執(zhí)行那個值后面的操作。如果同一個操作對于多個值,則使用”|”將各個值分開。在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

  執(zhí)行結(jié)果:

  [liangnian@localhost?bin]$?test

  You?are?liangnian

  Welcome!

  關(guān)于shell編程基礎(chǔ)的東西就介紹這么多,如果你想更進一步了解shell編程的知識,請查閱相關(guān)書籍。

?

注:本文來自http://blog.csdn.net/smarttony/archive/2008/01/22/2060094.aspx

總結(jié)

以上是生活随笔為你收集整理的Linux下的shell语言编程入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。