bash shell學習-shell script基礎 (筆記)

  A chain no stronger than its weakest link.node

  "一着不慎,滿盤皆輸"shell

 

參考資料鳥哥的Linux私房菜 基礎學習篇(第三版) 編程

       Linux Shell腳本攻略 bash

         Linux程序設計(第四版)less

 

1、什麼是shell script函數

  一、什麼是shell script學習

    簡單來講,shell script(程序化腳本)是利用shell功能所寫的一個「程序」,它擁有本身的語法特性測試

  二、爲何要學shell scriptspa

    對於一個初學者來講,我以爲就那麼幾個緣由:設計

      ①連續命令單一化;

      ②簡單的數據處理;

      ③簡化常規的系統管理;

  三、注意事項(重要!重要!重要!--重要的事情說三遍)

    ①命令的執行順序是從上而下,從左而右地分析與執行;

    ②若是讀取到一個Enter符號(CR),就嘗試開始執行該行(串)命令;

    ③若是命令太長,可使用\[Enter]來擴展至下一行;

    ④「#」可做爲批註(註釋),任何加在「#」後面的數據在執行時所有被忽略;

    ⑤命令、參數間的空白(包括Tab鍵)在執行時都會被忽略;

  四、shell script的文件結構(重要!重要!重要!)

    ①第一行爲#!/bin/bash,目的是聲明這個script使用的shell名稱;

    ②程序內容說明;

    ③主要環境變量和函數的聲明;

    ④主程序部分;

    ⑤程序的執行結果;

  五、養成良好的shell script編程習慣(重要!重要!重要!)

    ①功能(批註);

    ②版本信息(批註);

    ③做者和聯繫方式(批註);

    ④版權聲明(批註);

    ⑤歷史記錄(批註);

    ⑥特殊命令應該用絕對路徑的方式來執行;

    ⑦預先聲明環境變量;

 

2、簡單的shell script練習

  一、幾種經常使用的範例

    ①交互式腳本:用 read 命令獲取用戶輸入做爲變量內容;

    ②隨日期變化的文件:利用date命令的執行結果做爲文件名的一部分;

    ③簡單的數值運算:shell script支持 +、-、*、/、%等運算符上的整數運算;

    ④數值運算的方法:假設a=1,b=2,如今要求a+b並賦值給c,那麼能夠這樣: let c=a+b、c=$((a+b))或者c=$[ a + b ] ;

  二、script的執行方式區別

    ①直接執行或者使用  bash name.sh  方式執行:子進程執行完以後,子進程內各項變量或操做將會結束而不傳回到父進程中;

    ②利用  source name.sh  或者  . name.sh  的方式來執行:在父進程中執行;

 

3、測試語句

  一、利用 test 測試,命令格式: test test_expr 

  二、利用  [] ,命令格式: [ test_expr ]  ,使用中括號須要注意如下幾點:

    ①在中括號[]內的每一個組件都要用空格鍵來分隔;

    ②在中括號內的變量,最好都以雙引號括起來;

    ③在中括號內的常量,最好都以單或雙引號括起來;

  三、關於  test_expr  ,見下表

 測試標誌 表明意義 
  文件類型判斷,如: test -d filename 表示 判斷filename是否存在且是一個目錄
-e  文件名是否存在 
-f  文件名是否存在且爲文件(file) 
-d  文件名是否存在且爲目錄(directory) 
-b  文件名是否存在且爲一個block device設備 
-c  文件名是否存在且爲一個character device設備 
-S  文件名是否存在且爲一個Socket文件 
-p  文件名是否存在且爲一個FIFO(pipe)文件 
-L  文件名是否存在且爲一個鏈接文件 
  文件權限檢測,如: test -r filename 表示 判斷filename是否可讀(root權限例外)
-r  文件名是否存在且具備「可讀」權限 
-w  文件名是否存在且具備「可寫」權限 
-x  文件名是否存在且具備「可執行」權限 
-u  文件名是否存在且具備「SUID」屬性 
-g  文件名是否存在且具備「SGID」屬性 
-k  文件名是否存在且具備「Sticky bit」屬性 
-s  文件名是否存在且爲「非空白文件」 
  兩個文件之間的比較,如: test file1 -nt file2 表示 判斷file1是否比file2新
-nt  (newer than)更新 
-ot  (older than)更舊 
-ef 是否爲同一文件,主要用於斷定兩個文件是否指向同一個inode 
整數比較,如: [ n1 -eq n2 ] 表示判斷n1是否等於n2
-eq  (equal)相等
-ne  (not equal)不相等 
-gt  (greater than)大於 
-lt  (less than)小於 
-ge  (greater than or equal)大於等於 
-le  (less than or equal)小於等於 
 字符串比較
-z string  是否爲空串 
-n string  是否不是空串,-n 可省略 
str1 == str2  是否相等 
str1 != str2  是否不等 
 複合斷定,如:[ n -ge '0' -a n -le '9' ] 表示 判斷n是否大於等於0且小於等於9 
-a   與 運算符,都成立才成立
-o  或 運算符,一個成立就成立 
非 運算符,取反 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  四、shell script的默認變量

1 $0: 腳本文件名;$1,$2,...,$i,第i個參數;
2 $#: 參數個數;$@:表明「 "$1""$2""$3"、...」,每一個變量是獨立的;$*:表明「 "$1c$2$3c..." 」,c爲分隔符,默認爲空格;
3 shift: 參數變量號碼偏移,shift n 表示將全部變量的變量號碼左移n位,變量計數始終從$1開始;

 

4、條件判斷式

  一、if ... then

1 if [ expr1 ]; then
2   dosomething
3 elif [ expr2 ]; then
4   dosomething
5 ...
6 else
7   dosomething
8 fi

  注意:條件表達式能夠用  && 、||  鏈接起來進行復合判斷,做用與  -a、-o  同樣

  二、case ... esac

 1 case $變量名 in
 2      "var1")
 3           dosomething
 4           ;;
 5      "var2")
 6           dosomething
 7           ;;
 8        ...
 9      *)
10            dosomething
11           ;;
12 esac       

  三、使用函數(function)

1 function fname()
2 {
3   dosomething
4 }

   注意:函數的內置變量與shell script的默認變量相似

 

5、循環

  一、while do done

1 while [ condition ]
2 do
3   dosomething
4 done

  二、until do done

1 until [ condition ]
2 do
3   dosomething
4 done

  三、for...do...done

1 for var in con1 con2 ...
2 do
3   dosomething
4 done
5 for ((初始值;限制值;執行步長))   --用於數值處理 6 do 7   dosomething 8 done

  補充:使用  seq a b  能夠生成a到b的連續序列(整數)

 

6、shell script的追蹤與調試

1 用法:bash [-nvx] script.sh
2 參數:
3 -n  :不要執行,僅查詢語法問題
4 -v  :在執行前,先將script的內容輸出到屏幕上
5 -x  :將使用到的script內容顯示到屏幕上,最經常使用的參數

 

7、幾個重要的命令(補充,持續更新...)

  一、trap:信號處理

1 用法:trap cmd signal    #在接收到signal信號後執行cmd命令
2 範例:trap rm tmpfile INT #接收到INT信號(Ctrl+C組合鍵引起)後刪除tmpfile

  二、find:查找文件

 1 用法:find [path] [options] [tests] [actions]
 2 功能:在 path 指定的目錄下查找知足 options 和 tests 指定條件的文件,並執行 actions 指定的動做
 3     options說明:
 4     -depth          #在查看目錄自己以前先搜索目錄的內容
 5     -follow         #跟隨符號連接
 6     -maxdepth N        #最多搜索N層目錄
 7     -mount(或 -xdev)     #不搜索其餘文件系統中的目錄
 8 
 9     tests說明:
10     -atime N        #文件在N天以前被最後訪問過
11     -mtime N         #文件在N天以前被最後修改過
12     -name pattern     #文件名(不包括路徑名)匹配提供的模式pattern,pattern必須用引號括起
13     -newer otherfile    #文件比otherfile更新
14     -type c         #文件類型爲c,c是一個特殊類型,如d(目錄)、f(普通文件)等
15     -user username     #文件的擁有者是username指定的用戶
16 
17     還可使用操做符來進行組合測試
18     !       -not       #測試取反
19     -a       -and       #與運算
20     -o       -or        #或運算
21 
22     actions說明:
23     -exec command        #執行一條命令,這個動做必須使用 \; 字符對來結束,經常使用!!!
24     -ok command         #與-exec相似,但在執行前會針對每一個要處理的文件,提示用戶進行確認,也必須使用 \; 字符對來結束
25     -print            #打印文件名
26     -ls              #對當前文件使用命令ls 
27 說明:{}是-exec或-ok命令的一個特殊類型參數,它將被當前文件的完整路徑取代 28 補充:-exec結合多個命令。-exec參數每次只能直接執行單個命令,可是咱們能夠把多個命令寫到一個script中,而後在-exec後將單個命令替換爲執行script的命令,{}將做爲script的參數傳遞給script 29 範例:find ./ -name "*.gch" -exec rm {} \;   #在當前目錄下遞歸查找文件名以 .gch 結尾的文件並刪除他們

 

總結:shell的功能真的是很強大,剛開始學習就利用shell script快速地完成了不少操做,特別是用find命令來查找文件,屢試不爽啊!

相關文章
相關標籤/搜索