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 01:26
下一篇 2016-12-23 01:43

相關推薦

  • bash腳本編程

    Linux腳本編程中bash常用的測試類型:                 整數測試:       -gt greater than  大于    …

    Linux干貨 2016-08-18
  • CentOS 7 安裝 mysql-5.7.14

    在centos7上安裝 路上遇過各種坑 把在centos7正確安裝mysql-5.7.14分享一下 1. CentOs7 默認的數據庫為MariaDB,先卸載MariaDB,否則安裝mysql,引起沖突 rpm -qa mariadb rpm -e –nodeps mariadb 2. 準備好工作環境 mkdir /application&nbs…

    Linux干貨 2017-05-07
  • linux進程管理

    linux系統進程查看及管理工具 對于服務器來說重要的IO 設備磁盤網絡 pstree,ps,pidof,pgrep,top,htop,glances,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup,nice,renice,killall….. pstree命令: pstree-display …

    Linux干貨 2016-09-09
  • Nginx 編譯安裝

    Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服 1、Apache服務器和nginx的優缺點: Apache具有很優秀的性能,而且通過模塊可以提供各種豐富的功能。 1)首先Apache對客戶端的響應是支持并發的 ,運行httpd這個daemon進程之后,它會同時產生多個子進程/…

    Linux干貨 2017-02-06
  • N26-第三周博客

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只 顯示一次即可。 [yang@localhost /]$ who | cut -d" " -f 1 | sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 [root@localhost tmp]# last | head -1 3、取出當前系…

    Linux干貨 2017-02-08
欧美性久久久久