bash編程基礎(二)補

   bash腳本編程

        腳本文件格式:

        第一行,頂格:#!/bin/bash

        注釋信息:#

        代碼注釋:

        縮進,適度添加空白行;

   語言:編程語法格式,庫,算法和數據結構

   編程思想:

      問題空間–解空間

      變量:

          局部變量

          本地變量

          環境變量

               

          位置參數變量

          特殊變量

       數據類型:字符、數值型

        弱類型:字符型

     算術運算:

        + ,-, *, /,**

        VAR= let VAR=$num1 op $num2

        VAR= $[expression]

         VAR=$((expression))

         VAR=$(expr  argu1 argu2 argu3)

     注意:有些時候乘法符號需要轉義;

     增強型賦值:

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

            let i=$i+#

            let i+=#

            +=, -=, *=, %=

                  自增:

                           let VAR=$[$VAR+1]

                           let  VAR+=1

                            let VAR++

                   自減:

                          VAR=$[VAR-1]

                          let VAR=1

                          let VAR–

   練習:寫一個腳本

          1  計數/etc/passwd文件中的第10個用戶和第20個用戶的id號之和;

            id1=$(head-10/etc/passwd | tail-1 | cut -d: -f3)

            id1=$(head-20/etc/passwd | tail-1 | cut -d: -f3)

           2、計算/etc/rc.d/init/d/functions和/etc/inittab文件的空白行數之和;

                  grep "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l

   條件測試:

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

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

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

                     0:成功

                     1-255:失敗

              (2)測試表達式

                    test EXPRESSION

                    [EXPRESSION]

                    [ [EXPRESSION]]

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

            bash的測試類型:

                  數值測試

                  字符串測試

                   文件測試

             數值測試:數值比較

               -eq: 是否等于: [$num1 -eq $num2]

               -ne: 是否不等于;

               -gt:是否大于等于;

              -lt: 是否小于;

               -le: 是否小于等于;

               字符串測試:

                 ==:是否等于;

                 >:是否大于;

                  <:是否小于;

                !=:是否不等于;

                 =-: 左側的字符串是否能夠被右側的PATTERN所匹配;

                -z: "STRING":判斷指定的字串是否為空;空位真,不空為假;

               -n:  "STRING":判斷指定的字串是否為不空,不空為真,空則假;

                 注意:(1)字符串要加引號;

                       (2)要使用[[]];

                文件測試:

                    存在性測試

                    -a FILE

                    -e FILE

                     文件的存在性測試,存在則為真,否則則為假;

                 存在性及類型測試

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

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

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

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

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

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

                文件權限測試:

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

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

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

               特殊權限測試:

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

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

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

                文件是否有內容:

                    -s FILE: 是否有內容;

                     時間戳:

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

                從屬關系測試:

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

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

   

                雙目測試:

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

                    FILE1  -nt FILE2:FILE1是否新于FILE2;

                     FILE1 -ot  FILE2: FILE1是否舊于FILE2;

                組合測試條件:

                     邏輯運算:

                第一種方式:

                    COMMAND1 && COMMAND2

                    COMMAND1 ||    COMMAND2

                    ! COMMAND 

                    [ -O FILE ] && [ -r FILE ]

                第二種方式:

                    EXPRESSION1 -a EXPPRESSION2

                    ! EXPRESSION 

                    [ -O FILE -a -x FILE ] 

                練習:將當前主機名稱保存至hostName變量中;

                    主機名如果為空,或者為localhost.localdomain,則將其設置為www.magedu.com;

                    hostName=&(hostname)

                    [ [ -z "$hostName" -o "$hostName"=="locahost.localdomain" -o "$hostName" == "localhost"]] && hostname www.magedu.com

                腳本狀態返回值:

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

                   自定義狀態退出狀態碼:

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

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

     

            向腳本傳遞參數:

                位置參數變量

                myscript.sh argu1 argu2

                引用方式:

                 $1, $2,…,${10},${11},…

            輪替:

                 shift [n]: 位置參數輪替;

     練習;寫一腳本,通過命令傳遞兩個文本文件路徑給腳本,計算器空白行數之和;

            #!/bin/bash

            #

            file1-lines=$(grep "^$" $1 | wc -l)

            file2-lines=$(grep "^$" $2 |  wc -l)

            echo "Total blank lines: $[$file1-lines+$file2-lines]"

     特殊變量:   

         $0 :腳本文件路徑的本身;

         $#:腳本參數的個數;

         $*:  所有參數;“hello" "hi" "toyou"

         $@: 所有參數;"hello hi toyou"

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

         順序執行:逐條運行;

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

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

    循環執行:

        代碼片段(循環體)要執行0、1或多個來回;

        選擇執行:

         if  測試條件

         then 

              代碼分支

         fi

         雙分支的if語句;

         if 測試條件;then

         條件為真實執行的分支

         else

         fi

    示例:通過參數傳遞一個用戶給腳本,次用戶不存在是,則添加之;

         #!/bin/bash

         #

         if !|grep "^$1\“ /etc/passwd/ $> /dev/null; then

         useradd $1

         echo $1 | passwd –stdin $1 $> /dev/null

         echo "Add user $1 finished."

         fi

    做條件判斷:

         #!/bin/bash

         #

         if [ $# -lt 1 ]; then

            echo "At least one username."

            exit 2

         fi

         if !|grep "^$1\“ /etc/passwd/ $> /dev/null; then

             echo "User $1 exists."

         else

             useradd $1

             echo $1 | passwd –stdin $1 $> /dev/null

             echo "Add user $1 finished."

          fi

   練習1、通過命令行參數給定的兩個數字,輸出其中較大的數值;

   第一種:

   #!/bin/bash

   #

  if [ $# -lt 2 ]; then

   echo "Two integers."

   exit 2

   fi

   if [ $1 -ge $2 ]; then

     echo "Max numeber: $1."

   elese

     echo "Max numeber: $2."

  fi 


  第二種:

   #!/bin/bash

   #

   if [ $# -lt 2 ]; then

      echo "Two integers."

       exit 2

  fi

   declare -i max=$1

  if [ $1 -ge $2 ]; then

     max=$1

  else 

      max=$2

  fi 

  echo "Max number: $max."

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

(0)
shadowshadow
上一篇 2016-12-23
下一篇 2016-12-23

相關推薦

  • 馬哥教育-第二周作業

    問題一:文件管理類命令 常規命令:mkdir、rmdir、stat、touch、copy、mv、rm (1).mkdir  創建目錄: 注意:路徑基名方為命令的作用對象;基名之前的路徑必須得存在; -p:自動按需創建父目錄; -v:顯示創建過程; -m 參數:直接給定所需權限; 例子:問題:創建 /tmp/x ; /tmp/x/y1 ; /tmp/…

    Linux干貨 2016-12-11
  • 推薦-LVS專題: LVS的工作模型和調度算法介紹

    LVS專題: LVS的工作模型和調度算法介紹 LVS專題: LVS的工作模型和調度算法介紹 前言 什么是負載均衡? 什么是LVS? LVS的架構: LVS的實現模型: NAT實現原理: DR實現原理: TUN實現原理: FULLNAT實現原理: LVS的調度算法 靜態調度算法(4種) 動態調度算法(6種): 總結 前言 本文大概介紹一下LVS的工作方式和實現…

    Linux干貨 2016-04-05
  • N26-第二周博客作業

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相 關示例演示。 文件管理類命令:mkdir rmdir cp rm mv ①mkdir命令:創建目錄 格式:mkdir [OPTION]… DIRECTORY… option -m, –mode=MODE -p, –paren…

    Linux干貨 2017-02-02
  • 正則表達式與擴展正則表達式

    基本正則表達式 字符匹配:.:匹配任意單個字符[]:匹配指定范圍內的任意單個字符[^]:匹配指定范圍外的任意單個字符[-]:匹配[]中指定范圍內的任意一個字符,要寫成遞增POSIX字符類:[:digit:]:匹配任意一個數字字符[:lower:]:匹配小寫字母[:upper:]:匹配大寫字母[:alpha:]:匹配任意一個字母字符(包括大小寫字母)[:aln…

    2017-09-10
  • 11.網絡解析和網絡加密

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 加密過程 1.使用單向加密算法,提取A的文件的特征碼。 2.使用A的私鑰對提取出來的特征碼進行加密,把加密后的特征碼附加在A的文件的后面。 3.使用對稱加密對剛剛的A的文件和加密后的特征碼進行加密,生成對稱加密密鑰 4.使用B的公鑰對第3步驟的對稱加密的密鑰進行加密,加密后附加在文件的后面。 解密過程 1.使用…

    2017-09-20
  • 證書及加解密原理圖解

    證書管理 現在上網大多數網站都是使用https的協議,https是一個安全的訪問方式,數據在傳輸過程中是加密的,這時候在服務器端就需要使用證書。 科普加解密流程 服務器端客戶端 服務器在和客戶端通信前必須先建立SSL會話,下圖解析SSL會話過程

    Linux干貨 2016-09-25
欧美性久久久久