Shell腳本初識(shí)

前言

作為一名開發(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)常都需要做的幾步工作

  1. 更新代碼(svn、git)
  2. 更新第三方庫(kù)(cocoapods)
  3. 提交代碼到測(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】腳本分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,530評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,759評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,204評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,415評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,955評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,675評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容