【shell編程】基礎篇

基礎篇

一、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 還是有一些不同之處:

  1. bash 擴展了一些命令和參數;
  2. 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

注意事項:

  1. case行尾必須爲單詞“in”,每一個模式匹配必須以右括號“)”結束。
  2. 雙分號“;;”表示命令序列結束,相當於java中的break。
  3. 最後的“*)”表示默認模式,相當於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的基礎差不多就這些了,接着就是高階篇了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章