shell腳本隨筆

一? shell基礎(chǔ)

1.? ?Shell 程序本身的功能是很弱的键痛,比如文件操作育八、輸入輸出补箍、進程管理等都得依賴內(nèi)核改执。我們運行一個命令,大部分情況下 Shell 都會去調(diào)用內(nèi)核暴露出來的接口坑雅,這就是在使用內(nèi)核辈挂,只是這個過程被 Shell 隱藏了起來,它自己在背后默默進行裹粤,我們看不到而已终蒂。

?2.? ?Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以調(diào)用其他的程序拇泣。這使得 Shell 命令的數(shù)量可以無限擴展噪叙,其結(jié)果就是 Shell 的功能非常強大,完全能夠勝任 Linux 的日常管理工作霉翔,如文本或字符串檢索睁蕾、文件的查找或創(chuàng)建、大規(guī)模軟件的自動部署早龟、更改系統(tǒng)設(shè)置惫霸、監(jiān)控服務(wù)器性能、發(fā)送報警郵件葱弟、抓取網(wǎng)頁內(nèi)容壹店、壓縮文件等。

3.? ? Shell 也是一種編程語言芝加,它的編譯器(解釋器)是 Shell 這個程序硅卢,Shell 主要用來開發(fā)一些實用的、自動化的小工具藏杖,而不是用來開發(fā)具有復(fù)雜業(yè)務(wù)邏輯的中大型軟件将塑,例如檢測計算機的硬件參數(shù)、搭建 Web 運行環(huán)境蝌麸、日志分析等点寥,

二 . Hello world

1.擴展名為.sh代表shell,新建test.sh

2.在test.sh中輸入?

點擊文件即可運行

3. 解釋說明

第一行:!#? 是一個約定的標(biāo)記来吩,告訴系統(tǒng)這個腳本需要哪個解釋器來執(zhí)行敢辩,后面的/bin/bash指明解釋器的具體位置;

第二行:echo命令用于向標(biāo)準(zhǔn)輸出文件輸出文本弟疆;

4.在test.sh中輸入

點擊文件即可運行

5.解釋說明:

第五行:read 表示從終端讀取用戶輸入的數(shù)據(jù)戚长,并賦值給 PERSON;read用來從標(biāo)準(zhǔn)輸入文件怠苔,讀取用戶輸入的數(shù)據(jù)

第六行:表示輸入輸入變量PERSON的內(nèi)容同廉,在變量前面要加一個$,否則會當(dāng)成一個字符串處理;

6.將shell腳本作為程序運行

7.解釋說明:

第二行: chmod +x 給腳本添加執(zhí)行權(quán)限柑司;

第三行:./表示當(dāng)前目錄迫肖,在當(dāng)前目錄下執(zhí)行test.sh腳本

注意:這種方式,腳本頭 #!/bin/bash一定要寫對

echo $$ 獲取當(dāng)前進程的PID

?shell編程

一? 變量

1.變量

(1).定義變量

?解釋說明: 如果value 不包含任何空白符(tab 縮進)攒驰,不需要加引號咒程;如果包含必須加引號,

? ? ? ? ? ? ? ? 變量的名字必須以字母或者下劃線開頭讼育,不能以數(shù)字開頭

注意??:? ?= 前后都不可以出現(xiàn)空格

(2).變量的使用:

解釋說明:使用一個定義過的變量帐姻,只需要在變量前加上$ 即可稠集;也可以加一個花括號,加不加都可以饥瓷;花括號是為了幫助解釋器識別變量的邊界剥纷;

注意?: 推薦給所有的變量加花括號

(3).修改變量的值

(4).單引號和雙引號的差別

解釋說明:' ' 單引號包圍的,里面是什么就輸出什么呢铆,即使里面有變量和內(nèi)容晦鞋,都原樣輸出;

? ? ? ? ? ? ? ?" " 雙引號包圍的棺克,輸出時會先解析里面的的變量和內(nèi)容悠垛;

注意 : 如果變量是數(shù)字,不需要加引號娜谊;如果需要原樣輸出的加單引號确买;其他沒有特殊要求的? ? ? ? ? ? ? 都需要加雙引號。

(5) .將命令的結(jié)果賦值給變量

(6).只讀變量

(7).刪除變量

2.變量的作用域

(1)局部變量

解釋說明:在shell函數(shù)中定義的變量默認(rèn)也是全局變量纱皆,他和在函數(shù)外定義的變量效果一樣

想要編程局部變量 湾趾,可以在定義時加上local命令

(2)全局變量

? ? ?變量在整個shell進程中都有效,在shell中定義的變量派草,默認(rèn)都是全局變量搀缠。整個shell進程,而不是當(dāng)前的shell腳本艺普,每打開一個shell窗口就是一個shell進程。

以下兩個shell腳本a.sh 和b.sh


打開一個shell窗口

解釋說明:這三條命令是在同一個進程中執(zhí)行的歧譬,在shell窗口中以命令行形式定義的變量缴罗,在a.sh中生效了祭埂,在a.sh中定義的b兵钮,在b.sh中也生效了。

(3)環(huán)境變量

使用export 命令將全局變量導(dǎo)出掘譬,全局變量就會在所有的子進程中生效,這稱為 環(huán)境變量葱轩;

注意??:? 兩個沒有父子關(guān)系的進程是不可以傳遞環(huán)境變量的睦焕;

通過export命令導(dǎo)出的全局變量只對當(dāng)前shell進程以及子進程有效藐握,如果父進程被關(guān)閉了,其他進程也無法使用了垃喊,環(huán)境變量是臨時的猾普。

3.命令替換

(1)反單引號 ``? 和 $()? 都可以完成命令替換

commands 可以是一個或多個命令,多個命令用本谜;分隔
使用 data 命令的%s格式控制符可以得到當(dāng)前的 UNIX 時間戳?

注意 : 多數(shù)情況下 `` 和 $() 是等價的初家,但是$() 可以用于嵌套$() ,反單引號`` 容易和單引號混淆,建議使用$()?

4.位置參數(shù)

(1)給函數(shù)傳遞位置參數(shù)

(2)給腳本文件傳遞位置參數(shù)

注意: 如果參數(shù)個數(shù)太多乌助,需要用${n} 來接收

5.特殊變量

(1)給函數(shù)傳遞參數(shù)?

(2)$@ $* 區(qū)別

解釋說明:當(dāng)他們不被雙引號包裹的時候沒有任何差別溜在;

? ? ? ? ? ? ? 當(dāng)他們被雙引號包裹的時候:"$*" 會把所有參數(shù)看成一份整體數(shù)據(jù);"$@" 會把每個參數(shù) 看成一份數(shù)據(jù)他托,彼此之間是獨立的

二 字符串

1.字符串

可以由 單引號包裹 '' 掖肋,雙引號包裹 "" ,不被引號包裹; 他們之間的區(qū)別 見上方變量中的第4條 單引號和雙引號的差別

具體使用看下面例子上祈,不做細(xì)致說明了

2.獲取字符串長度

? ${#str_name} 獲取字符串長度

3.字符串拼接

將多個字符串排放在一起就能實現(xiàn)拼接培遵,不需要使用任何運算符

以下是拼接的多種形式

4.字符串截取

(1)從左邊開始截取

格式:? #${string:star:length}

解釋說明:? 從左邊開始計數(shù) start其實位置 length長度;

? ? ? ? ? ? ? ? length 可以省略 從開始位置截取到最后;

? ? ? ? ? ? ? ?從0開始計數(shù)登刺;從左往右截取

(2)從右邊開始截取

格式: #{string:0-start:length}

解釋說明: 0- 固定寫法籽腕,表示從右邊開始計數(shù);

? ? ? ? ? ? ? ?length 可以省略 從開始位置截取到最后纸俭;

? ? ? ? ? ? ? ? 起始數(shù)字是1皇耗;從左往右截取

(3)從指定字符開始截取

? ? ?使用#截取右邊字符

? ? ? ? ? ? ? 格式: ${string#*charts}

? ? ? ? ? ? ?解釋說明:charts 表示指定字符串揍很;*通配符 任意長度的字符串窒悔;*charts 意思是忽略左邊所有字符串简珠,直到遇到第一個charts就開始截取

? ? ? ? ? ?格式:${string##*charts} 用法同上 不同的是直到遇到最后一個指定字符串才結(jié)開始截取

使用%截取左邊字符

格式:${string%charts*} 截取charts 左邊的字符膘融,忽略右邊的字符氧映;

? ? ? ?%和%%的區(qū)別于#和##用法一直

匯總

三 數(shù)組

(1).數(shù)組的定義

array_name=(value1 value2 value3 value4)

解釋說明:用()表示數(shù)組律姨;數(shù)組元素之間用空格隔開线召;=兩邊不能有空格

解釋說明:shell數(shù)組是弱類型缓淹,不要求所有元素類型都相同;

? ? ? ? ? ? ? ?數(shù)組長度不是固定的湾盗,定義之后還可以添加元素躏吊;

? ? ? ? ? ? ? ?可以給特定元素賦值比伏;

? ? ? ? ? ? ? ?根據(jù)下標(biāo)可以獲取指定位置字符赁项;

(2)獲取數(shù)組長度

? ? 解釋說明:@和* 用法一樣悠菜,任選其一就可以了

(3)數(shù)組合并

解釋說明:將數(shù)組擴展成列表再合并再一起

(4)刪除數(shù)組元素

解釋說明:unset關(guān)鍵字來刪除數(shù)組元素

四 shell內(nèi)建命令

可以使用 type 來確定命令是否屬于內(nèi)建命令

內(nèi)建命令比外部命令執(zhí)行快,執(zhí)行外部命令時不但會觸發(fā)磁盤io芬骄,還是單獨fork一個進程來執(zhí)行德玫,執(zhí)行完后椎麦,還要推出這個進程观挎,執(zhí)行內(nèi)建命令相當(dāng)于調(diào)用當(dāng)前shell的一個函數(shù)

(1)alias 和unalias

(2)echo 和 echo -n , echo -e

(3)read?

read常用選項

(4)exit

退出當(dāng)前hell進程,退出狀態(tài)在0~255之間晒屎,只有狀態(tài)為0的時候表示退出成功缓升,其他都表示失敽Э浴歧寺;

(5)declare

五 數(shù)學(xué)計算

主要學(xué)習(xí)(()) 和ab即可

(1)(( 表達式 ))

解釋說明:

a. 只能對整數(shù)進行運算顷链;

b. 表達式可以有一個或多個,多個表達式之間用,分隔像啼,多個表達式時忽冻,以最后一個表達式為命令最終的執(zhí)行結(jié)果僧诚;

c. 在(( ))中的變量不需要加$,(( ))會自動解析變量名湖笨;

d. 需要立即輸出表達式的結(jié)果時慈省,需要在(( ))前面加$

e. (( ))可以做一些稍微復(fù)雜的計算:如下圖所示:

(2)let

格式: let 表達式? 袱衷;? let '表達式' 致燥; let "表達式"?

解釋說明:?

a.用法同(( ));

b.表達式中有特殊字符時嫌蚤,需要用" " 或者 ' '包圍起來搬葬;

c.不同于(( )) 的是:(( )) 多個表達式之間用 , 隔開急凰;let 多個表達式之間用空格隔開

(3)bc

六 .if else

1.語法

解釋說明:

a.如果 condition 條件成立猜年,那么執(zhí)行 then 后面的語句床三;如果不成立杨幼,不會執(zhí)行任何語句四瘫,最后以fi來閉合欲逃;

b.如果condition 和 then 寫在同一行洗做,則condition后需要用;隔開

2. if elif else

3. test 等價于 [ 表達式 ]

還有test與文件檢測相關(guān)的,暫不做筆記說明 畦徘,具體使用請點擊:test檢測文件http://c.biancheng.net/view/2742.html

4.[[ 表達式 ]] 是shell的內(nèi)置關(guān)鍵字


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掘剪,隨后出現(xiàn)的幾起案子夺谁,更是在濱河造成了極大的恐慌,老刑警劉巖勿负,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奴愉,死亡現(xiàn)場離奇詭異锭硼,居然都是意外死亡檀头,警方通過查閱死者的電腦和手機岖沛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒋荚,“玉大人馆蠕,你說我怎么就攤上這事播赁。” “怎么了吼渡?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵容为,是天一觀的道長。 經(jīng)常有香客問我,道長坎背,這世上最難降的妖魔是什么替劈? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮得滤,結(jié)果婚禮上陨献,老公的妹妹穿的比我還像新娘。我一直安慰自己懂更,他們只是感情好慷暂,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布蘑辑。 她就那樣靜靜地躺著副砍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音滑燃,去河邊找鬼蚊丐。 笑死昭娩,一個胖子當(dāng)著我的面吹牛磕诊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼目派,長吁一口氣:“原來是場噩夢啊……” “哼徒河!你這毒婦竟也來了代兵?” 一聲冷哼從身側(cè)響起思币,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盯蝴,失蹤者是張志新(化名)和其女友劉穎黎做,沒想到半個月后鸣峭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞玄,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年殉摔,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓢颅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰意。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖客年,靈堂內(nèi)的尸體忽然破棺而出抵赢,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布寸宵,位于F島的核電站咆霜,受9級特大地震影響邓馒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛾坯,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一光酣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脉课,春花似錦救军、人聲如沸财异。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戳寸。三九已至,卻和暖如春拷泽,著一層夾襖步出監(jiān)牢的瞬間疫鹊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工司致, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拆吆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓脂矫,卻偏偏與公主長得像枣耀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庭再,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355