江門建設(shè)建筑網(wǎng)站企業(yè)網(wǎng)站seo排名優(yōu)化
Shell編程
視頻地址https://www.bilibili.com/video/BV1hW41167NW/?p=1&vd_source=977d52a6b92ce8b6ae67c16fc61f0428
第一章 Shell概述
大數(shù)據(jù)程序員為什么要學(xué)習(xí)Shell呢?
- 需要看懂運維人員編寫的Shell程序
- 偶爾會編寫一些簡單的Shell程序來管理集群,提高開發(fā)效率。
Shell概述
Shell是一個命令行解釋器,它接收應(yīng)用程序的/用戶命令,然后調(diào)用操作系統(tǒng)內(nèi)核。
Shell 還是一個功能相當(dāng)強大的編程語言,易編寫、易調(diào)試、靈活性強。
第二章 Shell解析器
-
Linux提供的shell解析器有:6種 系統(tǒng)
默認(rèn)的是/bin/bash
-
bash和sh的關(guān)系,sh是bash的軟連接
-
Contos默認(rèn)的解析器是bash
第三章 Shell腳本入門
3.1 腳本格式
腳本以#!/bin/bash
開頭(指定解析器)
3.2 第一個Shell腳本:hello world
需求:創(chuàng)建一個Shell腳本,輸出helloworld
創(chuàng)建一個文件夾,以后存放的shell腳本全放在這個文件夾下 mkdir shelldatas
進(jìn)入shelldatas:cd shelldatas
在shelldatas下創(chuàng)建shell腳本:touch helloworld.sh
編輯sh腳本:vim helloworld.sh
按i
進(jìn)行輸入 輸入完成后按ESC鍵,輸入:wq
退出
運行腳本 ,有以下方式
sh helloworld.sh
bash helloworld.sh
bash /shelldatas/helloworld.sh
sh /shelldatas/helloworld.sh
./helloworld.sh
這個會報權(quán)限不夠;
輸入ll
查看權(quán)限
給文件添加權(quán)限:chmod 777 helloworld.sh
輸入ll
查看權(quán)限
權(quán)限賦予之后使用./helloworld.sh
或者/shelldatas/helloworld.sh
注意:第一中執(zhí)行方法,本質(zhì)是bash解析器幫你執(zhí)行腳本,所以腳本本身不需要執(zhí)行權(quán)限,第二種執(zhí)行方法,本質(zhì)是腳本需要自己執(zhí)行,所以需要執(zhí)行權(quán)限。
3.3 第二個Shell腳本:多命令處理
需求
在/shelldatas
目錄下創(chuàng)建一個banzhang.txt在banzhang.txt文件中增加”I love cls“
創(chuàng)建batch.sh腳本 touch batch.sh
編輯batch.sh vim batch.sh
按i
進(jìn)行輸入,完成后按ESC
并輸入:wq
退出
執(zhí)行batch.sh sh batch,sh
查看文件夾是否多了banzhang.txt文件。
打開banzhang.txt,內(nèi)容顯示在控制臺上。cat banzhang.txt
第四章 Shell中的變量
4.1系統(tǒng)變量
4.1.1 常用系統(tǒng)變量
$HOME
、$PWD
、$SHELL
、$USER
等
4.1.2 案例實操
-
查看系統(tǒng)變量的值
-
顯示當(dāng)前shell中的所有變量:
set
4.2 自定義變量
4.2.1 基本語法
定義變量:變量 = 值
撤銷變量: unset 變量
聲明靜態(tài)變量: readonly 變量
,注意不能unset
變量定義規(guī)則
-
變量名稱可以由字母、數(shù)字和下劃線組成,但是不能以數(shù)字開頭,
環(huán)境變量名建議大寫
。 -
等號兩側(cè)不能有空格。
-
在bash中,變量默認(rèn)類型都是字符串類型,無法直接進(jìn)行數(shù)值運算
-
變量的值如果有空格,需要使用雙引號或單引號括起來。
-
可把變量提升為全局環(huán)境變量,可供其他Shell程序使用
4.2.2 export 變量名
編輯helloworld.sh
輸入指令echo $D,
保存后運行helloworld.sh,$D 并沒有被輸出
目前$D為局部變量,將它提升為全局變量,export D
運行helloworld.sh
注意:變量設(shè)置為全局變量后,可供所有的shell腳本內(nèi)使用,常見的場景就是些javahome,dorkehome等
4.3 特殊變量: $n
4.3.1 基本語法
$n
(功能描述:n
為數(shù)字,$0
代表該腳本名稱,$1-9
代表第一到第九個參數(shù),十以上的參數(shù),十以上的參數(shù)需要用大括號包含如${10}
)
4.3.2 案例實操
創(chuàng)建touch parameter.sh
;編輯文件 vim parameter.sh
輸入 echo ”$0 $1 $2 $3“
報存編輯 運行parameter.sh,sh parameter.sh
應(yīng)用場景,判斷你輸入的參數(shù),腳本內(nèi)根據(jù)參數(shù)執(zhí)行相應(yīng)的內(nèi)容,
4.4 特殊變量: $#
4.4.1 基本語法
$#
(功能描述:獲取所有輸入?yún)?shù)個數(shù),常用于循環(huán))。
實操案例
繼續(xù)編輯vim parameter.sh
輸入echo ‘$#’
保存運行腳本
4.5 特殊變量: $*
、$@
4.5.1 基本語法
$*
(功能描述:這個變量代表命令行中所有的參數(shù),$*
把所有的參數(shù)看成一個整體)
$@
(功能描述:這個變量也代表命令行中的所有的參數(shù),不過$@
把每個參數(shù)區(qū)分對待)
4.5.2 案例實操
4.6特殊變量: $?
4.6.1基本語法
$?
(功能描述:最后一次執(zhí)行的命令的返回狀態(tài),如果這個變量的值為0,證明上一個命令正確執(zhí)行,如果這個變量的值為非0(具體是哪個數(shù),由命令自己來決定),則證明上一個命令執(zhí)行不正確了 )
4.6.2 實操案例
第五章 運算符
5.1 基本語法
”$((運算式))
“或”$[運算式]
“
expr +,-,\*, / ,%
加,減,乘,除,取余
注意:expr 與運算符之間要有空格。
5.2實操案例
計算2+3,3-2
計算混合運行(2+3)*4
expr
的形式,expr 2 + 3
用上頓號包起來表示讓它先運行,后面在執(zhí)行最外層的運算
通過[]
中括號的形式,這個明顯簡單些,中括號內(nèi)直接放運算式子
第六章 條件判斷
6.1 基本語法
【 condition 】
(注意condition前后要有空格)
注意:條件非空即為true,【 zhangsan 】
返回true,[]
返回false
6.2 常用判斷條件
6.2.1 連個整數(shù)之間比較
=
字符串比較
-lt
小于 (less than) -le
小于等于(less equal)
-eq
等于 (equal) -gt
大于 (greater then)
-ge
大于等于(greater equal) -ne
不等于(Not equal)
6.2.2 按照文件權(quán)限進(jìn)行判斷
-r
有讀的權(quán)限(read) -w
有寫的權(quán)限(write)-x
有執(zhí)行的權(quán)限(execute)
6.2.3 按照文件類型進(jìn)行判斷
-f
文件存在并且是一個常規(guī)的文件(file)
-e
文件存在 (existence)-d
文件存在并不是一個目錄(directory)
6.2.4 例子:
判斷23 大于等于 22,
判斷helloworld.sh 是否具有寫權(quán)限
/shelldatas/cls.txt 目錄中的文件是否存在
多條件判斷(&&表示前一條命令執(zhí)行成功時,才執(zhí)行后一條命令), || 表示上一條命令執(zhí)行失敗后,才執(zhí)行下一條命令
第七章 流程控制(重點)
7.1 if判斷
7.1.1 基本語法
if [ 條件判斷式 ]:then程序
fi
或者
if 【 條件判斷式 】then程序
fi
- 【 條件判斷式 】,中括號和條件判斷式之間必須有空格
- if 后要有空格
7.1.2 案例實操
輸入一個數(shù)字,如果式1,則輸出ni zhen shuai,如果輸出2,則輸出ni zhen chou,如果是其他,什么也不輸出。
7.2 case 語句
7.1.1 基本語法
case $ 變量名 in
”值1“)
如果變量的值等于值1,則執(zhí)行程序1
;;
”值2“)
如果變量的值等于值2,則執(zhí)行程序2
;;
...省略其他分支...
*)
如果變量的值都不是以上的值,則執(zhí)行此程序
;;
esac
注意事項:
- case行尾必須為單詞”in“,每一個模式匹配必須以右括號”)“結(jié)束
- 雙分號”;;“表示命令序列結(jié)束,相當(dāng)于Java中的break
- 最后的” *)“表示默認(rèn)模式,相當(dāng)于Java中的default
7.1.2 案例實操:
輸入一個數(shù)字,如果是1,則輸出beijing,如果是2,則輸出nanjing,如果是其他,則輸出shanghai
7.3 for循環(huán)
7.3.1 基本語法
for (( 初始值;循環(huán)控制條件;變量變化 ))do程序
done
7.3.2 案例實操
從1加到100
7.3.3基本語法2
for 變量 in 值1 值2 值3...do程序
done
7.3.4 實操案例:打印所有輸入?yún)?shù)
$*的輸出,一次輸出一個參數(shù)
$@的輸出,一次輸出一個參數(shù)
“$*” 加引號的,一次輸出所有,只循環(huán)一次
加”$@“ 一次輸出一個
總結(jié):$@
、$*
、"$@"
,參數(shù)有幾個就循環(huán)幾次,
"$*"
, 不管參數(shù)有多少個,它只循環(huán)一次,并且值就是所有的值
7.4 while循環(huán)
7.4.1 基本語法
while [ 條件表達(dá)式 ]do程序done
7.4.2 實例:從1加到100
第八章 read讀取控制臺輸入
8.1 基本語法
read(選項)(參數(shù))
選項:
-p:指定讀取值時的提示符;
-t: 指定讀取值時等待的時間(秒); 參數(shù): 變量:指定讀取值的變量名
8.2案例實操
提示7秒內(nèi),讀取控制臺輸入的名稱
第九章 函數(shù)
9.1 系統(tǒng)函數(shù)
9.1.1 basename 基本語法
basename [string/pathname] [suffix]
(功能描述:basename命令會刪掉所有的前綴包括最后一個(‘/’)字符,然后將字符串顯示出來)
選項:suffix
為后綴,如果suffix
被指定了,basename
會將pathname
或string
中的suffix
去掉。
9.1.2 案例實操
截取該/shelldatas/helloword.sh
路徑的文件名稱
9.1.3 dirname基本語法
dirname文件絕對路徑
(功能描述:從給定的包含絕對路徑的文件名中去除文件名(非目錄部分)然后返回剩下的路徑(目錄的部分))
9.1.4 案例實操
9.2 自定義函數(shù)
9.2.1 基本語法
[ function ] funname[()]
{Action;[return int;]
}
funname
經(jīng)驗技巧
- 必須在調(diào)用函數(shù)地方之前,先聲明函數(shù),shell腳本是逐行運行,不像其他語言一樣編譯。
- 函數(shù)返回值,只能通過$?系統(tǒng)變量獲得,可以顯示加:return返回,如果不加,將以最后一條命令運行結(jié)果作為返回值,return后跟數(shù)值n(0~255)
9.2.2 案例實操(計算兩個輸入?yún)?shù)的和)
第十章 Shell工具(重點)
10.1 cut
cut
的工作就是“剪”,具體的說就是在文件中負(fù)責(zé)剪切數(shù)據(jù)用的,cut命令從文件的每一行剪切字節(jié)、字符
和字段并將這些字節(jié)、字符和字段輸出。
10.1.1 基本語法
cut[選項參數(shù)] filename
說明:默認(rèn)分割符是治標(biāo)符
選擇參數(shù)說明
選項 | 功能 |
---|---|
-f | 列號,提取第幾列 |
-d | 分隔符,按照指定分隔符分隔 |
10.1.2 實操案例
準(zhǔn)備數(shù)據(jù)
選取系統(tǒng)path變量值,第2個“:”開始后的所有路徑
切割ifconfig后打印的ip地址
ifconfig eth0
ifconfig eth0 | grep "inet addr"
ifconfig eth0 | grep "inet addr" | cut -d : -f 2
ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1
10.2 sed
sed
是一種流編譯器,它一次處理一行內(nèi)容,處理時,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”,接著用sed
命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕,接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒有改變,除非你使用重定向存儲輸出。
10.2.1 基本語法
sed[選項參數(shù)] ‘command’ filename
10.2.2 選項參數(shù)說明
選項參數(shù) | 功能 |
---|---|
-e | 直接在指令列模式上進(jìn)行sed動作編輯 |
10.2.3 命令功能描述
命令 | 功能 |
---|---|
a | 新增,a的后面可以接字串,在下一行出現(xiàn) |
d | 刪除 |
s | 查找并替換 |
10.2.4 實例實操
將meinv 這個單詞插入到sed.txt第二行,打印
刪除源文件中包含zou的行
將sed.txt文件中將zhangsan替換為lisi
將sed.txt文件中的第二行刪除,并將zhangsan替換為lisi
10.3 awk
一個強大的文本分析工具,把文件逐行的讀入,以空格為默認(rèn)分割符將每行切片,切開的部分在進(jìn)行分析處理。
10.3.1 基本用法
awk[選項參數(shù)] ‘patternl {action1} pattern2 {action2}...’ filename
pattern"
: 表示awk在數(shù)據(jù)中查找的內(nèi)容,就是匹配模式
action
:在找到匹配內(nèi)容時所執(zhí)行的一系列命令
10.3.2 選項參數(shù)說明
選項參數(shù) | 功能 |
---|---|
-F | 指定輸入文件拆分隔符 |
-V | 賦值一個用戶定義變量 |
10.3.3 案例實操
搜索passwd文件以root關(guān)鍵字開頭的所有行,并輸出改行的第7列
搜索passwd文件以root關(guān)鍵字開頭的所有行,并輸出該行的第1列和第7列,中間以“,”號分割
注意:只有匹配了pattern的行才會執(zhí)行action
只顯示/etc/passwd的第一列和第七列,以逗號分隔,且在所有行前面添加列名user,shell在最后一行添加“dage,/bin/zhishai”
注意:BEGIN在所有數(shù)據(jù)讀取行之前執(zhí)行,END在所有數(shù)據(jù)執(zhí)行之后執(zhí)行。
將passwd文件中的用戶id增加數(shù)值1,并輸出
10.3.4 awk的內(nèi)置變量
變量 | 說明 |
---|---|
FILENAME | 文件名 |
NR | 已讀的記錄數(shù) |
NF | 瀏覽紀(jì)律的域的個數(shù)(切割后,列的個數(shù)) |
10.3.5 案例實操
統(tǒng)計passwd文件名,每行的行號,每列的列數(shù)
切割I(lǐng)P
查詢sed.txt中空行所在的行號
10.4 sort
sort
命令式在Linux里非常有用,它將文件進(jìn)行排序,并將排序結(jié)果標(biāo)準(zhǔn)輸出。
10.4.1 基本語法
sort(選項)(參數(shù))
選項 | 說明 |
---|---|
-n | 依照數(shù)值大小排序 |
-r | 以相反的順序排序 |
-t | 設(shè)置排序時所用的分隔字符 |
-k | 指定需要排序的列 |
10.4.2 案例實操
第11章: 企業(yè)真實面試題
11.1 京東
問題1:使用Linux命令查詢filel中空行所在的行號
有文件chengji.txt內(nèi)容如下
張三 40
李四 50
王五 60
使用Linux 命令計算第二列的和并輸出:
cat chengji.txt | awk -F " " '{sum+=$2} END{print sun}'
11.2搜狐&和訊網(wǎng)
Shell腳本里如何檢查一個文件是否存在?如果不存在該如何處理?
#! /bin/bash
if [ -f file.txt ]; thenecho "文件存在"
elseecho "文件不存在"
fi
11.3 新浪
用shell寫一個腳本,對文本中無序的一列數(shù)字排序
11.4金和網(wǎng)絡(luò)
請用shell腳本寫出查找當(dāng)前文件夾(/home)下所有的文本文件內(nèi)容中包含有字符”shen“的文件名稱