前言
作為一名開發(fā)者,之前有過一些使用別人腳本的經(jīng)驗(yàn),雖然一直用在用,但卻無法對(duì)腳本進(jìn)行擴(kuò)展,最近研究了一下,想將收獲與大家分享。本文旨在教會(huì)一些新手朋友認(rèn)識(shí)、編寫并使用簡(jiǎn)單的Shell腳本,有不足之處,請(qǐng)直接簡(jiǎn)書私信我
關(guān)于“Shell”和“Shell腳本”
Shell:一種用C語(yǔ)言編寫的應(yīng)用程序,用以連接用戶和操作系統(tǒng)的之間橋梁,用戶可以通過輸入命令,通過Shell解釋給操作系統(tǒng)去執(zhí)行。通俗的說,它是一個(gè)軟件,可以解釋一系列的Shell腳本操作命令
Shell腳本:一種為Shell編寫的腳本程序,我們通常稱編寫的語(yǔ)言為Shell語(yǔ)言,Shell語(yǔ)言是一種解釋性語(yǔ)言(解釋性語(yǔ)言)
Shell腳本的作用
Shell腳本可以幫助我們系統(tǒng)、自動(dòng)化的去管理和處理一些東西,舉個(gè)例子,我們?cè)谧黾勺詣?dòng)化測(cè)試的過程當(dāng)中,經(jīng)常都需要做的幾步工作
- 更新代碼(svn、git)
- 更新第三方庫(kù)(cocoapods)
- 提交代碼到測(cè)試平臺(tái)(fir、bugly)
此過程中可能會(huì)需要用到一系列的命令和一些手工操作,使用Shell腳本,我們可以讓這一系列的過程自動(dòng)執(zhí)行,無需等其中一部操作完成以后再繼續(xù)下一項(xiàng),大大節(jié)約了時(shí)間和心力。當(dāng)然以上這只是一個(gè)小小的例子,試想,如果把我們經(jīng)常都需要重復(fù)并容易忘記步驟的一些工作量的活寫成Shell,每次重復(fù)只需一條命令,且不樂哉。再者,我們將這些命令集成到腳本之中以后可以直接使用,不用擔(dān)心每次忘記某個(gè)小步驟都要去Google
Shell入門腳本示例(以Mac OS操作系統(tǒng)為例)
不同的操作系統(tǒng)所支持的解釋器可能不同,不同的應(yīng)用環(huán)境所支持的解釋器也可能不同,可使用終端命令
echo $SHELL
查看當(dāng)前所處的Shell,如何查看系統(tǒng)的SHELL類型
Mac OS默認(rèn)支持Shell的bash解釋器,此外還支持了perl、python、ruby、php、java等
這里給出一個(gè)簡(jiǎn)單的示例,你可先將代碼直接拷入體驗(yàn)一下,后面再看具體語(yǔ)法,Shell的更多的更詳細(xì)的語(yǔ)法具體參考后文
1.使用記事本創(chuàng)建一個(gè)test文件,將擴(kuò)展名改為sh,表示Shell腳本
2.在里邊寫上如下幾句測(cè)試代碼
#!/bin/bash
echo "測(cè)試Shell腳本,echo是打印命令"
VARIABLE1="定義一個(gè)變量1"
VARIABLE2="定義一個(gè)變量2"
VARIABLE3="定義一個(gè)變量3"
# 定義函數(shù)
function funcA() {
#$VARIABLE1表示取得VARIABLE1變量的值
echo "$VARIABLE1"
echo $VARIABLE1
echo ${VARIABLE1}
}
function funcB() {
echo $VARIABLE2
echo ${VARIABLE3}
}
# 調(diào)用函數(shù)
funcA
funcB
3.在終端cd到該文件目錄下,使用./test.sh
或者直接將文件拖入終端即可運(yùn)行查看效果
如遇Permission denied錯(cuò)誤,是因?yàn)槲募?quán)限問題,使用
chmod 777 test.sh
命令修改文件權(quán)限,重新執(zhí)行即可
Shell的常用語(yǔ)法
#-----------------shell腳本的常用語(yǔ)法-----------------
#---------------------------------------------------#
##### 變量 #####
#定義一個(gè)值為3的a變量
a=3,
#取a變量的值
$a、${a}
#取a變量的值,加不加“{}”都可以,推薦加上,如取出kill的值${kill}Script,如果不加編譯器會(huì)認(rèn)為是取出killScript導(dǎo)致錯(cuò)誤
#---------------------------------------------------#
##### 字符串 #####
#定義:
"this is a string"
'this is a string'
this is a string
#單引號(hào)字符串,單引號(hào)里的任何字符都會(huì)原樣輸出,單引號(hào)字符串中的變量是無效的,單引號(hào)字串中不能出現(xiàn)單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義符后也不行)
#雙引號(hào)字符串,內(nèi)部可以有變量,可以出現(xiàn)轉(zhuǎn)義字符,str="Hello, I know your are \"$your_name\"! \n"
#拼接
str1="frontstring"
str2"backstring"
str=$str1$str2 #同${str1}${str2}
#字符串長(zhǎng)度
str="abcd"
echo ${#str} #輸出長(zhǎng)度4
#提取子字符串
str="abcd"
echo ${str:1:2} #輸出bc
#查找子串
string="alibaba is a great company"
echo `expr index "$string" is`#輸出:8,這個(gè)語(yǔ)句的意思是:找出單詞is在這名話中的位置
#---------------------------------------------------#
##### 流程控制 #####
#if語(yǔ)句
#if
if condition
then
command1
command2
...
commandN
fi
#if else
if condition
then
command1
command2
...
commandN
else
command
fi
#if else-if else
if condition1
then
command1
elif condition2
command2
else
commandN
fi
#寫成一行 if condition;then command1;fi
#如果else分支沒有語(yǔ)句執(zhí)行,就不要寫這個(gè)else
#fi是if倒過來寫,表示結(jié)束,case語(yǔ)句結(jié)束標(biāo)志esac
#for循環(huán)
#普通風(fēng)格
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
#C風(fēng)格
for (( EXP1; EXP2; EXP3 ))
do
command1
command2
command3
done
#寫成一行
for var in item1 item2 ... itemN; do command1; command2… done;
#while循環(huán)
#條件循環(huán)
while condition
do
command
done
#無限循環(huán)1
while :
do
command
done
#無限循環(huán)2
while true
do
command
done
#無限循環(huán)3
for (( ; ; ))
#until語(yǔ)句
until condition
do
command
done
#case語(yǔ)句
case 變量 in
值1)
命令1
命令2
...
;;
值2|值3|值4)
命令1
命令2
...
;;
*)
命令1
命令2
...
;;
esac
#")"表?xiàng)l件、";;"表break
#---------------------------------------------------#
##### 其它說明 #####
#表示注釋,shell腳本沒有多行注釋,如有此需求,可封裝函數(shù)調(diào)用
#指明解釋器類型:"#!"是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來執(zhí)行。如shell腳本的文本開頭第一行"#!/bin/bash"、php的文本開頭"#!/usr/bin/php",后面的bash和php指明了解釋器的類型,shell的解釋器除了bash外還有sh、csh、ksh,mac os默認(rèn)支持bash,這個(gè)根據(jù)不同的系統(tǒng)所擁有的“shell應(yīng)用程序”支持的解釋器選擇,當(dāng)然,在mac os中"#!/bin/bash"可以省略
#運(yùn)行腳本:"./test.sh"表示在當(dāng)前目錄運(yùn)行test腳本,不要寫錯(cuò)格式,如果直接寫成test.sh,操作系統(tǒng)Linux會(huì)去PATH里邊尋找,PATH包含(/bin, /sbin, /usr/bin, /usr/sbin)
#打印語(yǔ)法:echo,打印信息 echo+要打印的信息,# echo abcd
#---------------------------------------------------#
參考文獻(xiàn)
Shell腳本編程30分鐘入門
Shell 編程
Advanced Bash-Scripting Guide(外文資料)
帶你走進(jìn)腳本世界,ijkplayer之【init-ios.sh】腳本分析