Linux之Shell腳本編程(二)


????????在上一篇博文中,主要介紹了Shell腳本編程的背景,怎樣創(chuàng)建人生中第一個(gè)Shell腳本以及Shell變量等內(nèi)容。接下來(lái)將接著介紹介紹Shell編程,主要是圍繞著Shell運(yùn)算、流程控制語(yǔ)句、自定義函數(shù)以及腳本調(diào)試等方面展開(kāi)。

一、運(yùn)算符

例:
  num1=11
  num2=22
  sum=num1+num2
  echo $sum

格式 : expr m + n 或$((m+n)) 注意expr運(yùn)算符間要有空格
  expr命令:對(duì)整數(shù)型變量進(jìn)行算術(shù)運(yùn)算 (注意:運(yùn)算符前后必須要有空格)
  expr 3 + 5
  expr 3 – 5
  echo `expr 10 / 3`
  10/3的結(jié)果為3,因?yàn)槭侨≌?br>   expr 3 * 10 注意: \ 是轉(zhuǎn)義符

image.png

例:計(jì)算(2 +3 )×4 的值

1 .分步計(jì)算
   S=`expr 2 + 3`
   expr $S * 4

2.一步完成計(jì)算
  expr `expr 2 + 3` * 4
  S=`expr `expr 2 + 3` * 4`
  echo $S
  或
  echo $(((2 + 3) * 4))


image.png

$()與${}的區(qū)別
  $( )的用途和反引號(hào)``一樣,用來(lái)表示優(yōu)先執(zhí)行的命令
    eg:echo $(ls test.sh)
  就是取變量了eg:echo{PATH}
  $((運(yùn)算內(nèi)容)) 適用于數(shù)值運(yùn)算
    eg: echo $((3+1*4))

二、內(nèi)置test命令

內(nèi)置test命令常用操作符號(hào)[]表示,將表達(dá)式寫(xiě)在[]中,如下:
    [ expression ]
  或者:
    test expression
  注意:expression首尾都有個(gè)空格
    eg: [ ] ;echo $?
  測(cè)試范圍:整數(shù)、字符串、文件
  表達(dá)式的結(jié)果為真,則test的返回值為0,否則為非0。當(dāng)表達(dá)式的結(jié)果為真時(shí),則變量$?的值就為0,否則為非0

1.字符串測(cè)試:

???????test str1 == str2   ?測(cè)試字符串是否相等
  test str1 != str2   測(cè)試字符串是否不相等
  test str1    ??  測(cè)試字符串是否不為空,不為空,true,false
  test -n str1     ?測(cè)試字符串是否不為空
  test -z str1     ?測(cè)試字符串是否為空
    eg:
      name=linzhiling
      [ “$name” ] && echo ok
     ?。?命令連接符號(hào)
      && 邏輯與 條件滿(mǎn)足,才執(zhí)行后面的語(yǔ)句
      [ -z “$name” ] && echo invalid || echo ok
      || 邏輯或,條件不滿(mǎn)足,才執(zhí)行后面的語(yǔ)句
      test “$name” == ”yangmi” && echo ok || echo invalid


image.png
2.整數(shù)測(cè)試:

???????test int1 -eq int2 ??測(cè)試整數(shù)是否相等 equals
  test int1 -ge int2 ??測(cè)試int1是否>=int2
  test int1 -gt int2 ???測(cè)試int1是否>int2
  test int1 -le int2 ???測(cè)試int1是否<=int2
  test int1 -lt int2 ????測(cè)試int1是否<int2
  test int1 -ne int2 ??測(cè)試整數(shù)是否不相等
    eg:
      test 100 –gt 100
      test 100 –ge 100
  如下示例兩個(gè)變量值的大小比較:


image.png
3.文件測(cè)試:

???????test -d file ?????指定文件是否目錄
  test –e file ????文件是否存在 exists
  test -f file ??????指定文件是否常規(guī)文件
  test –L File ???文件存在并且是一個(gè)符號(hào)鏈接
  test -r file ??????指定文件是否可讀
  test -w file ?????指定文件是否可寫(xiě)
  test -x file ??????指定文件是否可執(zhí)行
    eg:
      test -d install.log
      test –r install.log
      test –f xx.log ; echo $?
      [ -L service.soft ] && echo “is a link”
      test -L /bin/sh ;echo $?
      [ -f /root ] && echo “yes” || echo “no”

4.多重條件測(cè)試:

???????條件1 –a 條件2 邏輯與 兩個(gè)都成立,則為真
  條件1 –o 條件2 邏輯或 只要有一個(gè)為真,則為真
 ?。?條件 邏輯非 取反
  eg:
    num=520
    [ -n “num”–a“num” –ge 520 ] && echo “marry you” || echo “go on”
    age=20
    pathname=outlog
    [ ! -d“$ pathname”] && echo usable || echo used

image.png

三、流程控制語(yǔ)句

1.if/else 命令

單分支if條件語(yǔ)句
???????if [ 條件判斷式 ]
    then
      程序
  fi
  或者
  if [ 條件判斷式 ] ; then
     程序
  fi
  eg:
  #!/bin/sh
  if [ -x /etc/rc.d/init.d/httpd ]
    then
        /etc/rc.d/init.d/httpd restart
  fi
單分支條件語(yǔ)句需要注意幾個(gè)點(diǎn):
  if語(yǔ)句使用fi結(jié)尾,和一般語(yǔ)言使用大括號(hào)結(jié)尾不同。
  [ 條件判斷式 ] 就是使用test命令判斷,所以中括號(hào)和條件判斷式之間必須有空格
  then后面跟符號(hào)條件之后執(zhí)行的程序,可以放在[]之后,用“;”分割,也可以換行寫(xiě)入,就不需要";"了。

image.png

多分支if條件語(yǔ)句
  if [ 條件判斷式1 ]
    then
    當(dāng)條件判斷式1成立時(shí),執(zhí)行程序1
  elif [ 條件判斷式2 ]
    then
    當(dāng)條件判斷式2成立時(shí),執(zhí)行程序2
  ...省略更多條件
  else
    當(dāng)所有條件都不成立時(shí),最后執(zhí)行此程序
  fi

示例:
  eg:
  #!/bin/bash
  read -p "please input your name:" NAME
  #echo $NAME
  if [ “$NAME” == root ]
    then
      echo "hello ${NAME}, welcome !"
  elif [ $NAME == tom ]
    then
      echo "hello ${NAME}, welcome !"
  else
      echo "SB, get out here !"
  fi


image.png
2.case in 命令

???????case命令是一個(gè)多分支的if/else命令,case變量的值用來(lái)匹配value1,value2,value3等等。匹配到后則執(zhí)行跟在后面的命令直到遇到雙分號(hào)為止(;;)case命令以esac作為終止符。


image.png
3.for 循環(huán)

???????for循環(huán)命令用來(lái)在一個(gè)列表?xiàng)l目中執(zhí)行有限次數(shù)的命令。比如,你可能會(huì)在一個(gè)姓名列表或文件列表中循環(huán)執(zhí)行同個(gè)命令。for命令后緊跟一個(gè)自定義變量、一個(gè)關(guān)鍵字in和一個(gè)字符串列表(可以是變量)。第一次執(zhí)行for循環(huán)時(shí),字符串列表中的第一個(gè)字符串會(huì)賦值給自定義變量,然后執(zhí)行循環(huán)命令,直到遇到done語(yǔ)句;第二次執(zhí)行for循環(huán)時(shí),會(huì)右推字符串列表中的第二個(gè)字符串給自定義變量,依次類(lèi)推,直到字符串列表遍歷完。
  第一種:
  for N in 1 2 3
    do
    echo $N
  done
  第二種:
  for ((i = 0; i <= 5; i++))
    do
    echo "welcome $i times"
  done

4.while 循環(huán)

???????while命令根據(jù)緊跟其后的命令(command)來(lái)判斷是否執(zhí)行while循環(huán),當(dāng)command執(zhí)行后的返回值(exit status)為0時(shí),則執(zhí)行while循環(huán)語(yǔ)句塊,直到遇到done語(yǔ)句,然后再返回到while命令,判斷command的返回值,當(dāng)?shù)么蚍祷刂禐榉?時(shí),則終止while循環(huán)。
  格式
  while expression
    do
    command
    …
  done
實(shí)例:求1-10各個(gè)數(shù)的平方?


image.png
5.函數(shù)

???????函數(shù)代表著一個(gè)或一組命令的集合,表示一個(gè)功能模塊,常用于模塊化編程。
  以下是關(guān)于函數(shù)的一些重要說(shuō)明:
    在shell中,函數(shù)必須先定義,再調(diào)用
    使用return value來(lái)獲取函數(shù)的返回值
    函數(shù)在當(dāng)前shell中執(zhí)行,可以使用腳本中的變量。
結(jié)構(gòu)
完整:
  function name() {
    statements
    [return value]
  }
建議:
  function name {
    statements
    [return value]
  }
函數(shù)調(diào)用
  調(diào)用 Shell 函數(shù)時(shí)可以給它傳遞參數(shù),也可以不傳遞。如果不傳遞參數(shù),直接給出函數(shù)名字即可:
    name
  如果傳遞參數(shù),那么多個(gè)參數(shù)之間以空格分隔:
    name param1 param2 param3
注意:
1)不管是哪種形式,函數(shù)名字后面都不需要帶括號(hào)。
2)和其它編程語(yǔ)言不同的是,Shell 函數(shù)在定義時(shí)不能指明參數(shù),但是在調(diào)用時(shí)卻可以傳遞參數(shù),并且給它傳遞什么參數(shù)它就接收什么參數(shù)。
3)Shell 也不限制定義和調(diào)用的順序,你可以將定義放在調(diào)用的前面,也可以反過(guò)來(lái),將定義放在調(diào)用的后面。

image.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容