1、shell腳本語言node
1.編程語言的分類:python
(1)根據運行方式正則表達式
編譯運行:源代碼 --> 編譯器 (編譯)--> 程序文件;shell
解釋運行:源代碼 --> 運行時啓動解釋器,由解釋器邊解釋邊運行;編程
(2)根據其編程過程當中功能的實現是調用庫仍是調用外部的程序文件:bash
shell腳本編程:利用系統上的命令及編程組件進行編程;編程語言
完整編程:利用庫或編程組件進行編程;ide
(3)編程模型:測試
過程式編程語言:以指令爲中心來組織代碼,數據是服務於代碼;ui
順序執行、選擇執行、循環執行;表明:C,bash
面向對象的編程語言:以數據爲中心來組織代碼,圍繞數據來組織指令;
類(class):實例化對象,method;
表明:Java, C++, Python
總結:shell腳本編程是過程式編程,解釋運行,依賴於外部程序文件運行;
2.shell腳本格式和規範
(1)第一行,頂格:給出shebang,解釋器路徑
用於指明解釋執行當前腳本的解釋器程序文件
常見的解釋器:
#!/bin/bash;#!/usr/bin/python;#!/usr/bin/perl
(2)註釋信息:#
#description:;#version;#author;#date
(3)代碼註釋:
(4)縮進,適度添加空白行;
(5)txt格式文本文檔
3.shell腳本本質:命令的堆積;
很多命令不具備冪等性,須要用程序邏輯來判斷運行條件是否知足
4.運行腳本方法
(1)賦予執行權限,並直接運行此程序文件;
1)chmod +x /PATH/TO/SCRIPT_FILE
(此處直接+x是賦予所有用戶可執行權限)
2)/PATH/TO/SCRIPT_FILE
(2)直接運行解釋器,將腳本以命令行參數傳遞給解釋器程序;
bash /PATH/TO/SCRIPT_FILE
(此方法和腳本本省有無執行權限無關)
注意:1)腳本中的空白行會被解釋器忽略;
2)空白行表示:加一行echo,則顯示爲空白行
3)註釋行:除shebang,餘下全部以#開頭的行,都會被視做)註釋行而被忽略
4)shell腳本的運行是經過運行一個子shell進程實現的;
2、算數運算
1.算數符號: +,-,*,/, **, %
2.加法運算格式
(1) let VAR=算術運算表達式
(2) VAR=$[算數運算表達式]
(3) VAR=$((算數運算表達式))
(4) expr命令 :VAR=$(expr $ARG1 $OP $ARG2)
注意:乘法符號(*)在有些場景中須要使用轉義符,防止和通配符、正則表達式衝突
3.加強型賦值:變量作某種算術運算後回存至此變量中
(1)let i=$i+# let i+=#
+=,-=,*=, /=, %=
(2)自增
VAR=$[$VAR+1];let VAR+=1;let VAR++
(3)自減
VAR=$[$VAR-1];let VAR-=1;let VAR--
3、傳遞參數
1.位置參數變量
(1)# myscript.sh argu1 argu2
引用方式:$1, $2, ..., ${10}, ${11}, ...
$1:第一個輸入參數
$2第二個傳遞的參數
當兩位數時要用括號括起來${10}, ${11}, ..
(2)輪替機制:調用n個位置變量
shift [n]:位置參數輪替;每次剔除n個,默認爲1個
2.特殊變量
$0 腳本自己路徑
$#腳本參數的個數
$*顯示全部參數,各參數讀成多個獨立字符串
$@顯示全部參數,各參數讀成一個完整的字符串形式
3.read:用戶交互,經過鍵盤輸入數據,從而完成變量賦值操做
read [option]... [變量name ...]
-p 'PROMPT' 顯示提示信息
-t TIMEOUT 超出時間提早結束
time out and return failure if a complete line of input is not read withint TIMEOUT seconds.
注意:通常輸入以空格做爲分隔符,但時當輸入數量大於變量是,最後多餘的所有賦予最後一個變量
4、條件測試
1.條件測試:判斷某需求是否知足,須要由測試機制來實現
2.測試表達式編寫語法
(1)執行命令,並利用命令狀態返回值來判斷;
0:成功
1-255:失敗
(2)測試表達式
test EXPRESSION
[ EXPRESSION ]
` EXPRESSION `
注意:EXPRESSION兩端必須有空白字符,不然爲語法錯誤;
3.bash的測試類型
(1)數值測試:數值比較,雙目測試
-eq:是否等於; [ $num1 -eq $num2 ]
-ne:是否不等於;
-gt:是否大於;
-ge:是否大於等於;
-lt:是否小於;
-le:是否小於等於;
(2)字符串測試:雙目測試
==:是否等於;
>:是否大於;
<:是否小於;
!=:是否不等於;
=~:左側字符串是否可以被右側的PATTERN所匹配;
-z "STRING":判斷指定的字串是否爲空;空則爲真,不空則假;
-n "STRING":判斷指定的字符串是否不空;不空則真,空則爲假;
注意:
1)字符串要加引用;
$變量時候,要" ",防止變量空值時候,比較兩邊類型不一致會報錯
2)最好要使用` `;但多個條件邏輯關係時可能要用[ ]
(3)文件測試:通常爲單目測試,存在爲真,不存在未假
1)文件存在性測試:
-a FILE
-e FILE
2)存在性及類型測試:
-b FILE:是否存在而且爲 塊設備 文件;
-c FILE:是否存在而且爲 字符設備 文件;
-d FILE:是否存在而且爲 目錄文件;
-f FILE:是否存在而且爲 普通文件;
-h FILE或 -L FILE:是否存在而且爲 符號連接文件;
-p FILE:是否存在且爲 命名管道文件;
-S FILE:是否存在且爲 套接字文件;
3)文件權限測試:
-r FILE:是否存在而且 對當前用戶可讀;
-x FILE:是否存在而且 對當前用戶可執行;
-w FILE:是否存在而且 對當前用戶可寫;
4)特殊權限測試:
-u FILE:是否存在而且 擁有suid權限;
-g FILE:是否存在而且 擁有sgid權限;
-k FILE:是否存在而且 擁有sticky權限;
5)文件是否有內容:
-s FILE:是否有內容;
6)時間戳測試:
-N FILE:文件自從上一次讀操做後是否被修改過;
7)從屬關係測試:
-O FILE:當前用戶是否爲文件的屬主;
-G FILE:當前用戶是否屬於文件的屬組;
8)雙目測試:
FILE1 -ef FILE2:是否指向同一個文件系統的相同inode的硬連接;
FILE1 -nt FILE2:FILE1是否新於FILE2;
FILE1 -ot FILE2:FILE1是否舊於FILE2;
4.組合測試條件:邏輯運算
(1)第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
[ -O FILE ] && [ -r FILE ]
(2)第二種方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
[ -O FILE -a -x FILE ]
5.腳本的狀態返回值
(1)默認是腳本中執行的最後一條件命令 的狀態返回值
(2)自定義狀態退出狀態碼
exit [n]:n爲本身指定的狀態碼
注意:shell進程遇到exit時,即會終止,所以,整個腳本執行即爲結束;
6.腳本檢測&調試
bash -n /path/to/some_script 檢測腳本中的語法錯誤,不能檢出出邏輯錯誤
bash -x /path/to/some_script 調試執行,顯示過程