1.1 什麼是shell腳本
shell腳本是一些命令的集合。shell腳本能幫助我們很方便地管理服務器,我們可以指定一個任務計劃,定時去執行某個shell腳本以滿足需求。
1.1.1 shell腳本的創建和執行
shell腳本通常都以 .sh爲後綴名。如圖所示,腳本文件first.sh的第1行要以 #!/bin/bash 開頭,表示文件使用的是bash語法。#表示註釋,後面跟一些該腳本的相關注釋內容,以及作者、創建日期或者版本等。
下面執行這個腳本,如圖所示。
其實shell腳本還有一種執行方法,使用該方法運行shell腳本的前提是腳本本身有執行權限,所以需要給腳本加一個x權限。
另外,使用sh命令執行一個shell腳本時,可以加 -x 選項來查看這個腳本的執行過程,有利於我們調試這個腳本,如圖所示。
如果腳本里打錯字符,執行命令時會提示你哪行出了錯誤,然後輸入編輯命令的時候,後面+錯誤的行數,光標會自動跳到錯誤的行數。(例如,第7行錯了,命令:vi first.sh +7)
1.1.2 命令date
date命令在shell腳本中最常用的幾個用法如下。- date +%Y:表示以四位數字格式打印年份
- date +%y:表示以兩位數字格式打印年份
- date +%m:表示月份
- date +%d:表示日期
- date +%H:表示小時
- date +%M:表示分鐘
- date +%S:表示秒
- date +%w:表示星期。結果顯示0則表示週日
例如:
1.2 shell腳本中的變量
定義變量的格式爲:“變量名=變量的值”。在腳本中引用變量需要加上符號$。下面編寫一個與變量相關的腳本,如圖。
上圖圈起來的地方爲反引號,它的作用時將引號中的字符串當成shell命令執行,返回命令的執行結果。d和d1在腳本中作爲變量出現。sleep 2相當於一個定時器,意思就是等待兩秒然後返回值。下面來看看該腳本的執行結果,如圖。
1.2.1 數學運算
命令如下
數學計算要用 [ ] 括起來,並且前面要加符號$。sum=那裏不要有空格,不然會出錯。該腳本的結果如下:
1.2.2 和用戶交互
示例腳本如下:
read命令用於和用戶交互,它把用戶輸入的字符串作爲變量值。該腳本的執行過程如下:
可以加上 -x 選項來看看這個執行過程:
1.2.3 shell腳本預設變量
有時我們會用到類似 /etc/init.d/iptables restart 的命令,前面的 /etc/init.d/iptables 文件其實就是一個shell腳本。後面爲什麼可以跟 restart 字符串?這就涉及shell腳本的預設變量。實際上,shell腳本在執行時,後面可以跟一個或者多個參數。例如下面的腳本:
該腳本的執行結果如下:
腳本中的$1和$2就是shell腳本的預設變量。本例中,$1和$2的值就是在執行時分別輸入的2和4,$1就是腳本的第一個參數,$2就是腳本的第二個參數,當然一個shell腳本的預設變量是沒有限制的。
另外還有一個$0,它代表腳本本身的名字。,如圖。
該腳本的執行結果如下:
1.3 shell腳本中的邏輯判斷
在shell腳本中,我們同樣可以使用if邏輯判斷。1.3.1 不帶else
具體格式如下:if 判斷語句;then
command
fi
示例腳本如下:
if1.sh中出現了 ((a<60)) 這樣的形式,就是shell腳本中特有的格式,只用一個小括號或者不用都會報錯。
該腳本的執行結果如下:
1.3.2 帶有else
具體格式如下:if 判斷語句;then
command
else
command
fi
示例腳本如下:
該腳本的執行結果如下:
腳本if2.sh和腳本if1.sh唯一區別是:如果輸入大於或等於60的數字會有提示。
1.3.3 帶有elif
具體格式如下:if 判斷語句1;then
command
elif 判斷語句2;then
command
else
command
fi
示例腳本如下:
這裏的&&表示 “ 並且 ” 的意思,也可以使用 | | 表示 “ 或者 ”。
該腳本的執行結果如下:
以上只是簡單介紹了if語句的結構。判斷數值大小除了可以用 (( )) 的形式外,還可以使用 [ ]。但是不能使用>、<、=這樣的符號了,要使用 -lt(小於)、-gt(大於)、-le(小於等於)、-ge(大於等於)、-eq(等於)、-ne(不等於)。
示例代碼如下:
# a=10; if [ $a -lt 5 ]; then echo ok; fi
# a=10; if [ $a -gt 5 ]; then echo ok; fi
ok
# a=10; if [ $a -ge 10 ]; then echo ok; fi
ok
# a=10; if [ $a -eq 10 ]; then echo ok; fi
ok
# a=10; if [ $a -ne 10 ]; then echo ok; fi
下面是在if語句中使用&&和 | | 的情況,示例代碼如下:
# a=10; if [ $a -lt 1 ] || [$a -gt 5 ]; then echo ok; fi
ok
# a=10; if [ $a -gt 1 ] || [$a -lt 10 ]; then echo ok; fi
ok
1.3.4 和文檔相關的判斷
shell腳本中if還經常用於判斷文檔的屬性,比如判斷是普通文件還是目錄,判斷文件是否有讀、寫、執行權限等。if常用的選項有以下幾個。
- -e:判斷文件或目錄是否存在
- -d:判斷是不是目錄以及是否存在
- -f:判斷是不是普通文件以及是否存在
- -r:判斷是否有讀權限
- -w:判斷是否有寫權限
- -x:判斷是否可執行
使用if判斷時的具體格式如下:
if [ -e filename ]; then
command
fi
示例代碼如下:
因爲/home/是目錄而非文件,所以並不會顯示ok。其他示例如下所示:
1.3.5 case邏輯判斷
在shell腳本中,除了用if開判斷邏輯外,還有一種常用的方式——case。其具體格式如下:case 變量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
;;
esac
上面的結構中,不限制value的個數,*代表其他值。下面寫一個判斷輸入數值是奇數還是偶數的腳本,如圖。
腳本中$a的值爲1或0,其執行結果如下:
1.4 shell腳本中的循環
常用到的循環有for循環和while循環。1.4.1 for循環
先寫個簡單的for循環腳本,如圖。
腳本中的seq 1 5表示從1到5的一個序列。該腳本的執行結果如下:
通過這個腳本可以看到for循環二點基本結果,具體格式如下:
for 變量名 in 循環的條件;do
command
done
這裏 “循環的條件” 可以是一組字符串或者數字(用一個或者多個空格隔開),也可以是一條命令的執行結果。命令如下:
“循環的條件” 還可以引用系統命令的執行結果(如seq 1 5),但必須用反引號括起來。示例命令如下:
1.4.2 while循環
具體格式如下:while 條件; do
command
done
示例腳本如下:
該腳本的執行結果如下:
另外,可以用一個冒號代替循環條件,這樣可以做到死循環。示例代碼如下:
while :; do
command
sleep 3
done
1.5 shell腳本中的函數
shell腳本中的函數就是先把一段代碼整理到一個小單元中,並個這個小單元命名,當用到這段代碼時直接調用這個小單元的名字即可。有時候腳本中的某段代碼總是重複使用,如果寫成函數,每次用到時直接用函數名代替即可。
寫個簡單的帶有函數功能的shell腳本,示例腳本如下:
該腳本的執行結果如下:
func.sh中的sum()爲自定義的函數。在shell腳本中函數的格式如下:
function 函數名()
{
command1
command2
}
注意的是,shell腳本中,函數一定要寫在最前面,不能出現在中間或者最後。
1.6 shell腳本中的中斷和繼續
1.6.1 break
break用在循環中,不管是for或者while都可以。在腳本中使用它,退出該層循環。之所以說層,是因爲有時我們會用到嵌套循環,大循環裏面還有小循環,而break僅是退出那一層循環,它的上層循環不受影響。
腳本中,本意是要把1~5數值賦予 i,當 i 等於3時,會跳出循環,後面的4和5都不會再執行,腳本的執行結果如下:
1.6.2 continue
continue也是使用在循環中的,但和break不同的是,當shell腳本中遇到continue時,結束的不是整個循環,而是本次循環。具體示例如下:
腳本執行結果如下:
當 i 等於3時候,出現了continue,所以結束本次循環,continue後面的語句不再執行,繼續下一次循環。
1.6.3 exit
exit的用法跟break、continue相似。它的作用範圍更大,直接退出整個shell腳本。示例腳本如下:
腳本執行結果如下: