腳本進階筆記整理

一、邏輯運算

變量:

  本地變量、環境變量、局部變量、位置參數變量、特殊變量

  變量賦值:name=value,export name=value,declare -x name=value

  變量引用:$name,${name}

  注意:有些時候{}不能省略,例如

       echo “$valuemagedu.com” 

       echo “${value}magedu.com”

   撤銷:unset name

bash腳本編程,運行腳本

#!/bin/bash      #稱為shebang是bash腳本的默認開頭行固定格式

#             #   #號后面是注釋信息,不顯示也不影響腳本執行結果

空白行          忽略不顯示行

bash的配置文件

porfile類:登錄式shell

bashrc類:非登錄式shell

登錄式shell:/etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc

非登錄式shell:~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh

    

算數運算

   +,-,*,/,**(乘次方),%(求模取余)

在bash中默認數據類型都是字符串形式,做算數運行需要經特殊方法才可以

示例:     

[root@localhost ~]# num1=2
[root@localhost ~]# num2=9
[root@localhost ~]# echo "${num1}+${num2}"
2+9
[root@localhost ~]# declare -i num3=5
[root@localhost ~]# declare -i num4=9
[root@localhost ~]# echo "${num3}+${num4}"
5+9

算術運算格式:

(1)let VAR=算數運算表達式

[root@localhost ~]# let ${num1}+${num2}

#默認不輸出結果到屏幕,所以需要賦值給變量,再引用

[root@localhost ~]# let sum5=${num1}+${num2}
[root@localhost ~]# echo ${sum5}
11

let 參數 [參數 …]

   算術運算格式含義

    num++,num– (兩個減號不是大橫線)變量后遞增,后遞減

     ++num,–num(兩個減號不是大橫線)變量前遞增,前遞減

     +,-加法、 減法

     !,~ 邏輯和按位求反

     ** 求冪運算(乘次方)

     *,/,%  乘法,除法,求模(求余)           

     <<,>> 左和右移位

     <=,>=,<,> 比較

      ==、 != 平等,不平等

      & 按位與

     ^ 按位異或

     | 按位或

      && 邏輯與

      || 邏輯或

      expr ?expr: expr

條件運算符

       =, *=, /=, %=,+=, -=, <<=, >>=,&=,^=,|= 賦值

變量也可以作為let 命令的參數              

(2)VAR=$[算數運算表達式]   

但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo

[root@localhost ~]# $[${num2}+${num3}]
bash: 14: 未找到命令...
[root@localhost ~]# echo "$[${num2}+${num3}]"
14

(3)VAR=$((算數運算表達式))  

但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo

[root@localhost ~]# $((${num2}+${num3}))
bash: 14: 未找到命令...
[root@localhost ~]# echo $((${num2}+${num3}))
14

(4)expr EXPRESSION 或 VAR=$(expr EXPRESSION)

  expr OPTION

示例:

[root@localhost ~]# num1=2
[root@localhost ~]# num2=4
[root@localhost ~]# expr ${num1} + ${num2}
6
[root@localhost ~]# sum=$(expr ${num1} \* ${num2})
#注意乘法*符號需要轉意(原因是*號在有些場景中為glob通配符)
[root@localhost ~]# echo "${sum}"
8

expr 參數的算術運算格式

                ARG1 | ARG2

                ARG1 是否為 null,也不是 0,否則為 ARG2

                ARG1 & ARG2

                ARG1 如果參數都不是 null 或 0,否則為 0

                ARG1 < ARG2

                ARG1 小于 ARG2

                ARG1 <= ARG2

                ARG1 小于或等于 ARG2

                ARG1 = ARG2

                ARG1 等于 ARG2

                ARG1 != ARG2

                ARG1 ARG2 不等于

                ARG1 >= ARG2

                ARG1 是大于或等于 ARG2

                ARG1 > ARG2

                ARG1 大于 ARG2

                ARG1 + ARG2

                ARG1 和 ARG2 的算術總和

                ARG1 -ARG2

                ARG1 減 ARG2 的算術差

                ARG1 * ARG2

                ARG1 和 ARG2 的算術積

                ARG1 / ARG2

                ARG1 除以 ARG2 的算術商

                ARG1 % ARG2

                ARG1 除以 ARG2 的算術余數

注意:算數運算格式內各參數彼此之間必須有空格,并且shell腳本不支持浮點型

增強型賦值:

       變量做某種算數運算后回存至此變量中;

            eg:  

               let i=$i+#

               let i+=#

            還有:+=,-=,*=,/=,%=

            自增:

                 VAR=$[$VAR+1]

                 let VAR+=1  

                 let VAR++

            自減:

                 VAR=$[$VAR-1]

                 let VAR-=1

                 let VAR–

         

二、條件測試:

     判斷某需求是否滿足,需要由測試機制來實現;

     如何編寫測試表達式以實現所需的測試;

       (1)執行命令,并利用命令狀態返回值來判斷

          0:成功

          1-255:失敗

       (2)測試表達式

           test EXPRESSION   eg:test 3 -gt 2

            [ EXPRESSION ]

            [[ EXPRESSION ]]

        注意:EXPRESSION兩端必須有空白字符,否則有語法錯誤

bash的測試類型:

          數值測試:數值比較

                 -eq:是否等于;     eg:[ $num1 -eq $sum2 ]

                 -ne:是否不等于

                 -gt:是否大于

                 -ge:是否大于等于

                 -lt:是否小于

                 -le:是否小于等于

          字符串測試:

              ==:是否等于;(字符串)

一個=號也可以由于賦值變量用=號,但是賦值并不應用到[]中,所以能夠使用,但是還是推薦使用雙=號

              >:是否大于

              <:是否小于

             !=:是否不等于

             =~:左側字符串時候能夠被右側的PATTERN所匹配;(模糊匹配而非精確匹配) 

示例:

[root@localhost ~]# [[ tom =~ tom ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ om ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ o ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ x ]]
[root@localhost ~]# echo $?
1

-z “STRING”:判斷指定的字符串是否為空,空為真,不空為假

-n “STRING”:判斷指定的字符串是否為不空,不空為真,空為假  

注意:(1)字符串測試時:字符串要加引號,表示引用有變量命令””,沒有變量命令使用”

    (2)作比較時,盡量使用[[]];

   (3) 但是在組合測試時,[[]]有時會有語法錯誤,所以可以使用[]

示例:

[root@localhost ~]# [ var1 == var1 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ var1 == Var1 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ var1 == ${Var2} ]
-bash: [: var1: 期待一元表達式
[root@localhost ~]# [ var1 == "${Var2}" ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ a > b]
-bash: [: 缺少 `]'
[root@localhost ~]# [ a > b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ a < b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ "a" < "b" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ "a" > "b" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ "a" > "b" ]]
[root@localhost ~]# echo $?
1

文件測試:

     存在性測試:

            -a FILE  少使用

            -e FILE 推薦使用

文件存在則為真,否則為假  

存在性及類型測試:

            -b FILE:是否存在并且為塊設備文件;

            -c FILE:是否存在并且為字符設備文件;

            -d FILE:是否存在并且為目錄文件;

            -f FILE:是否存在并且為普通文件;

            -h FILE 或 -L FILE:是否存在并且為符號鏈接文件;

            -p FILE:是否存在并且為管道文件;

            -S FILE:是否存在并且為套接字文件;

文件權限測試:

            -r FILE:是否存在并且對當前用戶可讀;

            -w FILE:是否存在并且對當前用戶可寫;

            -x FILE:是否存在并且對當前用戶可執行;

特殊權限測試:

           -u FILE:是否存在并且擁有suid權限;

           -g FILE:是否存在并且擁有sgid權限;

           -k FILE:是否存在并且擁有sticky權限;

注意:對于腳本則是當前運行此腳本的用戶

文件是否有內容:

          -s FILE:是否有內容;

時間戳測試:

       -N FILE:文件自從上一次讀取操作后是否被修改過

從屬關系測試:

       -O FILE:當前用戶是否為文件的屬主;

       -G FILE:當前用戶是否屬于文件的屬組;

雙目測試:

     FILE 1 -ef FILE2 :FILE1與FILE2是否指向同一個文件系統的相同inode的硬鏈接;

     FILE 1 -nt FILE2 :FILE1的最近一次更新時間是否新于FILE2的最近一次更新時間

     FILE 1 -ot FILE2 :FILE1的最近一次更新時間是否舊于FILE2的最近一次更新時間

組合測試條件:

       邏輯運算:

       第一種方式:

             COMMAND1 && COMMAND2

             COMMAND1 || COMMAND2

             ! COMMAND

            eg: [ -O FILE ] && [ -r FILE ]

       第二種方式:

            test EXPRESSION1 -a EXPRESSION2

            [ EXPRESSION1 -a EXPRESSION2 ]

            [[ EXPRESSION1 -a EXPRESSION2 ]]

類此還有

     EXPRESSION1 -o EXPRESSION2

     ! EXPRESSION

eg:[ -O FILE -a -r FILE ]

注意:模式匹配時,勢必要激活正則表達式引擎,而使用正則表達式的測試判斷,要比單一字符串測試判斷要慢,所以盡量避免使用正則表達式進行查找比較和測試;

腳本的狀態返回值:

           默認是腳本中執行的最后一條件命令的狀態返回值

           自定義狀態退出狀態碼:exit [n]:n為自己指定的狀態碼;

       注意:shell進程遇到exit時,即會終止,因此,整個腳本執行即為結束;

三、bash腳本語句

過程式編程語言的代碼執行順序:

           順序執行:從左至右,從上至下,逐一運行

           選擇執行:代碼有一個分支:條件滿足時才會執行

                 兩個或以上的分支:只會執行其中一個滿足條件的分支

           循環執行:

                 代碼片段(循環體)要執行0、1或多次重復運行

選擇執行:

     單分支的if語句

    if 測試條件;then 

      代碼分支 

      條件為真則執行,為假則不執行

或者

    fi       

    if 測試條件      

     then      

        代碼分支                                     

        條件為真則執行,為假則不執行                                        fi                            

雙分支的if語句:

         if 測試條件;then

           條件為真時執行的分支

         else

           條件為假時執行的分支

         fi

多分支的if語句:

          if COMDITION1;then

            條件1為真分支

          elif COMDITION2;then

              條件2為真分支

          elif COMDITION3;then

             條件3為真分支

          …

          elif COMDITIONn;then

             條件n為真分支

          else

             所有條件均不滿足時的分支

          fi

注意:即便多個條件可能同時都能滿足,分支只會執行其中一個,首先測試為“真”;并且if語句可嵌套if等其他語句

case語句的語法格式:

    case $VARAIBLE in

    PATH1)

          分支

          ;;

    PATH2)

          分支

          ;;

    …

    *)

          分支

          ;;

    esac

    注意:雙分號如果不加,則會前一個匹配執行后,下一個會接著匹配執行

          適用于一個變量,與多個可能取值比較

          支持glob風格的通配符:

                         *:任意長度的任意字符;

                         ?:任意單個字符

                         []:范圍內任意個字符

                         a|b:a或b;

bash腳本編程之用戶交互:

    腳本參數

       用戶交互:通過鍵盤輸入數據,從而完成變量賦值操作

           read [option]…[name…]

                  -p ‘PROMPT’    提示注釋信息

                  -t TIMEOUT     時間限制

       bash -n /path/to/some_script

               檢測腳本中的語法錯誤

       bash -x /path/to/some_script

               調試執行

循環執行:將一段代碼重復執行0、1或多次;

     進入條件:條件滿足時才進入循環

     退出條件:每一個循環都應該有退出條件,以有機會退出循環

bash腳本:

     for循環

     while循環

     until循環

for循環:

       執行機制:依次將列表中的元素賦值給“變量名” ; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束

   兩種格式:

     (1)遍歷列表

     (2)控制變量

    遍歷列表

        for VARAIBLE in LIST;do

             循環體

        done

    進入條件:LIST列表有元素,即可進入循環

    退出條件:列表中的元素遍歷完成

    LIST的生成方式:

         (1)直接給出;

         (2)整數列表

                  (a){start…end}

                  (b)seq [start [incremtal]] last

          (3)返回列表的命令:$(COMMAND),例如:ls  cat

         (4)glob通配符

         (5)變量引用;例如$@,$*

    格式示例:

    #!/bin/bash

    #

    for username in user1 user2 user3;do

        if id $username &>/dev/null;then

           echo “$username exists.”

        else

           useradd $username && echo “Add user $username finished.”

        fi

    done

    示例:求100以內的正整數之和

    #!/bin/bash

    #

    delcare -i sum=0

    for i in {1..100};do

        echo “\$sum is $sum,\$i is $i”

        sum=$[$sum+$i]

    done

    echo $sum

    示例:判斷/var/logm目錄下的每一個文件的內容類型

    #!/bin/bash

    #

    for filename in /var/log/*;do

    if [ -f $filename ];then

       echo “Common file.”

    elif [ -L $filename ];then

       echo “Sysbolic link”

    elif [ -d $filename ];then

       echo “Directory.”

    elif [ -b $filename ];then

       echo “block special file.”

    elif [ -c $filename ];then

       echo “character special file.”

    elif [ -S $filename ];then

       echo “Socket file.”

    else

       echo “Unkown.”

    fi

    done

while循環:

     while CONDITION;do

           循環體

           循環控制變量修正表達式

     done

     

     CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環,因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正

     進入條件:CONDITION測試為“真”

     退出條件:CONDITION測試為“假”

     示例:求100以內的正整數之和

     #!/bin/bash

     #

     declare -i sum=0

     declare -i i=1

     while [ $i -le 100 ];do

          sum=$[$sum+$i]

          let i++

     done

     echo $sum

原創文章,作者:cnc,如若轉載,請注明出處:http://www.www58058.com/71736

(0)
cnccnc
上一篇 2017-03-26
下一篇 2017-03-26

相關推薦

  • N27_第六周作業

    請詳細總結vim編輯器的使用并完成以下練習題 基本模式:編輯模式(命令模式),輸入模式,末行模式 模式轉換: 編輯模式–輸入模式: i:insert,在光標所在處前方輸入 a:append,在光標所在處后方輸入 o:在光標所在處的下方新建一行 I:在光標所在行行首輸入 A:在光標所在處行尾輸入 O:在光標所在處的上方打開一個新行 輸入模式&#82…

    Linux干貨 2017-10-26
  • configure –help 參數詳解

    configure –help 參數詳解及apache2.2靜態編譯和動態編譯參考

    Linux干貨 2016-05-25
  • GOPS 2016全球運維大會 上海站

    GOPS 2016全球運維大會 ? 上海站已經圓滿落幕,最新GOPS大會推薦:GOPS2017全球運維大會 ? 深圳站 基本信息: GOPS2017全球運維大會 ? 深圳站 時間:2017-04-21 08:00:00 至 2017-04-22 18:00:00結束 地點:深圳    會議規模:5000人 會議詳情:http://www.…

    系統運維 2016-09-07
  • 啊 逗比呀!

    提示符,nano編輯,rz | sz命令,Sublime

    2017-11-19
  • 一周作業體會

    1、描述計算機的組成及其功能 CPU+控制器+RAM+輸入設備+輸出設備 2、按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別 答:最主流的發行版主要有: Debian/Slackware/Redhat,我們日常最常使用的操作系統大多是上述發行版的二次再發行版,例如:基于Debian的二次發行版Ubuntu和Knopix,基于Slac…

    Linux干貨 2016-10-31
  • sed

    Stream EDitor, 行編輯器 sed是一種流編輯器,它一次處理一行內容。處理時,把當前 處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后 ,把緩沖區的內容送往屏幕。然后讀入下行,執行下一個循環 。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空 模式空間,但不會清空保留…

    Linux干貨 2017-12-03
欧美性久久久久