shell腳本編程學習筆記(一)


一、腳本格式

    vim shell.sh

      #!/bin/bash        //聲明腳本解釋器,這個‘#’號不是注釋,其余是注釋

      #Program:         //程序內容說明

      #History:          //時間和作者

二、shell變量的種類

    用戶自定義變量:由用戶自己定義、修改和使用

    與定義變量:Bash與定義的特殊變量,不能直接修改

    位置變量:通過命令行給程序傳遞執行的參數

    1、定義變量:

        變量名要以英文字母或下划線開頭,區分大小寫。

        格式:變量名=值

        輸出變量:echo $變量名

    2、鍵盤輸入為變量內容:

        格式:read [-p "信息"] 變量名

           如:read -p "pewase input your name:" name

    3、不同引號對變量的作用

      雙引號"":可解析變量,$符號為變量前綴。

      單引號'':不解析變量,$為普通字符。

      反引號``:將命令執行的結果輸出給變量。

三、shell條件測試

    1、test命令:

      用途:測試特定的表達式是否成立,當條件成立時,命令執行后的返回值為0,否則為其他數字。

      格式:test 條件表達式 [ 條件表達式 ]   (注意:[]與表達式之間存在空格)

 

    2、常見的測試類型:

      測試文件狀態

        格式:[ 操作符 文件或目錄 ]

          如:if [ -d /etc ]

            then

              echo "exists"

            else

              echo "not exists"

            fi

      常見的測試操作符:

          -d:測試是否為目錄

          -e:測試目錄或文件是否存在

          -f:測試是否為文件

          -r:測試當前用戶是否有讀權限

          -w:測試當前用戶是否有寫權限

          -x:測試當前用戶是否有執行權限

          -L:測試是否為符號鏈接文件

      字符串比較

        格式:[ 字符串1 = 字符串2 ]

           [ 字符串1 != 字符串2 ]

           [ -z 字符串 ]

          如:read -p 'name:' name

            read -p 'pass:' pass

            if [ $name = 'admin' ] && [ $pass = '123']

            then

              echo '登錄成功'

            else

              echo '登錄失敗'

            if

        常用的測試操作符:

          =:字符串內容相同。

          !=:字符串內容不同。

          -z:字符串內容為空。

      整數值比較

        格式:[ 整數1 操作符 整數2 ]

          如:age=30

            if [ $age -ge 18 ]

            then

              echo "已成年"

            else

              echo "未成年"

            fi

        常用的測試操作符:

          -eq:等於

          -ne:不等於

          -gt:大於

          -lt:小於

          -le:大於或等於

          -ge:小於或等於

      邏輯測試

        格式:[ 表達式1 ] 操作符 [ 表達式2 ]

        常用操作符:

          -a或&&:邏輯與

          -o或||:邏輯或

          !:邏輯非

四、流程判斷:

    1、條件判斷

       a、if語句

       格式:

          單分支:

            if 條件表達式

              then 命令序列

            fi

            如:age=30

              if [ $age -ge 18 ]

              then

                echo "已成年"

              else

                echo "未成年"

              fi

          多分枝:

            if 條件表達式

              then 命令序列

            elif 命令序列

            fi

            如:score=87

              if [ $score -lt 60 ];then

                echo '60以下'

              elif [ $score -gt 60 ] && [ $score -lt 70 ];then

                echo '60~70之間'

              elif [ $score -ge 70 ] && [ $score -lt 80 ];then

                echo '70~ 80之間'

              else

                echo '優秀'

              fi

          b、case

          格式:case $變量名稱 in

               "第一個變量內容")

               ;;

               "第二個變量內容")

               ;;

             *)      //最后一個變量內容都會用*來代表其它值,不包含前面的變量內容

               ;;

             esac

            如:case $1 in

                start)

                   echo 'start MYSQL service.'

                  ;;

                stop)

                  echo 'stop MYSQL service.'

                  ;;

                *)

                  echo "Usage: $0 start|stop"

                  ;;

                esac

    2、循環控制

        跳出本次循環:continue

        結束循環:break

        a、while循環

        格式:while [ 條件表達式 ]

           do

              程序段落

          done

          如:num=3

            while [ $num -gt 0 ]

            do

              echo $num

              num=$(($num-1))

            done

        b、for循環

        格式:for var in con1 con2 con3

           do

              程序段

           done

           如:

           for i in user0 user1 user2 user3

             echo $i

           done

        格式:for ((i=0;i<10 1++))

           do

             程序段

           done

          如:for ((i=0;i<10;i++))

            do

              echo $i

              useradd user$i

              echo 123 | password --stdin_user$i

            done

    3、函數使用

        定義一個函數:在程序的最前面

          function 函數名(){}或者function 函數名{}

            如:function printit(){

                echo "your choice is $1"

              }

        調用:直接使用函數名

            如:printit 1

        傳遞參數:函數名 參數1 參數1

            如:printit 2

五、Shell文本操作

    1、Find查找命令的使用

        find . -name "*.text"      //在當前目錄下查找已txt為后綴的文件

        fing .-name "[a-z]*"      //在當前目錄下查找開頭字母的文件

        find /etc -name "host*"    //查找/etc目錄下以host開頭的文件

        find . -perm 755        //在當前目錄下查找屬性為755的文件

        find -user root        //在當前目錄下查找屬主為root的文件

        find /var -mtime -5      //在/var下查找更改時間在5天內的文件

        find /var -mtime +3      //在/var下查找更改時間在3天以前的文件

        find /etc -type d        //查找文件類型為d的目錄文件

        find /etc -typt l        //查找文件類型為l的鏈接文件

        find . -size +1000000c     //查找文件大小在1M的文件

    2、正則表達式

        ^linux        //以linux開頭的

        $php        //以php結尾的

        .          //匹配任意單字符

        .+          //匹配任意多個字符

        .*          //匹配0個或多個字符

        [0-9a-z]       //匹配[]內任意一個字符

        (linux)+        //出現多次linux單詞

        (web){2}       //web出現了2次以上

        \          //轉譯

    3、grep詳解

        grep "li qq"*          //在所有文件中查找li qq文件

        grep -c "file" a          //在文件中查找有多少行匹配到file

        grep -n "file" a          //在文件中查找有多少行匹配file,同時顯示行和行號

        grep -i "file" a          //在文件中查找file,並不區分大小寫

        grep -v "file" a          //在文件中過濾掉file所在的行

        grep -E "2017:22:5[0-9]" a     //在文件中查找在時間在2017:22:50到59的所在行

        grep -E "^[^210]" a        //在文件中查找不號寒210的行

        grep -E "h*p" a          //查找包含h和p的行

        grep -E "[5-8][6-9][0-3]" a    //查找大於560小於893的行

        grep -E "^d" a          //在文件中查找以d開頭的行

        grep -E "^[^d]" a          //在文件中查找不是以d開頭的行

    4、awk命令:

        簡介:awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。

            awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。

通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執行相應的命令,來處理文本。

        格式:awk '{pattern + action}' {filenames}

            pattern:查找內容

            action:匹配規則

          awk '{pring $0}' access.log              //查找文件中的每一列

          awk '{print $1"\t"$7}' access.log           //查找文件中第一列和第七列

          cat file | awk '$0 !~ /192.168.31.25/'|grep "php"    //匹配Ip 地址的統計,!~為不匹配

          例:for i in `cat /etc/passwd | head | awk -F:'{print $1}'`

            do

              echo $i

            done

              -F---以什么符號分割

              head---去前多少行,默認是10行

    5、sed行定位使用

        簡介:sed是非交互式的編輯器。它不會修改文件,除非使用shell重定向來保存結果。默認情況下,所有的輸出行都被打印到屏幕上。

 選項  功能
 -e  進行多項編輯,即對輸入行應用多條sed命令時使用
 -n  取消默認的輸出
 -f  指定sed腳本的文件名

        sed -n '2'p file        //只打印第二行,不打印其他行

        sed -n '1,4'p file       //從第一行到第四行的記錄

        sed -n '/los/'p file      //打印匹配los的行

        sed -n '4,/los/'p file     //打印從第四行到匹配los的之間所有行

        sed '1,2'd file        //吧第一行和第二行全部刪除

    6、Uniq行定位使用

        簡介:uniq命令用於報告或忽略文件中的重復行,一般與sort命令結合使用。

        語法 uniq(選項)(參數)

        選項 :

           -c或——count:在每列旁邊顯示該行重復出現的次數;

           -d或--repeated:僅顯示重復出現的行列;

           -f<欄位>或--skip-fields=<欄位>:忽略比較指定的欄位;

           -s<字符位置>或--skip-chars=<字符位置>:忽略比較指定的字符;

           -u或——unique:僅顯示出一次的行列;

           -w<字符位置>或--check-chars=<字符位置>:指定要比較的字符。

        uniq -c file          //打印緊挨的重復行出現的次數

        uniq -d file          //只打印重復的行

        awk '{print $1}' /var/log/httpd/access_log | sort|uniq -c        //把apache網站的所有訪問ip全部統計出來,並打印出統計次數。

    7、spli行定位

        簡介:可以將一個大文件分割成很多個小文件,有時需要將文件分割成更小的片段,比如為提高可讀性,生成日志。

        語法:split(選項)(file)PREFIX

        選項:

          -b:值為每一輸出檔案的大小,單位為 byte。
          -C:每一輸出檔中,單行的最大 byte 數。
          -d:使用數字作為后綴。
          -l:值為每一輸出檔的列數大小。
          PREFIX:代表前導符,可作為切割文件的前導文件。

        split -2 file spt        //生成fileab,fileac....fileai等多個文件,把a文件每行分割成一個文件,每個文件的前綴都是以file開頭的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM