一? 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)反單引號 ``? 和 $()? 都可以完成命令替換
注意 : 多數(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é)計算
(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)