shell指令碼實用技巧

2021-10-03 18:53:24 字數 2229 閱讀 3573

別人寫命令,你也寫命令,命令知多少?

內部命令:整合在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,變成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='ftppasswd***'

backup_date=$(date -d '1 day ago' +%f)

# program main

cd  /var/backup

find . -type f -mtime +2 -exec rm -f {} \;

tar czf web-$.tar.gz /var/www/html

# update data file

ftp -i -n 《備份 mysql 指令碼

刪除日誌指令碼

Linux 實用技巧

值得一提的是vim是慈善軟體 charityware 如有贊助或評比得獎,所得將全部救助烏干達孤兒,軟體使用是免費的,歡迎手頭有點閒錢的使用者捐款贊助,如果沒銀子也沒關係,至少當有評比活動時 有獎金可拿的那種 應用技巧一 快速注釋 1 連續行注釋 使用vim vi編輯shell指令碼,在進行除錯的時...

vim實用技巧

以前習慣於eclipse,sourceinsight,vim用的不是很熟悉,在現在的公司中,vim是一種必備的技巧,慢慢,從難受到得心應手,vim還是比較好用的,下面記錄一點實用的技巧 1 vim ctags cscope是乙個強大的比擬於sourceinsight的字元介面的工具 2 ctrl 跳...

SQL PowerDesigner實用技巧

1,name code的轉變 我們設計資料庫的時候,軟體會自動把name的資料複製到code中,但我想設計時直接把 欄位名稱與含義寫在name中,這樣對設計時間的浪費是很少的 如我們以 欄位名 中文含義 來寫name,讓軟體自動複製前面的 欄位名到 code中.讓中文函義 自動複製到 comment...