基礎篇
一、Shell概述
shell是一個功能比較強大的腳本語言,易編寫、易調試、靈活性強。它負責接收應用程序用戶命令,然後調用操作系統內核對用戶態的接口,開發和運維都應該掌握。
Linux提供的Shell的種類很多,centos7中提供了這麼多類型
不過bash(GNU Bourne-Again Shell)是最常用的一種shell。是當前大多數Linux發行版的默認Shell。
我們注意到還有一個sh,bash是sh的增強版本,但是bash shell保持了對 sh shell 的兼容性,這意味着,針對 sh 編寫的 Shell 代碼可以不加修改地在 bash 中運行。
可以看到 -> 軟連接 符號,可以理解成windows的快捷方式。
不過,bash 和 sh 還是有一些不同之處:
- bash 擴展了一些命令和參數;
- bash 並不完全和 sh 兼容,它們有些行爲並不一致,但在大多數企業運維的情況下區別不大,特殊場景可以使用 bash 代替 sh。
二、腳本定義與執行
腳本格式
腳本以#!/bin/bash
開頭(指定解析器
第一個Shell腳本
創建a.sh文件,寫入一下內容
執行腳本
bash a.sh
a.sh中的命令全都執行了。
腳本的常用執行方式有兩種,第一種演示過了:採用bash或sh+腳本的相對路徑或絕對路徑(不用賦予腳本+x權限)
第二種:採用輸入腳本的絕對路徑或相對路徑執行腳本(必須具有可執行權限+x)
沒有可執行權限會被拒絕:
需要賦予腳本權限+x權限,然後才能執行。這裏的執行方式是相對路徑。絕對路徑的話,需要用pwd找到完成的路徑名。
三、shell中的變量
(1) 系統變量(系統預定義變量)
常用的系統變量有:
$HOME、$PWD、$SHELL、$USER等
(2)自定義變量
基本語法
(1)定義變量:變量=值
(2)撤銷變量:unset 變量
(3)聲明靜態變量:readonly變量,注意:不能unset
變量定義規則
(1)變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變量名建議大寫。
(2)等號兩側不能有空格)
(3)在bash中,變量默認類型都是字符串類型,無法直接進行數值運算。
(4)變量的值如果有空格,需要使用雙引號或單引號括起來。
演示:
定義變量A
給變量A重新賦值
撤銷變量A
聲明靜態的變量B=555,不能unset
在bash中,變量默認類型都是字符串類型,無法直接進行數值運算
變量的值如果有空格,需要使用雙引號或單引號括起來
可把變量提升爲全局環境變量,可供其他Shell程序使用
export 變量名
修改a.sh文件
運行a.sh
發現並沒有打印出A的值
(3)特殊變量$n
功能描述:n爲數字,$0代表該腳本名稱,$1-$9代表第一到第九個參數,十以上的參數需要用大括號包含,如${10}
(4)特殊變量:$#
功能描述:獲取所有輸入參數個數,常用於循環
(5)特殊變量:$*、$@
$* 這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體
$@ 這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待
打印輸入的所有參數
(6)特殊變量:$?
最後一次執行的命令的返回狀態。如果這個變量的值爲0,證明上一個命令正確執行;如果這個變量的值爲非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。
判斷a.sh腳本是否正確執行
四、運算符
基本語法
(1)“$((運算式))”或“$[運算式]”
(2)expr + , - , *, /, % — 加,減,乘,除,取餘
注意:expr運算符間要有空格
計算555+666的值
計算(2+3)*4的值(兩種計算方式)
五、條件判斷
[ 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)
演示:
666是否大於等於555
a.sh是否具有寫權限
/home/wuwuwu/zezeze.txt目錄中的文件是否存在
多條件判斷(&& 表示前一條命令執行成功時,才執行後一條命令,|| 表示上一條命令執行失敗後,才執行下一條命令)
六、流程控制
(1)if 判斷
基本語法
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
elif [ 條件判斷式 ]
then
程序
else
程序
fi
注意事項:
(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
(2)if後要有空格
輸入一個數字,如果是1,則輸出WUHANJIAYOU,如果是2,則輸出ZHOGGUOJIAYOU,如果是其它,什麼也不輸出。
(2)case 語句
基本語法
case $變量名 in
"值1")
如果變量的值等於值1,則執行程序1
;;
"值2")
如果變量的值等於值2,則執行程序2
;;
…省略其他分支…
*)
如果變量的值都不是以上的值,則執行此程序
;;
esac
注意事項:
- case行尾必須爲單詞“in”,每一個模式匹配必須以右括號“)”結束。
- 雙分號“;;”表示命令序列結束,相當於java中的break。
- 最後的“*)”表示默認模式,相當於java中的default。
輸入一個數字,如果是1,則輸出WUHANJIAYOU,如果是2,則輸出ZHOGGUOJIAYOU,如果是其它,輸出GOGOGO
(3)for 循環
基本語法1
for (( 初始值;循環控制條件;變量變化 ))
do
程序
done
演示:從1加到100
基本語法2
for 變量 in 值1 值2 值3…
do
程序
done
打印所有輸入參數
下面比較一下$*和$@
(1)$*和$@都表示傳遞給函數或腳本的所有參數,不被雙引號“”包含時,都以$1
(b)當它們被雙引號“”包含時,“$*”會將所有的參數作爲一個整體,以“$1 $2 …$n”的形式輸出所有參數;“$@”會將各個參數分開,以“$1” “$2”…”$n”的形式輸出所有參數。
(4)while 循環
基本語法
while [ 條件判斷式 ]
do
程序
done
從1加到100
七、read讀取控制檯輸入
read(選項)(參數)
-
選項:
- -p:指定讀取值時的提示符;
- -t:指定讀取值時等待的時間(秒)。
-
參數
- 變量:指定讀取值的變量名
提示7秒內,讀取控制檯輸入的名稱
輸入sss
八、函數
(1)系統函數
basename基本語法
basename [string / pathname] [suffix] basename命令會刪掉所有的前綴包括最後一個(‘/’)字符,然後將字符串顯示出來。
選項:
- suffix爲後綴,如果suffix被指定了,basename會將pathname或string中的suffix去掉。
截取該/chenxiao/a.txt路徑的文件名稱
dirname基本語法
dirname 文件絕對路徑 從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),然後返回剩下的路徑(目錄的部分)
獲取a.txt文件的路徑
(2)自定義函數
基本語法
[ function ] funname[()]
{
Action;
[return int;]
}
funname
注意
(1)必須在調用函數地方之前,先聲明函數,shell腳本是逐行運行。不會像其它語言一樣先編譯。
(2)函數返回值,只能通過$?系統變量獲得,可以顯示加return返回,如果不加,將以最後一條命令運行結果,作爲返回值。return後跟數值n(0-255)
計算兩個輸入參數的和
九、Shell工具
(1)cut
cut的工作就是“剪”,具體的說就是在文件中負責剪切數據用的。cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段輸出。
cut [選項參數] filename
說明:默認分隔符是製表符
選項參數 | 功能 |
---|---|
-f | 列號,提取第幾列 |
-d | 分隔符,按照指定分隔符分割列 |
-c | 指定具體的字符 |
演示:
(1)數據準備,創建cut.txt文件並編輯
(2)切割cut.txt第一列
(3)切割cut.txt第二、三列
(4)在cut.txt文件中切割出zhao
(5)選取系統PATH變量值,第2個“:”開始後的所有路徑:
(6)切割ifconfig 後打印的IP地址
(2)sed
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”,接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。
基本用法
sed [選項參數] ‘command’ filename
選項參數說明
選項參數 | 功能 |
---|---|
-e | 直接在指令列模式上進行sed的動作編輯。 |
-i | 直接編輯文件 |
命令功能描述
命令 | 功能描述 |
---|---|
a | 新增,a的後面可以接字串,在下一行出現 |
d | 刪除 |
s | 查找並替換 |
演示:
(1)將“qian qi”這個單詞插入到sed.txt第二行下,打印。
注意:文件並沒有改變
(2)將sed.txt文件中liu替換爲liuliuliu
(3)將sed.txt文件中的第二行刪除並將wang替換爲huang
(3) awk
一個強大的文本分析工具,把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行分析處理。
基本用法
awk [選項參數] ‘pattern1{action1} pattern2{action2}...’ filename
pattern:表示AWK在數據中查找的內容,就是匹配模式
action:在找到匹配內容時所執行的一系列命令
選項參數說明
選項參數 | 功能 |
---|---|
-F | 指定輸入文件折分隔符 |
-v | 賦值一個用戶定義變量 |
演示
(1)搜索passwd文件以root關鍵字開頭的所有行,並輸出該行的第7列。
(2)搜索passwd文件以root關鍵字開頭的所有行,並輸出該行的第1列和第7列,中間以“,”號分割。
注意:只有匹配了pattern的行纔會執行action
(3)只顯示/etc/passwd的第一列和第七列,以逗號分割,且在所有行前面添加列名user,shell在最後一行添加"chenxiao,/bin/follow"。
注意:BEGIN 在所有數據讀取行之前執行;END 在所有數據執行之後執行。
(4)將passwd文件中的用戶id增加數值1並輸出
(4)awk的內置變量
變量 | 說明 |
---|---|
FILENAME | 文件名 |
NR | 已讀的記錄數 |
NF | 瀏覽記錄的域的個數(切割後,列的個數) |
演示:
(1)統計passwd文件名,每行的行號,每行的列數
(2)切割IP
(3)查詢sed.txt中空行所在的行號
(5)sort
sort命令是在Linux裏非常有用,它將文件進行排序,並將排序結果標準輸出。
基本語法
sort(選項)(參數)
選項 | 說明 |
---|---|
-n | 依照數值的大小排序 |
-r | 以相反的順序來排序 |
-t | 設置排序時所用的分隔字符 |
-k | 指定需要排序的列 |
參數:指定待排序的文件列表
演示
(1)按照“":”分割後的第三列倒序排序。
shell的基礎差不多就這些了,接着就是高階篇了。