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命令來查找文件,屢試不爽啊!