shell腳本學(xué)習(xí)及實(shí)踐總結(jié)

what is shell and why I should learn shell script

(what)shell腳本即用shell命令執(zhí)行一些強(qiáng)大的功能号胚。
(why)shell可以在win和linux上執(zhí)行员萍,熟練掌握腳本使我們操作計(jì)算機(jī)更靈活快速

應(yīng)用場景

  • 執(zhí)行接口自動(dòng)化框架
  • 自動(dòng)實(shí)現(xiàn)更新工程中的sdk庫
  • 自動(dòng)打包承绸、編譯江醇、發(fā)布
  • 清理磁盤
  • 總之可以使復(fù)雜命令簡單化都可以嘗試用shell腳本實(shí)現(xiàn)

shell工作原理

和Python一樣屬于腳本語言,不需要編譯娘纷,因此效率稍微差一點(diǎn)

一個(gè)hello的簡單腳本

#!/bin/bash
echo "hello shell"

將shell命令保存為test1.sh嫁审,進(jìn)入的到test1.sh所在目錄跋炕,輸入test1.sh執(zhí)行腳本如下圖所示:

hello shell.png

好了赖晶,一個(gè)最easy的shell腳本誕生了。了解更多的吧辐烂。

定義變量

myfirstshell="hello shell"
Num=1

這里有個(gè)坑遏插,定義變量的等于號=前后不能有空格,如果在python語法習(xí)慣留空格的話這里要注意纠修!

訪問變量

myfirstshell="hello shell"
num=1
echo $myfirstshell  # 帶$
echo $num
echo myfirstshell  # 不帶$
echo num

這里有個(gè)注意點(diǎn)胳嘲,訪問變量必須前綴使用$符號,否則輸出的會是變量名而不是變量值扣草!如下圖所示:

訪問變量.png

加減乘除運(yùn)算

運(yùn)算名稱 shell對應(yīng)符號
加號 +
減號 -
乘號 \*
除號 /
注意幾點(diǎn):
  • 乘號中的\是轉(zhuǎn)義符了牛,必須加上。

  • 運(yùn)算符前后必須有空格這點(diǎn)和定義變量相反辰妙!

  • shell中可執(zhí)行的代碼中需要加上``符號鹰祸,這個(gè)符號在Tab鍵上方。

  • expr用于加在表達(dá)式前執(zhí)行表達(dá)式密浑,expr和執(zhí)行內(nèi)容中間必須有空格

案例如下所示:

a=1
b=2
c=3
res=`expr $a + $b + $c`
echo "加法結(jié)果為:$res"
res=`expr $a - $b - $c`
echo "減法結(jié)果為:$res"
res=`expr $a \* $b \* $c`
echo "乘法結(jié)果為:$res"
res=`expr $c / $a / $b`
echo "除法結(jié)果為:$res"

加減乘除運(yùn)算.png

http://note.youdao.com/favicon.ico)

與或非蛙婴、求余、相等運(yùn)算

運(yùn)算名稱 shell符號
-a
-o
!
求余 %
不相等 !=
賦值 =
相等 ==

示例:

a=1
b=2
res=`expr $a % $b`  #取余運(yùn)算
echo "取余結(jié)果為$res"

b=3  # 重新賦值
echo "變量b重新賦值為了3-->$b"

if [ $a == $b ]  # 相等運(yùn)算
then
    echo "變量a與b相等"

elif [ $a != $b ]  # 不相等運(yùn)算
then
    echo "變量a與b不相等"
fi

取余運(yùn)算等.png

http://note.youdao.com/favicon.ico)

關(guān)系運(yùn)算

運(yùn)算名稱 shell符號
-eq 兩個(gè)數(shù)相等返回true
-ne 兩個(gè)數(shù)不相等返回true
-gt 左側(cè)數(shù)小于右側(cè)返回true
-lt 左側(cè)數(shù)大于右側(cè)數(shù)返回true
-ge 左側(cè)大于等于右側(cè)返回true
-lt 左側(cè)小于等于右側(cè)返回true

示例

a=1
b=1
if [ $a -eq $b ]  # 兩個(gè)數(shù)相等返回true
then
    echo "-eq兩個(gè)數(shù)相等返回true"
fi

b=2  #b賦值為2
if [ $a -ne $b ]  # 兩個(gè)數(shù)不相等返回true
then
    echo "-ne兩個(gè)數(shù)不相等返回true"
fi

a=3  # a賦值為3
if [ $a -gt $b ]
then
    echo "-gt左側(cè)數(shù)大于右側(cè)數(shù)返回true"
fi

b=4
if [ $a -lt $b ]
then
    echo "-lt左側(cè)數(shù)小于右側(cè)數(shù)返回true"
    
fi

a=5
if [ $a -ge $b ]
then
    echo "-ge左側(cè)數(shù)大于等于右側(cè)數(shù)返回true"
    
fi

b=5
if [ $a -le $b ]
then
    echo "-le左側(cè)數(shù)小于等于右側(cè)數(shù)返回true"
fi


關(guān)系運(yùn)算.png

字符串運(yùn)算

shell符號 運(yùn)算符含義
= 兩個(gè)字符串相等返回true
-z 字符串長度為0返回true
-n 字符串長度不為0true
!= 兩個(gè)字符串不相等返回true
str1="hello shell"
str2="hello shell"
if [ "$str1=$str2" ]
then
    echo "字符串相等返回true"
fi

str2="hello Python"  # 這里把str2變量重新賦值
if [ "str1 != str2" ]
then
    echo "字符串不相等返回true"
fi

str1=""
if [ "$str1 -z" ]
then
    echo "字符串長度為0返回true"
    
fi

st1="hello java"
if [ "str1 -n" ]
then
    echo "字符串長度不為0返回true"
fi

這里有個(gè)注意點(diǎn):if [ "str1 -n" ]中 的字符串運(yùn)算表達(dá)式必須加上雙引號尔破,否則會提示operator expected的錯(cuò)誤

字符串.png

文件運(yùn)算

shell符號 運(yùn)算含義
-d file 檢測文件是否是目錄街图,是浇衬,返回true
-r file 檢測文件是否可讀,是餐济,返回true
-w file 檢測文件是否可寫耘擂,是,返回true
-x file 檢測文件是否可執(zhí)行絮姆,是梳星,返回true
-s file 檢測文件是否為空,文件大小是否大于0滚朵,不為空返回true
-e file 檢測文件(或目錄)是否存在冤灾,是,返回true

示例:

filename="C:\Users\Administrator\Desktop\yangs"

if [  -d "$filename" ]  
then
    echo "-d file有目錄辕近,返回true"

fi
    
if [ -r "$filename" ]
then
    echo "-f file文件可讀,返回true"
fi

if [ -w "$filename" ]
then
    echo "-w file文件可寫韵吨,返回true"

fi

if [ -x "$filename" ]
then
    echo "-x file文件可執(zhí)行,返回true"
fi

filename="C:\Users\Administrator\Desktop\yangsc"
if [ -s "$filename" ]
then
    echo "-f file文件不為空移宅,返回true"
else:
    echo "file 為空"
fi

if [ -e "$filename" ]
then
    echo "-e file存在归粉,返回true"
else
    echo "file文件不存在"
fi

這里需要注意的是:
  • 文件路徑作為字符串變量名,if [ -e "$filename" ]必須在if判斷中加上雙引號

  • 另外一個(gè)技巧是shell的報(bào)錯(cuò)行數(shù)一般是前后2行漏峰,而不一定是報(bào)錯(cuò)的那會那行

文件運(yùn)算.png

字符串拼接及長度

方法及說明 shell語法
拼接1 str1=nameurl
拼接2 str2="nameurl"
拼接3引號間可加內(nèi)容 str3=name" "url"
拼接4 str4="name:url"
長度 ${#Val}
切片 ${Val:1:2}

這里拼接只示例第3種方式:

str1="I"
str2="shell"
str3=$str1"am"$str2  # 拼接
echo $str3

echo ${#str3}  # 獲取長度

echo ${str3:1:2}  # 獲取切片字符
拼接.png

數(shù)組

方法名稱 shell代碼
定義數(shù)組 array=(6 7 8)
獲取下標(biāo) ${array[2]}
變量引用下標(biāo)值 Var=${array[2]}
獲取數(shù)組長度 length=${#array[*]}
array1=(6 7 8)
echo "這是數(shù)組"
index=${array1[2]}
echo "這是數(shù)組的第二個(gè)下標(biāo)的值--->$index"
length=${#array1[*]}
echo "這是數(shù)組的長度--->$length"

這里的注意點(diǎn)是獲取長度和獲取下標(biāo){}大括號別忘了


數(shù)組.png

輸出程序
方法名稱 shell代碼
換行輸出 echo "str1 \nstr2"
重定向至指定文件 echo "hello shell" > xx.txt

注意點(diǎn):

  • \n后面不能有空格糠悼,否則輸出會有空格
    示例:
echo -e "hello \nshell"  # 換行輸出

echo "hello shell" > shell2.txt  # 重定向

echo `date`  # 輸出系統(tǒng)實(shí)時(shí)時(shí)間

echo用法.png

printf函數(shù)

打印功能,C語言的printf()類似
使用printf的腳本比echo更好浅乔,不會換行倔喂,所以需要手動(dòng)添加\n
示例:

printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg  
printf "%-10s %-8s %-4.2f\n" 阿米 男 67.123 
printf "%-10s %-8s %-4.2f\n" 啊超 男 78.6543 
printf "%-10s %-8s %-4.2f\n" 阿福 男 48.9876

Printf函數(shù).png

判斷語句
  • if
  • if-else
  • if-elif
  • case
a=1
b=2
c=1
if [ $a == $b ]
then
    echo "a和b相等"
elif [ $a != $c ]
then
    echo "a和c不相等"
else
    echo "類型不同"
fi

注意點(diǎn):
  • if=elif-else中只要有一個(gè)條件成立其他的都不會執(zhí)行
  • []方括號前后需要空格,否則格式報(bào)錯(cuò)
  • if和elif后面都需要加then如果寫在一行還需要加標(biāo)點(diǎn)
  • else后沒有引號
  • 語句結(jié)束必須加fi
  • case語句和If語句使用類似靖苇,只能判斷一種條件席噩,有興趣可以搜索相關(guān)資料,這里不作介紹
if語句.png

for循環(huán)

格式:

for i in data/str/array/file
do
    echo $i
done

示例

data="h e l lo shell"
for str in $data  # data為字符串時(shí)贤壁,輸出結(jié)果以空格界定單個(gè)元素
do
    echo $str
done

#data=(1 2 3)  # 錯(cuò)誤寫法
#for i in 1 2 3  

for i in 1 2 3  # 數(shù)組循環(huán)時(shí)不能在數(shù)組外加括號悼枢,并且不能用變量的形式表示數(shù)組
do
    echo $i
done
for循環(huán).png
break跳出循環(huán)
名稱 shell代碼
跳出所有循環(huán) break
跳出第N層f循環(huán) break n
跳出當(dāng)前循環(huán) continue
for i in 1 2 3  
do
    if [ $i == 3 ]
    then
        break   # 當(dāng)循環(huán)到3時(shí),跳出循環(huán)脾拆,3不會被輸出
    fi
    
    echo $i
    
done
break循環(huán).png

函數(shù)

無參數(shù)函數(shù)



test(){  # 無參數(shù)無返回值函數(shù)
    echo "無參數(shù)函數(shù)hello shell"
}
test


test1(){  #無參數(shù)有返回值
    a=1
    return $a
}
test1
res=$?
echo $res


test2(){  # 有參數(shù)有返回值函數(shù)
      echo $1
      echo $2
}

test2 2 3
函數(shù).png

重定向

#!/bin/bash
$echo res > file  #將結(jié)果寫入文件馒索,結(jié)果不會在控制臺展示,而是在文件中名船,覆蓋寫
$echo res >> file  #將結(jié)果寫入文件绰上,結(jié)果不會在控制臺展示,而是在文件中包帚,追加寫
echo input < file  #獲取輸入流

IO

名稱 代碼符號 句柄符號
標(biāo)準(zhǔn)輸入 stdin 0
標(biāo)準(zhǔn)輸出 stdout 1
stderr stderr 2


一個(gè)自動(dòng)執(zhí)行python的腳本

博主編寫了這個(gè)腳本用來跑自己寫的接口自動(dòng)化框架渔期,每執(zhí)行一次框架都會先清空日志,再將本次的執(zhí)行日志全部輸出到bash終端界面

#  每次啟動(dòng)接口自動(dòng)化框架前清空日志文件,并將最新的日志輸出到bash終端
startpy(){
    for i in 1
    do
        cd ~
        cd d:
        cd untitled
        cd untitled
        cd shopvinterface
        
        cd Report
        true > logs  
        cd ..
        
        
        cd Run
        python RunCase.py
        cd ..
        cd Report
        
        cat logs
    done
    
}
startpy

效果是不是很酷疯趟!自從會了shell腳本拘哨,媽媽再也不用擔(dān)心我要加班了。


shell腳本-用于跑自動(dòng)化框架輸出日志.png


文章部分有引用此文http://www.reibang.com/p/71cb62f08768
及菜鳥教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末信峻,一起剝皮案震驚了整個(gè)濱河市倦青,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盹舞,老刑警劉巖产镐,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異踢步,居然都是意外死亡癣亚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門获印,熙熙樓的掌柜王于貴愁眉苦臉地迎上來述雾,“玉大人,你說我怎么就攤上這事兼丰〔C希” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵鳍征,是天一觀的道長黍翎。 經(jīng)常有香客問我,道長艳丛,這世上最難降的妖魔是什么匣掸? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮质礼,結(jié)果婚禮上旺聚,老公的妹妹穿的比我還像新娘织阳。我一直安慰自己眶蕉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布唧躲。 她就那樣靜靜地躺著造挽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弄痹。 梳的紋絲不亂的頭發(fā)上饭入,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音肛真,去河邊找鬼谐丢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乾忱。 我是一名探鬼主播讥珍,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窄瘟!你這毒婦竟也來了衷佃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹄葱,失蹤者是張志新(化名)和其女友劉穎氏义,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體图云,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惯悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竣况。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吮螺。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帕翻,靈堂內(nèi)的尸體忽然破棺而出鸠补,到底是詐尸還是另有隱情,我是刑警寧澤嘀掸,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布紫岩,位于F島的核電站,受9級特大地震影響睬塌,放射性物質(zhì)發(fā)生泄漏泉蝌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一揩晴、第九天 我趴在偏房一處隱蔽的房頂上張望勋陪。 院中可真熱鬧,春花似錦硫兰、人聲如沸诅愚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违孝。三九已至,卻和暖如春泳赋,著一層夾襖步出監(jiān)牢的瞬間雌桑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工祖今, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留校坑,地道東北人拣技。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像耍目,于是被迫代替她去往敵國和親过咬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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

  • 菜鳥教程shell在線編輯器大目錄整理: 1.第一個(gè) Shell 腳本嘗試 2.Shell 變量 3.Shell ...
    中酷男閱讀 5,667評論 0 12
  • 一制妄、基本介紹 Shell Script是利用shell的功能所寫的一個(gè)程序掸绞,這個(gè)程序是使用純文本文件,將一些she...
    wuyukobe閱讀 631評論 0 4
  • [TOC] 簡介: Shell 是一個(gè)用C語言編寫的程序耕捞,它是用戶使用Linux的橋梁衔掸。Shell既是一種命令語言...
    黃海濱_x閱讀 833評論 0 2
  • 久違的晴天,家長會俺抽。 家長大會開好到教室時(shí)敞映,離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)磷斧。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22
  • 今天感恩節(jié)哎振愿,感謝一直在我身邊的親朋好友。感恩相遇弛饭!感恩不離不棄冕末。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評論 0 11