linux學習shell腳本

1. 什么是shell script

shell script 是利用 shell 的功能所寫的一個『程序 (program)』,這個程序是使用純文本文件假栓,將一些 shell 的語法與指令(含外部指令)寫在里面猾漫, 搭配正規(guī)表示法点晴、管線命令與數(shù)據(jù)流重導向等功能,以達到我們所想要的處理目的悯周。
簡單的說粒督, shell script 就像是早期 DOS 年代的批處理文件 (.bat) ,最簡單的功能就是將許多指令匯整寫在一起禽翼, 讓使用者很輕易的就能夠 one touch 的方法去處理復雜的動作 (執(zhí)行一個文件 "shell script" 坠陈,就能夠一次執(zhí)行多個指令)萨惑。 而且 shell script 更提供數(shù)組、循環(huán)仇矾、條件與邏輯判斷等重要功能庸蔼,讓用戶也可以直接以 shell 來撰寫程序,而不必使用類似 C 程序語言等傳統(tǒng)程序撰寫的語法呢贮匕!
我的理解:
是一個程序姐仅,通過這個程序的語法,你可以操作linux系統(tǒng)上的資源刻盐。比如我們發(fā)布服務(wù)掏膏,需要設(shè)置環(huán)境變量,清理目錄敦锌,上傳jar包等操作馒疹。

2. 為什么要學習

2.1 自動化管理的重要依據(jù)

管理一部主機真不是件簡單的事情,每天要進行的任務(wù)就有:查詢登錄檔乙墙、追蹤流量颖变、監(jiān)控用戶使用主機狀態(tài)、主機各項硬設(shè)備狀態(tài)听想、 主機軟件更新查詢腥刹、更不要說得應付其他使用者的突然要求了。而這些工作的進行可以分為: (1)自行手動處理汉买,或是 (2)寫個簡單的
程序來幫你每日『自動處理分析』這兩種方式衔峰,你覺得哪種方式比較好? 當然是讓系統(tǒng)自動工作比較好蛙粘,對吧垫卤!呵呵~這就得要良好的 shell script 來幫忙的啦!

2.2 連續(xù)指令單一化

其實出牧,對于新手而言穴肘, script 最簡單的功能就是:『匯整一些在 command line 下達的連續(xù)指令,將他寫入 scripts 當中崔列,而由直接執(zhí)行 scripts 來啟動一連串的 command line 指令輸入!』例如: 防火墻連續(xù)規(guī)則 (iptables)旺遮,開機加載程序的項目 (就是在 /etc/rc.d/rc.local 里頭的數(shù)據(jù)) 赵讯,等等都是相似的功能啦! 其實耿眉,說穿了边翼,如果不考慮 program 的部分,那么 scripts 也可以想成『僅是幫我們把一大串的指令匯整在一個文件里面鸣剪, 而直接執(zhí)行該文件就可以執(zhí)行那一串又臭又長的指令段组底!』就是這么簡單啦丈积!

3. script 的執(zhí)行方式差異

3.1 利用直接執(zhí)行的方式來執(zhí)行 script

當使用直接指令下達 (不論是絕對路徑/相對路徑還是 ${PATH} 內(nèi)),或者是利用 bash (或 sh) 來下達腳本時债鸡, 該 script 都會使用一個新的 bash 環(huán)境來執(zhí)行腳本內(nèi)的指令江滨!也就是說,使用這種執(zhí)行方式時厌均, 其實 script 是在子程序的 bash 內(nèi)執(zhí)行的唬滑!


3.2 利用 source 來執(zhí)行腳本:在父程序中執(zhí)行

該 script 都會使用原來的bash 環(huán)境來執(zhí)行腳本內(nèi)的指令!這也是為啥你不注銷系統(tǒng)而要讓某些寫入 ~/.bashrc 的設(shè)定生效時棺弊,需要使用『 source ~/.bashrc 』而不能使用『 bash ~/.bashrc 』


image.png

4. shell腳本判斷語法

4.1 test命令

test -e /dmtsai && echo "exist" || echo "Not exist"
&& 左邊成功右邊就執(zhí)行晶密,否則就不執(zhí)行
|| 左邊f(xié)alse右邊就執(zhí)行,否則不執(zhí)行
-e 表示檔案是否存在模她,無論是文件還是文件夾形式稻艰。還有其他參數(shù)

4.1.1 關(guān)于某個檔名的『文件類型』判斷

test -e file
-e 該『檔名』是否存在?
-f 該『檔名』是否存在侈净,且為文件
-d 該『檔名』是否存在尊勿,且為目錄

4.1.2 關(guān)于文件權(quán)限偵測

test -r file
-r 該文件是否存在且具有讀取權(quán)限
-w 該文件是否存在且具有寫入權(quán)限
-x 該文件是否存在且具有執(zhí)行權(quán)限

4.1.3 兩個文件之間的比較

test file1 -nt file2
-nt (newer than) file1文件比file2文件新
-ot (older than)file1文件比file2文件舊

4.1.4 兩個整數(shù)之間的判斷

test n1 -eq n2
-eq 兩值相等
-ne 兩值不等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2

4.1.5 判定字符串的數(shù)據(jù)

test -z string 判斷字符串是否為空,如果是用狱,true
test -n string 判斷字符串是否不為空运怖,如果不為空,true
test str1 == str2 判斷兩字符串是否相等
test str1 != str2 判斷兩字符串不等

4.1.6 多重條件判斷

test -r filename -a -x filename file同時具有r和x權(quán)限才為真
test -r filename -o -x filename file具有r或者x權(quán)限就為真

4.1.7 示例

test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0

4.2 判斷符號 [ ]

示例:
[ $HOME" == "$MAIL" ]

  1. 在中括號 [] 內(nèi)的每個組件都需要有空格鍵來分隔夏伊;
  2. 在中括號內(nèi)的變數(shù)摇展,最好都以雙引號括號起來;
  3. 在中括號內(nèi)的常數(shù)溺忧,最好都以單或雙引號括號起來
    示例:
    [ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0

4.3 腳本入?yún)⒄f明

我們知道命令可以帶參數(shù)咏连,比如 ls -al。al是參數(shù)鲁森。 那么腳本是否可以帶參數(shù)祟滴,比如 sh ***.sh start. start是參數(shù)。答案啊可以的歌溉,那么腳本里面如何識別參數(shù)呢
假設(shè)命令為:sh home.sh param1 param2 param3
腳本里面
$0 代表腳本內(nèi)容 home.sh
$1 代表第一個參數(shù) param1
$2 代表第二個參數(shù) param2
$# 代表參數(shù)的個數(shù)垄懂,這里是3

4.2 if 判斷命令

格式如下:
多個條件判斷 (if ... elif ... elif ... else) 分多種不同情況執(zhí)行
if [ 條件判斷式一 ]; then
當條件判斷式一成立時,可以進行的指令工作內(nèi)容痛垛;
elif [ 條件判斷式二 ]; then
當條件判斷式二成立時草慧,可以進行的指令工作內(nèi)容;
else
當條件判斷式一與二均不成立時匙头,可以進行的指令工作內(nèi)容漫谷;
fi
示例:
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
else
echo "I don't know what your choice is"
fi

4.3 while 循環(huán)命令

while [ condition ] <==中括號內(nèi)的狀態(tài)就是判斷式
do <==do 是循環(huán)的開始!
程序段落
done <==done 是循環(huán)的結(jié)束
示例:
while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

4.4 shell script 的追蹤與 debug

sh [-nvx] scripts.sh
選項與參數(shù):
-n :不要執(zhí)行 script蹂析,僅查詢語法的問題舔示;
-v :再執(zhí)行 sccript 前碟婆,先將 scripts 的內(nèi)容輸出到屏幕上;
-x :將使用到的 script 內(nèi)容顯示到屏幕上惕稻,這是很有用的參數(shù)竖共!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缩宜,隨后出現(xiàn)的幾起案子肘迎,更是在濱河造成了極大的恐慌,老刑警劉巖锻煌,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓布,死亡現(xiàn)場離奇詭異,居然都是意外死亡宋梧,警方通過查閱死者的電腦和手機匣沼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捂龄,“玉大人释涛,你說我怎么就攤上這事【氩祝” “怎么了唇撬?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長展融。 經(jīng)常有香客問我窖认,道長,這世上最難降的妖魔是什么告希? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任扑浸,我火速辦了婚禮,結(jié)果婚禮上燕偶,老公的妹妹穿的比我還像新娘喝噪。我一直安慰自己,他們只是感情好指么,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布酝惧。 她就那樣靜靜地躺著,像睡著了一般伯诬。 火紅的嫁衣襯著肌膚如雪晚唇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天姑廉,我揣著相機與錄音缺亮,去河邊找鬼翁涤。 笑死桥言,一個胖子當著我的面吹牛萌踱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号阿,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼并鸵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扔涧?” 一聲冷哼從身側(cè)響起园担,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枯夜,沒想到半個月后弯汰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡湖雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年咏闪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摔吏。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸽嫂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出征讲,到底是詐尸還是另有隱情据某,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布诗箍,位于F島的核電站癣籽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扳还。R本人自食惡果不足惜才避,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氨距。 院中可真熱鬧桑逝,春花似錦、人聲如沸俏让。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽首昔。三九已至寡喝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勒奇,已是汗流浹背预鬓。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赊颠,地道東北人格二。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓劈彪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顶猜。 傳聞我的和親對象是個殘疾皇子沧奴,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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