一篇文章學懂Shell腳本

Shell腳本,就是利用Shell的命令解釋的功能免胃,對一個純文本的文件進行解析荠藤,然后執(zhí)行這些功能,也可以說Shell腳本就是一系列命令的集合瓣履。
Shell可以直接使用在win/Unix/Linux上面啼县,并且可以調(diào)用大量系統(tǒng)內(nèi)部的功能來解釋執(zhí)行程序材原,如果熟練掌握Shell腳本沸久,可以讓我們操作計算機變得更加輕松,也會節(jié)省很多時間余蟹。

Shell應用場景

Shell能做什么

  • 將一些復雜的命令簡單化(平時我們提交一次github代碼可能需要很多步驟卷胯,但是可以用Shell簡化成一步)
  • 可以寫一些腳本自動實現(xiàn)一個工程中自動更換最新的sdk(庫)
  • 自動打包、編譯威酒、發(fā)布等功能
  • 清理磁盤中空文件夾
  • 總之一切有規(guī)律的活腳本都可以嘗試一下

Shell不能做什么

  • 需要精密的運算的時候
  • 需要語言效率很高的時候
  • 需要一些網(wǎng)絡操作的時候
  • 總之Shell就是可以快速開發(fā)一個腳本簡化開發(fā)流程窑睁,并不可以用來替代高級語言

Shell的工作原理

Shell可以被稱作是腳本語言,因為它本身是不需要編譯的兼搏,而是通過解釋器解釋之后再編譯執(zhí)行卵慰,和傳統(tǒng)語言相比多了解釋的過程所以效率會略差于傳統(tǒng)的直接編譯的語言沙郭。


最簡單的腳本:

#!/bin/bash
echo "Hello World"

只需要打開文本編輯工具佛呻,編輯成以上的樣子,然后保存成test.sh

運行該腳本:

1. cd 到該目錄下
2. chmod +x ./test.sh  #給腳本權(quán)限
3. ./test.sh  #執(zhí)行腳本
效果圖1

這樣我們便寫出來了第一個最簡單的腳本,下面我們可以嘗試著寫一些復雜的腳本病线。


Shell中的變量

myText="hello world"
muNum=100

這里面需要注意的就是吓著,“=”前后不能有空格,命名規(guī)則就和其它語言一樣了送挑。

訪問變量

myText="hello world"
muNum=100
echo $myText
echo muNum

當想要訪問變量的時候绑莺,需要使用$,否則輸出的將是純文本內(nèi)容惕耕,如下圖所示纺裁。

效果圖2

Shell中的四則運算

運算符 含義
+ 加法運算
- 減法運算
* 乘法運算
/ 除法運算

例子程序

#!/bin/bash
echo "Hello World !"
a=3
b=5
val=`expr $a + $b`
echo "Total value : $val"

val=`expr $a - $b`
echo "Total value : $val"

val=`expr $a \* $b`
echo "Total value : $val"

val=`expr $a / $b`
echo "Total value : $val"

這里面需要注意的就是,定義變量的時候“=”前后是不能有空格的司澎,但是進行四則運算的時候運算符號前后一定要有空格欺缘,乘法的時候需要進行轉(zhuǎn)義。

效果圖3.png

其它運算符 =挤安、==谚殊、!=、蛤铜!嫩絮、-o、-a

運算符 含義
% 求余
== 相等
= 賦值
!= 不相等
!
-o
-a

例子程序

a=3
b=5
val=`expr $a / $b`
echo "Total value : $val"

val=`expr $a % $b`
echo "Total value : $val"

if [ $a == $b ]
then
   echo "a is equal to b"
fi
if [ $a != $b ]
then
   echo "a is not equal to b"
fi
效果圖4

關(guān)系運算符

運算符 含義
-eq 兩個數(shù)相等返回true
-ne 兩個數(shù)不相等返回true
-gt 左側(cè)數(shù)大于右側(cè)數(shù)返回true
-It 左側(cè)數(shù)小于右側(cè)數(shù)返回true
-ge 左側(cè)數(shù)大于等于右側(cè)數(shù)返回true
-le 左側(cè)數(shù)小于等于右側(cè)數(shù)返回true

例子程序

#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -ne $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -gt $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -lt $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -ge $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -le $b ]
then
   echo "true"
else
   echo "false"
fi

效果圖5

字符串運算符

運算符 含義
= 兩個字符串相等返回true
!= 兩個字符串不相等返回true
-z 字符串長度為0返回true
-n 字符串長度不為0返回true

運算符 含義
-d file 檢測文件是否是目錄围肥,如果是剿干,則返回 true
-r file 檢測文件是否可讀,如果是穆刻,則返回 true
-w file 檢測文件是否可寫怨愤,如果是,則返回 true
-x file 檢測文件是否可執(zhí)行蛹批,如果是撰洗,則返回 true
-s file 檢測文件是否為空(文件大小是否大于0篮愉,不為空返回 true
-e file 檢測文件(包括目錄)是否存在,如果是差导,則返回 true

字符串

#!/bin/sh
mtext="hello"  #定義字符串
mtext2="world"
mtext3=$mtext" "$mtext2  #字符串的拼接
echo $mtext3  #輸出字符串
echo ${#mtext3}  #輸出字符串長度
echo ${mtext3:1:4}  #截取字符串

效果圖6

數(shù)組

#!/bin/sh
array=(1 2 3 4 5)  #定義數(shù)組
array2=(aa bb cc dd ee)  #定義數(shù)組
value=${array[3]}  #找到某一個下標的數(shù)试躏,然后賦值
echo $value  #打印
value2=${array2[3]}  #找到某一個下標的數(shù),然后賦值
echo $value2  #打印
length=${#array[*]}  #獲取數(shù)組長度
echo $length

效果圖7

輸出程序

echo

#!/bin/sh
echo "hello world"  
echo hello world  

text="hello world"
echo $text

echo -e "hello \nworld"  #輸出并且換行

echo "hello world" > a.txt  #重定向到文件

echo `date`  #輸出當前系統(tǒng)時間

效果圖8

printf

同c語言设褐,就不過多介紹了


判斷語句

  • if
  • if-else
  • if-elseIf
  • case

#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
   echo "true"
fi


if [ $a == $b ]
then
   echo "true"
else
   echo "false"
fi


if [ $a == $b ]
then
   echo "a is equal to b"
elif [ $a -gt $b ]
then
   echo "a is greater than b"
elif [ $a -lt $b ]
then
   echo "a is less than b"
else
   echo "None of the condition met"
fi

效果圖9

test命令

test $[num1] -eq $[num2]  #判斷兩個變量是否相等
test num1=num2  #判斷兩個數(shù)字是否相等
參數(shù) 含義
-e file 文件存在則返回真
-r file 文件存在并且可讀則返回真
-w file 文件存在并且可寫則返回真
-x file 文件存在并且可執(zhí)行則返回真
-s file 文件存在并且內(nèi)容不為空則返回真
-d file 文件目錄存在則返回真

for循環(huán)

#!/bin/sh

for i in {1..5}
do
    echo $i
done


for i in 5 6 7 8 9
do
    echo $i
done


for FILE in $HOME/.bash*
do
   echo $FILE
done

效果10

while循環(huán)

#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 5 ]
do
    COUNTER=`expr $COUNTER + 1`
    echo $COUNTER
done

echo '請輸入颠蕴。。助析。'
echo 'ctrl + d 即可停止該程序'
while read FILM
do
    echo "Yeah! great film the $FILM"
done


以上是while循環(huán)的兩種用法犀被,第一種是比較常規(guī)的,執(zhí)行循環(huán)外冀,然后每次都把控制的數(shù)加1寡键,就可以讓while循環(huán)有退出的條件了。
第二種是用戶從鍵盤數(shù)據(jù)雪隧,然后把用戶輸入的文字輸出出來西轩。


跳出循環(huán)

break  #跳出所有循環(huán)
break n  #跳出第n層f循環(huán)
continue  #跳出當前循環(huán)

函數(shù)

#!/bin/sh

sysout(){
    echo "hello world"
}

sysout

定義一個沒有返回值的函數(shù),然后調(diào)用該函數(shù)

#!/bin/sh

test(){

    aNum=3
    anotherNum=5
    return $(($aNum+$anotherNum))
}
test
result=$?
echo $result

定義一個有返回值的函數(shù)脑沿,調(diào)用該函數(shù)藕畔,輸出結(jié)果

效果圖11
#!/bin/sh

test(){
    echo $1  #接收第一個參數(shù)
    echo $2  #接收第二個參數(shù)
    echo $3  #接收第三個參數(shù)
    echo $#  #接收到參數(shù)的個數(shù)
    echo $*  #接收到的所有參數(shù)
}

test aa bb cc

定義了一個需要傳遞參數(shù)的函數(shù)

效果圖12

重定向

$echo result > file  #將結(jié)果寫入文件,結(jié)果不會在控制臺展示庄拇,而是在文件中注服,覆蓋寫
$echo result >> file  #將結(jié)果寫入文件,結(jié)果不會在控制臺展示措近,而是在文件中溶弟,追加寫
echo input < file  #獲取輸入流

寫一個自動輸入命令的腳本

自動提交github倉庫的腳本

#!/bin/bash
echo "-------Begin-------"
git add .
git commit -m $1
echo $1
git push origin master
echo "--------End--------"

效果圖13

以上便是我對shell知識的總結(jié),歡迎大家點心熄诡,評論可很,一起討論~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凰浮,隨后出現(xiàn)的幾起案子我抠,更是在濱河造成了極大的恐慌,老刑警劉巖袜茧,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菜拓,死亡現(xiàn)場離奇詭異,居然都是意外死亡笛厦,警方通過查閱死者的電腦和手機纳鼎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱鄙,你說我怎么就攤上這事劝贸。” “怎么了逗宁?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵映九,是天一觀的道長。 經(jīng)常有香客問我瞎颗,道長件甥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任哼拔,我火速辦了婚禮引有,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倦逐。我一直安慰自己譬正,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布僻孝。 她就那樣靜靜地躺著导帝,像睡著了一般守谓。 火紅的嫁衣襯著肌膚如雪穿铆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天斋荞,我揣著相機與錄音荞雏,去河邊找鬼。 笑死平酿,一個胖子當著我的面吹牛凤优,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜈彼,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼筑辨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幸逆?” 一聲冷哼從身側(cè)響起棍辕,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎还绘,沒想到半個月后楚昭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡拍顷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年抚太,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡尿贫,死狀恐怖电媳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庆亡,我是刑警寧澤匆背,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站身冀,受9級特大地震影響钝尸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搂根,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一珍促、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剩愧,春花似錦猪叙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锦积,卻和暖如春芒帕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丰介。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工背蟆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哮幢。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓带膀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橙垢。 傳聞我的和親對象是個殘疾皇子垛叨,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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

  • Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析柜某,然后執(zhí)行這些功能嗽元,也可以說Shel...
    我在成熟你在變老閱讀 496評論 0 3
  • 一,shell題記 不懂shell的程序員不是好程序員莺琳,學習shell是為了自動化还棱,使用自動化可以非常有效的提高工...
    架構(gòu)師小秘圈閱讀 8,725評論 3 70
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,168評論 2 33
  • (二) 對很多東西都只是一時興起,三分鐘的熱度而已惭等。 九九上初中那年珍手,是08年,因為地震提前放了很長...
    Amanda33閱讀 163評論 0 0
  • 問:我是個旅游批發(fā)商,處在傳遞價值的環(huán)節(jié)琳要,現(xiàn)在消費升級寡具,碰到?jīng)_擊,應該朝哪個方向走稚补? 劉潤:這個問題很有共性童叠,我想...
    benny的航海歷險記閱讀 939評論 0 0