一,,介紹什么是解釋性語言,?什么是編譯型語言,?程序不需要編譯,,程序在運(yùn)行時(shí)由解釋器翻譯成機(jī)器語言,。每執(zhí)行一次都要翻譯一次因此效率比較低,。 程序在執(zhí)行前需要一個(gè)專門的編譯過程,把程序編譯成為假期語言文件,,運(yùn)行時(shí)不需要重新翻譯,,直接使用編譯的結(jié)果。 二,,腳本的作用腳本的格式#!/bin/bash 腳本的作用 1.自動(dòng)化軟件部署 2.自動(dòng)化分析處理 3.自動(dòng)化備份 4.自動(dòng)化監(jiān)控腳本 三,,she怎末用腳本運(yùn)行方式sh/bash 絕對(duì)路徑|相對(duì)路徑 chmod+x 腳本名稱 ./腳本名稱 在任意地方執(zhí)行腳本 將腳本移動(dòng)至bin目錄 腳本名稱 四,shell變量定義用戶變量變量名=值 變量名=`執(zhí)行命令` 變量名=$(執(zhí)行命) 讀取變量 echo ${A:2:3} 2下標(biāo) 3往后截取的長度 echo ${A} echo $A 作用域 只在當(dāng)前會(huì)話的當(dāng)前用戶下有效 全局環(huán)境變量
export 變量名=值 作用域 針對(duì)于當(dāng)前會(huì)話的所有用戶有效 系統(tǒng)環(huán)境變量
需要在 vim /etc/profile 定義變量 export 變量名=值 變量生效 source /etc/profile 特殊變量
$n 語法:$n (功能描述:n為數(shù)字,,$0代表該腳本名稱,,$1-$9代表第一到第九個(gè)參數(shù),十以上的參數(shù),,十以上的參數(shù)需要用大括號(hào)包含,,如${10}) $# 獲取所有參數(shù)的個(gè)數(shù) $* 獲取所有參數(shù) 加“”會(huì)把參數(shù)看作一個(gè)整體 $@ 獲取所有參數(shù) 加“”也是 把每個(gè)參數(shù)分區(qū)對(duì)待 $? 返回上一次執(zhí)行命令的將結(jié)果 正確返回0 錯(cuò)誤返回一 $*和$@都表示傳遞給函數(shù)或腳本的所有參數(shù),,不被雙引號(hào)“”包含時(shí),都以$1 $2 …$n的形式輸出所有參數(shù),;當(dāng)它們被雙引號(hào)“”包含時(shí),,“$*”會(huì)將所有的參數(shù)作為一個(gè)整體,以“$1 $2 …$n”的形式輸出所有參數(shù),;“$@”會(huì)將各個(gè)參數(shù)分開,,以“$1” “$2”…”$n”的形式輸出所有參數(shù)。
案例: for i in "$@" do echo $i done for i in "$*"
do echo $i done
五,,shell數(shù)組Shell 數(shù)組用括號(hào)來表示,,元素用"空格"符號(hào)分割開,如果元素中包含空格,,則該元素使用雙引號(hào)引起來,,例如"hello word" 語法:arr=(1 2 3 4 5 6 7 8)賦值:可以創(chuàng)建時(shí)添加如上
通過下標(biāo)添加 arr[n]=_?_
讀取:
echo ${arr[*]} echo ${arr[@]} 獲取數(shù)組中所有元素 echo ${arr[2]} 通過下表獲取元素 echo ${#arr[*]} echo ${#arr[@]} 獲取數(shù)組的長度 unset arr[2] 通過下表刪除數(shù)組的元素 并刪除這這個(gè)下標(biāo) 六,,shell運(yùn)算符整數(shù)運(yùn)算符$((運(yùn)算式)) $[運(yùn)算是] “+,,-,*,,/,,%” 運(yùn)算符間可以不要空格 echo $[(2*2)+4] expr +,-,\*,/,%, 運(yùn)算是之間要有空格 expr `expr 2 \* 2` \* 4 小數(shù)運(yùn)算 bc:Linux下的一個(gè)計(jì)算器程序,,可以處理整數(shù)和小數(shù),。Shell 本身只支持整數(shù)運(yùn)算,想計(jì) 算小數(shù)就得使用 bc這個(gè)外部的計(jì)算器 語法:echo "scale=小數(shù)位數(shù)" ; 運(yùn)算式" | bc
案例: 計(jì)算3*8/7 結(jié)果保留4位小數(shù): echo "scale=4; 3*8/7" | bc 計(jì)算4/9,,保留2位,,結(jié)果賦值給ret變量 ret=$(echo "scale=2;4/9"|bc) echo $ret 七,shell條件判斷語法 []條件非空即true[ condition ] (注意:condition前后要有空格) (1)兩個(gè)整數(shù)之間比較 == 字符串比較 -lt 小于(less than) -le 小于等于(less equal) -eq 等于(equal) -gt 大于(greater than) -ge 大于等于(greater equal) -ne 不等于(Not equal) (2)按照文件權(quán)限進(jìn)行判斷 -r 有讀的權(quán)限(read) -w 有寫的權(quán)限(write) -x 有執(zhí)行的權(quán)限(execute) (3)按照文件類型進(jìn)行判斷 -f 文件存在并且是一個(gè)常規(guī)的文件(file) -e 文件存在(existence) -d 文件存在并是一個(gè)目錄(directory) 案例: 判斷文件是否具有寫權(quán)限 [jinghang@hadoop101 datas]$ [ -w helloworld.sh ] [jinghang@hadoop101 datas]$ echo $? 代表上一條命令執(zhí)行結(jié)果 正確返回0 錯(cuò)誤返回1 0 判斷目錄中的文件是否存在 [jinghang@hadoop101 datas]$ [ -e /home/jinghang/cls.txt ] [jinghang@hadoop101 datas]$ echo $? 1 多條件判斷(&& 表示前一條命令執(zhí)行成功時(shí),,才執(zhí)行后一條命令,, || 表示上一條命令執(zhí)行失敗后,才執(zhí)行下一條命令) [jinghang@hadoop101 ~]$ [ condition ] && echo OK || echo NOTOK OK [jinghang@hadoop101 ~]$ [ condition ] && [ ] || echo NOTOK NOTOK 八,,shell流程控制(一),,if 判斷語句語法1: if [ 條件判斷式 ]then 主體代碼 fi 語法2: if [ 條件判斷式 ] then 主體代碼 else 主體代碼 fi 語法3: if [ 條件判斷式 ] then 主體代碼 elif [條件判斷式] then 主體代碼 else 主體代碼 fi 注意事項(xiàng):(1)[ 條件判斷式 ],中括號(hào)和條件判斷式之間必須要有空格 (2)if后要有空格 案例: 編寫一個(gè)腳本,傳入文件或者目錄名稱 (1)判斷文件或者目錄是否存在,,存在則完成(2)(3)步驟,,不存在則輸出文件或目錄不存在 (2)如果是文件輸出路徑并打印"該路徑為文件路徑",并往文件中寫入 "你真好看" (3)如果是目錄,輸出路徑并打印"該路徑為目錄路徑",,并在該路徑下創(chuàng)建bbb.txt文件
(二),,case 判斷語句語法case $變量名 in "值1") 如果變量的值等于值1,則執(zhí)行程序1 ;; "值2") 如果變量的值等于值2,,則執(zhí)行程序2 ;; …省略其他分支… *) 如果變量的值都不是以上的值,,則執(zhí)行此程序 ;; esac 注意事項(xiàng): (1)case行尾必須為單詞“in”,,每一個(gè)模式匹配必須以右括號(hào)“)”結(jié)束。 (2)雙分號(hào)“;;”表示命令序列結(jié)束,,相當(dāng)于java中的break,。 (3)最后的“*)”表示默認(rèn)模式,相當(dāng)于java中的default,。 (三),,for 循環(huán)語句語法1:for (( i=0;i<100;i++ )) do 程序 done 語法2: $*:讀取傳入腳本中的全部參數(shù),把參數(shù)看作一個(gè)整體 $@:讀取傳入腳本中的全部參數(shù),把參數(shù)區(qū)分對(duì)待 for 變量 in "$*"
do 程序 done for 變量 in "$@"
do 程序 done 案例: 從1加到100 #!/bin/bash sum=0 for((i=0;i<=100;i++)) do sum=$[ sum+i ] done echo $sum [jinghang@hadoop101 datas]$ chmod 777 for1.sh
[jinghang@hadoop101 datas]$ ./for1.sh “5050” (四),while 循環(huán)語句語法while [ 條件判斷式 ] 注意 :while 和條件判斷式 與[之間都要有空格 do 程序 done 5.until 循環(huán)語句
until 循環(huán)執(zhí)行一系列命令直至條件為 true 時(shí)停止 until [ 條件判斷式 ] do 主題代碼 done 案例: #!/bin/bash i=0 sum=0 until [ $i -eq 101 ] do sum=$[sum+i] i=$[i+1] done echo $sum echo $i 九,read讀取控制臺(tái)輸入語法read [選項(xiàng)] [參數(shù)] 選項(xiàng) 功能 -p 指定讀取值時(shí)的提示符 -t 指定讀取值時(shí)等待的時(shí)間(秒) 參數(shù):指定讀取的值的變量名 案例: 1.使用read命令讀取命令行輸入?yún)?shù),,提示“Enter your name in 7 seconds”, 把用戶輸入?yún)?shù)賦值給NAME變量
十,shell函數(shù)(一),,系統(tǒng)函數(shù)basenamebasename命令會(huì)刪掉所有的前綴包括最后一個(gè)('/’)字符,,然后將字符串顯示出來 basename [string / pathname] [suffix] 可選項(xiàng):suffix為后綴,如果suffix被指定了,,basename會(huì)將pathname或string中的suffix去掉,。 案例:
dirname 從給定的包含絕對(duì)路徑的文件名中去除文件名(非目錄的部分),然后返回剩下的路徑(目錄的部分) dirname 文件絕對(duì)路徑 案例
(二),,自定義函數(shù)語法:[ function ] funname() { Action; [return int;] } funname 經(jīng)驗(yàn)技巧 (1)必須在調(diào)用函數(shù)地方之前,,先聲明函數(shù),shell腳本逐行運(yùn)行,。不會(huì)先編譯,。 (2)函數(shù)返回值,只能通過$?系統(tǒng)變量獲得,,可以顯示加:return返回,,如果不加,將以最后一條命令運(yùn)行結(jié)果,,作為返回值,。return后跟數(shù)值n(0-255) 案例 輸入兩個(gè)參數(shù),計(jì)算兩個(gè)參數(shù)的和
補(bǔ)充:
用戶函數(shù)定義在當(dāng)前用戶主目錄下的.bashrc文件里在當(dāng)前用戶下所有的會(huì)話都有效 調(diào)用前要source一下 系統(tǒng)函數(shù)定義在/etc/profile文件下 對(duì)所有用戶所有會(huì)話都有效 也要source一下 十一,,shell文本處理(一),,cut功能描述:cut的工作就是“剪”,具體的說就是在文件中負(fù)責(zé)剪切數(shù)據(jù)用的,,cut指令用戶顯示行中的指定部分,,刪除文件中的指定字段。 cut [選項(xiàng)] [文件] 選項(xiàng) 功能 -b -b <起始字節(jié)位置-結(jié)束字節(jié)位置>僅顯示行中指定字節(jié)范圍的內(nèi)容,。例如,,“-b 2-10”將顯示第2~10個(gè)字節(jié)位置的內(nèi)容,當(dāng)只有一個(gè)數(shù)字時(shí),則僅顯示指定字符 位置的內(nèi)容. -f <起始列位置-結(jié)束列位置> 顯示指定的字段內(nèi)容 -d <分隔符> 指定字段的分隔符,,默認(rèn)的字段分隔符為“TAB” -c <起始字符位置-結(jié)束字符位置> 僅顯示行中指定范圍的字符,。例如,, “-c2-10” 將顯示第2~10個(gè)字符位置的內(nèi)容。當(dāng)只有一個(gè)數(shù)字時(shí),,則僅顯示指定 字符位置的內(nèi)容 案例: (1)切割cut.txt第一列 cut -d " " -f 1 cut.txt (2)切割cut.txt第二,、三列 cut -d " " -f 2,3 cut.txt (3)切割ifconfig 后打印的IP地址
(二),sort功能描述:它將文件進(jìn)行排序,,并將排序結(jié)果標(biāo)準(zhǔn)輸出語法:sort 【選項(xiàng)】【參數(shù)】 選項(xiàng) 功能 -n 依照數(shù)值的大小排序 -r 以相反的順序來排序 -t 設(shè)置排序時(shí)所用的分隔字符 -k 指定需要排序的列 參數(shù):是指待排序的文件 案例:如有以下數(shù)據(jù)
按照整數(shù)排序:
按照小數(shù)排序
(三),正則表達(dá)式正則表達(dá)式,,又稱規(guī)則表達(dá)式。(英語:Regular Expression,,在代碼中常簡寫為regex,、regexp或RE)。正則表達(dá)式通常被用來檢索,、替換那些符合某個(gè)模式(規(guī)則) 的文本單字符匹配 \d 匹配一個(gè)數(shù)字字符,。等價(jià)于[0-9] \D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9] \w 匹配包括下劃線的任何單詞字符,。類似但不等價(jià)于[A-Za-z0-9_] \W 匹配任何非單詞字符,。等價(jià)于 [^A-Za-z0-9_] \s 匹配空白字符,包括空格,、制表符,、換頁符等等,等價(jià)于[ \f\n\r\t\v] \S 匹配任何可見字符,。等價(jià)于[^ \f\n\r\t\v] .點(diǎn) 匹配除“\n”和"\r"之外的任何單個(gè)字符 [a-z] 字符范圍,,匹配a~z之間的任意字符 [^a-z] 匹配除了a~z之間的其他字符 \n 匹配換行符 多字符匹配 + 匹配前面的子表達(dá)式一次或多次(大于等于1次) * 匹配前面的子表達(dá)式任意次 ? 匹配前面的子表達(dá)式零次或一次 {n} n是一個(gè)非負(fù)整數(shù)。匹配確定的n次 {n,m} m和n均為非負(fù)整數(shù),,其中n<=m,。最少匹配n次且最多匹配m次 其他 ^ 匹配輸入字行首 $ 匹配輸入行尾 | 將兩個(gè)匹配條件進(jìn)行邏輯“或”(or)運(yùn)算 x|y 匹配x或y (四),sed功能描述:sed是一種單行文本流式編輯器,,它一次處理一行內(nèi)容,。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,,稱為“模式空間”,,接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,,把緩沖區(qū)的內(nèi)容送往屏幕,。接著處理下一行,這樣不斷重復(fù),,直到文件結(jié)束,。文件內(nèi)容并沒有改變,除非你使用重定向存儲(chǔ)輸出,。語法:sed [選項(xiàng)] ’命令' 文件名 選項(xiàng) 功能 -e 直接在指令列模式上進(jìn)行sed的動(dòng)作編輯(一次執(zhí)行多個(gè)操作時(shí)),。 -i 直接編輯文件 -n 取消默認(rèn)輸出sed默認(rèn)會(huì)輸出所有文本內(nèi)容,,使用-n 參數(shù)后只顯示處理過的行 命令 功能 p 打印一般 -n 配合使用 a 新增,在指定的行之后插入內(nèi)容 i 新增,,在指定的行之前插入內(nèi)容 d 刪除 s 查找并替換 (注意:如果進(jìn)行全局的查找替換 sed -i 's/查找條件/替換字符串/g’ global) 案例: 數(shù)據(jù)準(zhǔn)備
(1)將“mei nv”這個(gè)單詞插入到sed.txt第二行下,,打印。
(2)刪除sed.txt文件所有包含wo的行
(3)將sed.txt文件中wo替換為ni
注意:'g’表示global,,全部替換 (4)將sed.txt將wo替換為ni只打印處理后的行
(5)批量添加注釋
(6)批量取消注釋
(五),,awk功能描述:是一門編程語言,也是一個(gè)強(qiáng)大的文本分析工具,,逐行掃描文件,,默認(rèn)從第一行到最后一行,尋找匹配特定模式的行,,并在這些行上進(jìn)行你想要 的操作,。 語法:awk 選項(xiàng) 'pattern1{action1} pattern2{action2}...’ 文件名 pattern:表示AWK在數(shù)據(jù)中查找的內(nèi)容,就是匹配模式 action:在找到匹配內(nèi)容時(shí)所執(zhí)行的一系列命令 選項(xiàng) 功能 -F 指定輸入文件的分隔符 -v 賦值一個(gè)用戶定義變量 案例1: passwd文件 (1)搜索passwd文件以root關(guān)鍵字開頭的所有行,,并輸出該行的第1列和第7列。
注意:只有匹配了pattern的行才會(huì)執(zhí)行action (2)搜索passwd文件以root和lisi關(guān)鍵字開頭的所有行,,并輸出該行的第1列和第7列,。
(3)只顯示/etc/passwd的第一列和第七列,,,且在所有行前面添加列名user,,shell在最后一行添加"總用戶數(shù):用戶數(shù)量"。
注意:BEGIN 在所有數(shù)據(jù)讀取行之前執(zhí)行,;END 在所有數(shù)據(jù)執(zhí)行之后執(zhí)行,。 (4)將passwd文件中的用戶id增加數(shù)值1并輸出計(jì)算后的用戶id和用戶名
(5)切割I(lǐng)P
(6)統(tǒng)計(jì)passwd文件用戶id大于500的用戶數(shù),和統(tǒng)計(jì)id小于500的用戶數(shù)
awk的內(nèi)置變量變量 說明FILENAME 文件名 NR 已讀的記錄數(shù) NF 瀏覽記錄的域的個(gè)數(shù)(切割后,,列的個(gè)數(shù)) 案例2: (1)統(tǒng)計(jì)passwd文件名,,每行的行號(hào),每行的列數(shù)
(2)查詢sed.txt中空行所在的行號(hào)并統(tǒng)計(jì)行號(hào)總數(shù)
|
|