標籤:style io color ar os 使用 sp for strong
下面是最近學習shell script的一些知識點總結
***部落格園-邦邦醬好***
1.介紹
shell是一個文字介面,讓我們與系統溝通。shell script就是針對shell所寫的指令碼。
它就像是早期dos年代的批次檔.bat,所以shell script可以看成是一個程式也可以是一個批處理指令碼,它利用shell與相關工具指令,不需要編譯即可執行,可以協助系統管理員快速的管理好主機。
shell script用在系統管理上面是很好的一項工具,但是用在處理大量數值運算上,就不夠好了,因為Shell scripts的速度較慢,且使用的CPU資源較多,造成主機資源的分配不良
2.簡單的文法
test.sh
#!/bin/bash #宣告這個文檔內的文法使用bash的文法,程式被執行時,載入bash的相關設定檔
# 以#開頭的是批註
# 接著說明script的:1.內容與功能 2.版本資訊 3.作者與連絡方式 4.建檔日期 5.記錄 等等
echo -e "Hello World! \a \n"
exit 0 #中斷程式,並回傳一個數值給系統
3.對談式指令碼:變數內容由使用者決定
#!/bin/bash
read -p "Please enter your firstname:" firstname
read -p "Please enter your lastname:" lastname
echo -e "\nYour full name is:$firstname $lastname"
4.指令碼執行方式
(1)利用sh/bash來執行指令碼:在子程式中執行
-->當子程式完成後,在子程式內的各項變數或動作將會結束而不會傳回到父程式中
(2)利用source/.來執行指令碼:在父程式中執行
-->指令碼在父程式中執行,各項變數或動作仍然留在父程式中
查看檔案許可權:ls -l test.sh
如果不夠許可權,可以這樣賦予執行的許可權:chmod a+x test.sh
(要取得root賬戶:su root)
5.利用test命令的測試功能
(1)檔案類型的判斷
test [-efd] file
-e:該檔名是否存在
-f:該檔名是否存在且為file類型
-d:該檔案名稱是否存在且為diretory類型
(2)文檔許可權的判斷
test [-rwx] file
-r:該檔名是否存在且具有可讀許可權
-w:該檔名是否存在且具有可寫入權限
-x:該檔名是否存在且具有可執行許可權
--->test -e /dmtsal && echo "exist" || echo "not exist"
(3)兩個文檔之間的比較
test file1 -nt file2
-nt:判斷file1是否newer than file2
-ot:判斷file1是否older than file2
-ef:判斷兩個文檔是否指向同一個inode
(4)兩個整數之間的比較
test n1 -eq n2
-eq:equal
-ne:not equal
-gt:greater than
-lt:less than
-ge:greater than or equal
-le:less than or equal
(5)字串的判斷
test -z string:string是否為空白
test -n string:string是否為非空
test str1 = str2:str1是否等於str2
test str1 != str2:str1是否不等於str2
(6)多重條件判斷
test -r filename -a -x filename
-a:and,兩種情況同時成立
-o:or,兩種情況之一成立
!:反相狀態,如test ! -x file,當file不具有x時,返回true
6.利用判斷符合[]
(1)比如[ -z "$HOME" ];echo $?
注意:使用[]來進行判斷時中括弧內的每個組件都要有空格符分隔,變數或常數要用雙引號括起來:
[ "$HOME" == "$MAIL" ]
(2)中括弧常用在條件判斷式中
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0
也可以寫成:["$yn" == "Y"] || ["$yn" == "y"]
7.shell script的預設變數($0,$1)
filename opt1 opt2 opt3 opt4
執行的指令碼filename對於$0這個變數,op1對應$1,opt2對應$2。。。
除此以外,還有以下特殊變數:
$#:代表後接的參數個數
[email protected]:代表["$1" "$2" "$3" "$4"]
$*:代表["$1 $2 $3 $4"]
8.shift:造成參數變數號碼的位移
vi test.sh s1 s2 s3 s4 s5 s6
echo "shift前共有6個變數"
shift
echo "shift後共有5個變數,分別是s2 s3 s4 s5 s6"
shift 3
echo "shift後共有2個變數,分別是s5 s6"
9.條件判斷式(若等號兩邊有空格,必須[(空格)條件(空格)])
if [條件判斷式]; then
條件成立時的命令內容
fi #結束if語句
10.複製條件判斷式
(1)
if [條件判斷式一]; then
條件成立時的命令內容
else
條件不成立時的命令內容
fi #結束if語句
(2)
if [條件判斷式一]; then
條件一成立時的命令內容
elif [條件判斷式二]; then
條件二成立時的命令內容
else
條件一二不成立時的命令內容
fi #結束if語句
10.利用case...in...esac判斷
case $variablename in
"first-variable-content")
操作
;;
"second-variable-content")
操作
;;
*)
操作
;;
esac
11.函數function功能
由於shell script的執行方式是由上到下,由左到右,所以function的設定一定要在程式的最前面,這樣在執行時才能被找到。
function fname(){
程式段
}
如:
function printit(){
echo "Your choice is $1"
}
printit 2
--->結果是:Your choice is 2
(這裡的$1是指函數調用時後接的參數,跟呼叫指令碼時:./test.sh para1的$1是不一樣的)
12.迴圈
while [ 條件判斷式 ]
do
程式段
done
當condition成立時,就進行迴圈,直到條件不成立
或者
until [ condition ]
do
程式段
done
當condition成立時,就終止迴圈,否則持續進行迴圈
或者
for var in con1 con2 con3 ...
do
程式段
done
如:
network="192.168.1"
for sitenu in $(seq 1 100) #seq為sequence連續的縮寫
do
ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0|result=1
if [ "result" == 0 ];then
echo "Server ${network}.${sitenu} is Up"
else
echo "Server ${network}.${sitenu} is Down"
fi
done
或者
for...do...done的數值處理
for(( 初始值;限制值;執行步階 ))
do
程式段
done
如:
s=0
for((i=1;i<100;i=i+1))
do
s=$(($s+$i))
done
13.shell script的追蹤與debug
sh [-nvx] scripts.sh
-n:不要執行指令碼,僅查詢文法的問題
-v:在執行指令碼前,先輸出指令碼的內容
-x:將使用到的指令碼內容顯示到螢幕上
linux--shell script