利用shell的功能寫的一個「程序」(program),這個程序是純文本文件,能夠將一些shell的語法與命令(含外部命令)寫在裏面,搭配正則表達式、管道命令與數據流重定向。node
自動化管理、管理系統、入侵檢測、連續命令單一化、簡單的數據處理、跨平臺使用等正則表達式
#!/bin/bashshell
聲明這個文件內的語法是bash的語法,則系統會加載bash的相關配置文件來執行下面的命令bash
# Program:less
# This program shows "Hello world" in your screen.測試
# History:spa
# 2017/06/25 yc First release調試
說明該script的內容與功能、版本信息等blog
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin進程
export PATH
設置一些重要的環境變量,如PATH、LANG
......
主要的程序內容
exit 0
告知腳本的執行結果$?,可用來定製錯誤信息
絕對路徑執行/相對路徑執行/變量PATH中執行
./sh02.sh
該腳本在子進程的bash內執行。當子進程完成後,子進程內的各項變量或操做將會結束,而不會傳回到父進程中
source sh02.sh || . sh02.sh
該腳本在父進程中執行。
total=$(( $firstnu * $secnu ))
echo $(( 13 % 3 ))
test -e filename
[ "VBird Tsai" == "Vbird" ] # 空格必須
大全
測試的標誌 表明意義
1. 關於某個文件名的『文件類型』判斷,如 test -e filename 表示存在否
-e 該『文件名』是否存在?(經常使用)
-f 該『文件名』是否存在且爲文件(file)?(經常使用)
-d 該『文件名』是否存在且爲目錄(directory)?(經常使用)
-b 該『文件名』是否存在且爲一個 block device 裝置?
-c 該『文件名』是否存在且爲一個 character device 裝置?
-S 該『文件名』是否存在且爲一個 Socket 文件?
-p 該『文件名』是否存在且爲一個 FIFO (pipe) 文件?
-L 該『文件名』是否存在且爲一個連結文件?
2. 關於文件的權限檢測,如 test -r filename 表示可讀否 (但 root 權限常有例外)
-r 檢測該文件名是否存在且具備『可讀』的權限?
-w 檢測該文件名是否存在且具備『可寫』的權限?
-x 檢測該文件名是否存在且具備『可執行』的權限?
-u 檢測該文件名是否存在且具備『SUID』的屬性?
-g 檢測該文件名是否存在且具備『SGID』的屬性?
-k 檢測該文件名是否存在且具備『Sticky bit』的屬性?
-s 檢測該文件名是否存在且爲『非空白文件』?
3. 兩個文件之間的比較,如: test file1 -nt file2
-nt (newer than)判斷 file1 是否比 file2 新
-ot (older than)判斷 file1 是否比 file2 舊
-ef 判斷 file1 不 file2 是否爲同一文件,可用在判斷 hard link 的斷定上。 主要意義在斷定,兩個文件是否均指向同一個 inode !
4. 關於兩個整數之間的斷定,例如 test n1 -eq n2
-eq 兩數值相等 (equal)
-ne 兩數值不等 (not equal)
-gt n1 大於 n2 (greater than)
-lt n1 小於 n2 (less than)
-ge n1 大於等於 n2 (greater than or equal)
-le n1 小於等於 n2 (less than or equal)
5. 斷定字符串的數據
test -z string 斷定字符串是否爲 0 ?若 string 爲空字符串,則爲 true
test -n string 斷定字符串是否非爲 0 ?若 string 爲空字符串,則爲 false。注: -n 亦可省略
test str1 = str2 斷定 str1 是否等於 str2 ,若相等,則回傳 true
test str1 != str2 斷定 str1 是否不等於 str2 ,若相等,則回傳 false
6. 多條件斷定,例如: test -r filename -a -x filename
-a (and)兩情況同時成立!例如 test -r file -a -x file,則 file 同時具備 r 不 x 權限時,纔回傳 true。
-o (or)兩情況任何一個成立!例如 test -r file -o -x file,則 file 具備 r 或 x 權限時,就可回傳 true。
! 反相狀態,如 test ! -x file ,當 file 不具備 x 時,回傳 true
$0 執行的腳本文件名
$一、$2... 第一個接的參數是$一、第二個接的參數是$2 ...
$# 該腳本有多少個後接參數
$@ 表明"$1"、"$2"、"$3" ...,每一個變量都是獨立的
$* 表明"$1 $2 $3 ..."
shift 變量偏移
shift
偏移一個變量,本來的$2變爲$1,$3變爲$2 ...
shift 3
偏移三個變量,本來的$4變爲$1,$5變爲$2 ...
if [ 條件1 ] && [ 條件2 ]; then
動做1
elif [ 條件3 ]; then
動做2
else
動做3
fi
case $變量名稱 in
"第1個變量內容")
動做1
;;
"第2個變量內容")
動做2
;;
...
*)
上面的狀況都不符合的動做n
;;
esac
# 注:function必須寫到程序的最前面
# 注:function中也能夠用$一、$2 ...等,參數不在()中寫
function fname() {
程序段
}
條件成立,執行程序段
while [ 條件 ]
do
程序段
done
條件成立,終止程序段
until [ 條件 ]
do
程序段
done
for (( i=1;i<=$nu;i=i+1))
do
程序段
done
1 分隔命令
users=$(cut -d ':' -f 1 /etc/passwd)
for username in $users
2 seq獲取連續值
for sitenu in $(seq 1 100)
3 ls得到目錄下文件
for file in $(ls $dir)
sh [-nvx] script.sh
n 不執行script,僅查詢語法的問題,無問題無輸出
v 在執行script前,先將script的內容輸出到屏幕上
x 將是用到的script內容顯示到屏幕上