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