shell腳本實用技巧


別人寫命令,你也寫命令,命令知多少?
內部命令:集成在bash的命令,就是內部命令。內部命令依賴於shell類型。這些命令由shell程序識別並在shell程序內部完成運行,通常在linux系統加載運行時shell就被加載並駐留在系統內存中。內部命令是寫在bash源碼裏面的,其執行速度比外部命令快,因爲解析內部命令shell不需要創建子進程。
外部命令:外部命令是在bash之外額外安裝的,在文件系統路徑$PATH有對應的可執行程序文件,就是外部命令。在系統加載時並不隨系統一起被加載到內存中,而是在需要時纔將其調用內存。
命令別名:在管理和維護Linux系統的過程中,將會使用到大量命令,有一些很長的命令或用法經常被用到,重複而頻繁地輸入某個很長命令或用法是不可取的。這時可以使用命令別名功能將這個過程簡單化。
hash:系統初始hash表爲空,當外部命令執行時,默認會從PATH路徑下尋找該命令,找到後會將這條命令的路徑記錄到hash表中,當再次使用該命令時,shell解釋器首先會查看hash表,存在將執行之,如果不存在,將會去PATH路徑下尋找。利用hash緩存表可大大提高命令的調用速率。
function: 函數是存在內存裏的一組代碼的命名的元素。函數創建於腳本運行環境之中,並且可以執行
compound commands:在 shell 中指循環、判斷、分支、選擇、的表達式命令
命令查找方式/命令的優先級
1. 獲取一個命令執行的優先級別,至上往下
  alias
    compound commands
      function
        build_in
          hash
            $PATH
              error:command not found

練習:
驗證命令的優先級
命令解析順序
 

Shell從標準輸入或腳本中讀取的每行稱爲一個管道行,它包含一個或多個由0個或多個管道字符(|)分隔的命令。對每一個管道行,進行12個步驟的處理。
結合上面的插圖,這裏給出命令行的12個步驟。

1. 將命令行分成由固定元字符集分隔的記號 :
SPACE, TAB, NEWLINE, ; , (, ), <, >, |, & 
記號類型包括單詞,關鍵字,I/O重定向符和分號。

2.檢測每個命令的第一個記號,查看是否爲不帶引號或反斜線的關鍵字。 如果是一個開放的關鍵字,如if和其他控制結構起始字符串,function,{或(,則命令實際上爲一複合命令。shell在內部對複合命令進行處理,讀取下一個命令,並重復這一過程。如果關鍵字不是複合命令起始字符串(如then等一個控制結構中間出現的關鍵字),則給出語法錯誤信號。
3.依據別名列表檢查每個命令的第一個關鍵字。 如果找到相應匹配,則替換其別名定義,並退回第一步;否則進入第4步。該策略允許遞歸別名,還允許定義關鍵字別名。如alias procedure=function
4.執行大括號擴展 ,例如a{b,c}變成ab ac
5.如果~位於單詞開頭,用$HOME替換~。使用usr的主目錄替換~user。 
6.對任何以符號$開頭的表達式執行參數(變量)替換 
7.對形式$(string)的表達式進行命令替換 
這裏是嵌套的命令行處理。 
8.計算形式爲$((string))的算術表達式 
9.把行的參數,命令和算術替換部分再次分成單詞,這次它使用$IFS中的字符做分割符而不是步驟1的元字符集。 
10.對出現*, ?, [ / ]對執行路徑名擴展,也稱爲通配符擴展 
11. 按命令優先級表(跳過別名),進行命令查尋 
12.設置完I/O重定向和其他操作後執行該命令。


關於引用 
1. 單引號跳過了前10個步驟,不能在單引號裏放單引號
2. 雙引號跳過了步驟1~5,步驟9~10,也就是說,只處理6~8個步驟。
也就是說,雙引號忽略了管道字符,別名,~替換,通配符擴展,和通過分隔符分裂成單詞。
雙引號裏的單引號沒有作用,但雙引號允許參數替換,命令替換和算術表達式求值。可以在雙引號裏包含雙引號,方式是加上轉義符"/",還必須轉義$, `, /。

簡單備份web 腳本
#!/bin/bash
# web backup script

# Variables and Function definition
PATH=$PATH:/sbin:/usr/sbin:/usr/local/bin
FTPHOST='192.168.1.254'
FTPUSER='ftpuser'
FTPPASSWORD='ftppasswdxxx'
BACKUP_DATE=$(date -d '1 day ago' +%F)

# Program Main
cd  /var/backup
find . -type f -mtime +2 -exec rm -f {} \;
tar czf web-${BACKUP_DATE}.tar.gz /var/www/html

# Update Data File
ftp -i -n <<EOF
open ${FTPHOST}
user ${FTPUSER} ${FTPPASSWORD}
binary
mkdir ${BACKUP_DATE%-*}
cd  ${BACKUP_DATE%-*}
put web-${BACKUP_DATE}.tar.gz
bye
EOF

備份 mysql 腳本

刪除日誌腳本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章