Linux_Shell編程詳細解讀,從入門到入門(滑稽)你值得擁有(5)

創作不易,各位看官,點個贊收藏、關注必回關、QAQ、您的點贊是我更新的最大動力!

一. shell 編程

在這裏插入圖片描述
Shell 編程是 Unix/Linux 操作系統中的一大殺器,系統操作的一個核心元素。Unix要使用的非常精通,對於終端 Shell 腳本編寫非常熟練。

  • 常見操作命令
  • VIM 編輯器的使用
  • SHELL 腳本

SHELL 編程就是通過終端編寫腳本程序,輔助開發人員完成命令的工程自動 化操作。

  • 基礎配置:系統初始化操作、系統更新、內核調整等等
  • 安裝程序:自動部署 LNMP 、 LAMP 、 MySQL 等等
  • 配置變更: Nginx 配置 、 MySQL 配置 、 Redis 配置 等等
  • 業務部署:配合 git 、 jenkins 等實現自動化持續交付
  • 日常備份:腳本對項目或者軟件實現全備份或者增量備份等
  • 信息採集:硬件、系統、服務、網絡等各種數據的自動採集
  • 日誌分析:獲取日誌、排序、去重、統計、分析
  • 服務擴容:監控服務器就請你信息,腳本程序自動化擴容部署

減少重複工作,週期性工作,降低工作量

二.基本語法結構及使用

腳本程序在編寫時,通常會有一些基本的編碼規範,這些規範是約定俗成的

1 腳本編寫規範要求

	 腳本存放在 scripts/目錄中 
	 開頭添加#!/bin/bash,確定 bash 執行命令 
     附帶作者及版權信息 , 腳本擴展名爲*.sh 
	 腳本中儘量不用中文 
	 成對的符號一次書寫完成

2 註釋和輸入輸出

	註釋:
			除第一行外,以#行註釋
	輸入:
			read 讀取用戶輸入的信息
			-p 打印提示信息
			-s 用戶輸入信息不明文顯示
	輸出:
			echo 打印信息,類似於Python中的print()函數
			echo -n 打印信息不換行

3 執行shell腳本

mkdir scripts 根據約定創建scripts文件夾

vim test.sh  創建一個sh腳本並且進入編輯

#!/bin/bash
echo "hello Shell"

執行上述腳本三種方式
1. bash test.sh
2. sh test.sh
3. chmod u+x test.sh 先修改權限再執行
	./test.sh

創建文件夾 mkdir scripts
在這裏插入圖片描述
編寫一個sh腳本 vim test.sh 保存並且退出
在這裏插入圖片描述
三種執行方式
在這裏插入圖片描述

三. Shell中的變量

1 變量概述

什麼是變量:變量時 shell 傳遞數據的一種方式,作爲一個臨時存儲數據的容器,可以存放 數據並在其他需要的地方直接通過變量名稱使用對應的數據。
命令規則:

  • 變量定義時要求字母、數字或者下劃線組成,數字不能開頭。
  • 大小寫敏感 項目規範:見名知意、下劃線命名法

2 變量賦值

變量賦值,就是向變量中存儲數據的過程,需要注意

  • 變量賦值,使用=符號,將符號右邊的計算結果賦值給左邊的變量
  • 等號兩邊不能由空格
  • 定義的變量不要與系統命令衝突

3 腳本位置參數

shell 腳本可以接受多個參數,在腳本程序中可以通過特定的方式訪問這些參數數據

$* 和 ¥@ 
這兩個符號上不添加引號時,都是將接受的多個參數依次獲取 
$* 上添加雙引號,將接受的多個參數當成單字符串獲取
$@上添加雙引號,將接受的多個參數依次獲取

4 變量運算

變量的直接運算,主要體現在命令替換,使用$()$(())

[root@localhost scripts]# echo "this is $(date +%Y) year" 
this is 2019 year

[root@localhost scripts]# echo "this is $(($(date +%Y)+1)) year"
  this is 2020 year
  
[root@localhost scripts]# echo "this is $((`date +%Y`+1)) year" 
this is 2020 year

命令嵌套使用,可以通過符號$( $( ) )的嵌套方式進行操作
需求:將當前目錄中的所有 log 日誌進行打包壓縮

5 讀入變量

通過 read 命令,可以完成交互腳本,通過用戶輸入變量讀取到程序中
基本語法:

 將用戶輸入的信息存儲到 var 變量中
  read -p "提示信息" var

6 變量替換

    變量                                   描述

 ${變量#匹配規則} 				 從頭部匹配變量,最短刪除
 ${變量##匹配規則} 			     從頭部匹配變量,最長刪除
 ${變量%匹配規則} 				 從尾部匹配變量,最短刪除
 ${變量%%匹配規則}			     從尾部匹配變量,最長刪除 
 ${變量/舊字符串/新字符串} 		 使用新字符串替換舊字符串,替換一次
 ${變量//舊字符串/新字符串}		 使用新字符串替換舊字符串,全部替換

從前向後刪除,分別獲取指定網站域名、後綴

[root@localhost project]# url=https://www.sohu.com.cn
[root@localhost project]# echo ${url} 
https://www.sohu.com.cn
[root@localhost project]# echo ${url#*.} 
sohu.com.cn [root@localhost project]
#echo ${url#*hu.} com.cn 

從後向前刪除,分別獲取協議、域名前綴

[root@localhost project]# 
url=https://www.sohu.com.cn 
[root@localhost project]# echo ${url} 
https://www.sohu.com.cn 
[root@localhost project]# echo ${url%:*} 
https 
[root@localhost project]# echo ${url%.sohu*} 
https://www 

變量替換

 [root@damu project]# url="https://www.sohu.com.cn" 
 [root@damu project]# echo $url 
 https://www.sohu.com.cn 
 [root@damu project]# echo ${url/com.cn/COM.CN} 
 https://www.sohu.COM.CN 
 [root@damu project]# echo ${url/c/C} 
 https://www.sohu.Com.cn 

7、常用使用案例說明

1、第一個程序

#!/bin/sh
# 我的第一個基本程序
echo 我的第一個腳本
echo -n 作者:穩穩
echo -n 版本:V1.0
echo 學習了第一個語法-標準輸出

結果圖如下,也可以用 ssh demo01.sh 執行
在這裏插入圖片描述

2、輸入輸出+使用變量+【-p -s -n】案例

#!/bin/sh
echo 管理系統
echo -------------------------
echo 你好,請先登錄,然後才能繼續操作

# 用戶輸入賬號
read -p "請輸入您的賬號:" username # -p 提示用戶輸入信息 username爲獲取輸入變量
# 用戶輸入密碼
read -s -p "請輸入您的密碼:" password # -s 輸入密碼不顯示 

# 拓展:程序休眠1秒
echo -n "Loading"
sleep 1
echo -n "."
sleep 1
echo -n "."
sleep 1
echo "."

# 打印用戶輸入的信息
echo 您輸入了賬號:$username    
echo 您輸入了密碼:$password

3、變量如何使用

#!/bin/sh
echo 變量的使用介紹
echo 變量先聲明賦值,後使用數據

echo shell中的變量賦值的時候可以添加雙引號,也可以不加雙引號
echo shell中的變量賦值使用=符號賦值,符號兩側不能有空格
name="tom"
gender=male
age=18

echo 使用變量時,在變量前面添加$符號
echo $name
echo $gender
echo $age

echo 使用變量時,如果同時和其他字符拼接,按照如下語法操作
echo name:${name}
echo gender:${gender}
echo age:${age}

echo 使用變量時,雙引號-強引用 和 單引號-弱引用有區別
echo "name: $name "
echo 'name: $name '

在這裏插入圖片描述

四、數據運算

整數運算 expr、(())(())、[],整數運算不支持小數運算

操作符           描述

 num1 + num2     求和 
 num1 - num2     求差 
 num1 * num2     求積 
 num1 / num2     求商
 num1 % num2     取餘

五、程序控制結構

[ ] 括號裏面的空格嚴格 左右各自空一格,然後中間輸入條件

1 if 選擇結構

單分支,基本語法

    if 條件;then
	條件爲True要執行的代碼
   fi

雙分支,基本語法

    if 條件;then
		條件爲True要執行的代碼
    else
		其他情況
	fi

多分支,基本語法

if [ 條件1 ];then
	執行代碼1
elif [ 條件2 ];then
    執行代碼2
elif [ 條件3 ];then
    執行代碼3
else
	其他情況
fi

2 案例說明

符號左右要有空格 比如 =號 左右要空格

2.1 字符串判斷

= 判斷兩個字符是否相等
!= 判斷兩個字符串不相等
-z 判斷字符串長度爲0 zero
-n 判斷字符串是否爲空 null
#!/bin/sh

# 項目執行中
read -p "是否退出系統(Q退出/C繼續)?" res

# 判斷用戶輸入的數據
if [ $res = "Q" ];then
   echo "即將退出系統,請保存好個人數據"
   exit
elif [ $res = "C" ];then
   echo "項目繼續進行中...."
fi

echo "項目正常運行....."

注意了,有區分大小寫這一說法
在這裏插入圖片描述

2.2 整數輸入判斷

-eq 判斷兩個整數是否相等
-gt >
-lt <
-ge >=
-le <=
-ne !=
    #!/bin/bash
    read -p "請輸入功能選項": choice
    if [ $choice -eq 1 ];then
    	echo "選項1"
    elif [ $choice -eq 2 ];then
    	echo "選項2"
    elif [ $choice -eq 3 ];then
    	echo "選項3"	
    else 
    	echo "沒有此選項"
    fi

在這裏插入圖片描述

2.3 邏輯判斷

&& 判斷並且關係
-a 判斷並且關係
|| 判斷或者關係
-o 判斷或者關係
! 判斷取反
#!/bin/sh
echo 中公-遊戲商城用戶登錄

# 提示用戶輸入賬號
read -p "請輸入您的賬號:" username
read -p "請輸入您的密碼:" password

# 判斷賬號密碼是否正確
echo $username
echo $password
# 如果直接按照下面的方式編寫if判斷語句,會出現運算符號優先級問題
# 需要使用不同的運算符號完成優先級的轉換
if [ $username = "admin" -a $password = "123" ]; then
	echo 用戶登錄成功
else
	echo 賬號或者密碼有誤,請重新登錄
fi

在這裏插入圖片描述

2.4 文件判斷

-e 判斷文件是否存在 if [ -e 文件存放路徑 ]
-d 判斷是否是文件夾 if [ -d 文件存放路徑 ]
-f 判斷是否是文件 if [ -f 文件存放路徑 ]
-r 判斷指定的文件是否可讀 格式跟上面一樣 後面不寫了
-w 判斷指定的文件是否可寫
-x 判斷指定的文件是否可執行
#!/bin/sh
# 腳本要完成自動備份文件的操作
# 需要判斷當前目錄中是否由back/文件夾
# 如果有直接執行備份,如果沒有需要創建
echo -------- 開始準備備份,檢查環境 --------
# 判斷備份文件夾是否存在
if [ -e back ];then
   echo back文件已經存在
   if [ -d back ]; then
       echo back是一個文件夾,可以執行備份
   fi
else
   echo back文件不存在,創建文件夾
   mkdir back
fi

echo -------- 開始備份 --------
sleep 2
echo ------- 備份完成 --------

這裏跟我編寫的shell腳本存放在一個文件夾下,所有上面程序判斷沒有加路徑
在這裏插入圖片描述

2 case 選擇結構

基本語法:

case 變量 in 
	變量 1) 
	命令序列 1
	;; 
	變量 2) 
	命令序列 2
	;; 
	*) 
無匹配後命令序列 
esac
#!/bin/sh
echo        管理系統
echo -------------------------
echo         1.login
echo         2.register
echo         3.quit
echo -------------------------

# 提示用戶輸入選項
read -p "親輸入您的選項/操作:" oper

# 根據用戶的輸入執行不同的操作
case $oper in
    1|login)
	      echo "用戶要登錄了...."
        ;;
    2|register)
	      echo "用戶要註冊了...."
	      ;;
    3|quit)
	      echo "用戶準備退出系統"
	      ;;
     *)
	echo "沒有這個選項"
esac

在這裏插入圖片描述

3 for 循環

for 循環結構,和 Python 中的 for 循環結構語法基本一致

  for 變量名 in [取值列表] 
  do 
  循環中重複執行的代碼 
  done 
#!/bin/sh
echo 檢測集羣主機心跳
echo 檢查集羣中的所有主機是否通信良好

# 列出集羣中所有的主機
hosts="192.168.0.100 192.168.0.101 192.168.0.102"

# 檢查所有主機通信
for h in $hosts
do
	echo 開始檢查$h主機通信
	sleep 1
        echo $h 檢查通過
done

echo ----所有主機檢查完畢----

在這裏插入圖片描述

4 while 循環

while 循環結構,同樣和 python 中的 while 循環基本一致

  while 條件
  do
  循環要執行的代碼
  done
#!/bin/sh

echo 1~100的整數的和到底是多少?

num=1
sum=0
while [ $num -lt 100 ]
do
    # expr可以通過表達式直接進行整數的運算,但是賦值會出現問題
    # sum=expr $sum + $num
    # $[]運算符號,可以直接進行整數的運算,可以賦值
    #sum=$[$sum+$num]
    # $(())運算符號,可以直接進行整數的運算,可以賦值
    sum=$(($sum+$num))
    let num+=1
done

echo sum: $sum

要完成整數的運算,有三種操作方式 看自己喜歡那個

expr 運算表達式,如 expr 12 + 13 

$(()) 運算符號,如 res=$((12 + 13)) 

$[]運算符號,如 res=$[12+13]

在這裏插入圖片描述

六、函數聲明和調用

SHELL 中的函數,類似 python 中的函數,聲明方式和調用方式幾乎一致

注意事項:函數執行如果需要參數,不要在函數後面的括號中添加形式參數,shell 中函
數的參數有自己的傳遞方式。

#!/bin/sh
echo 函數的聲明和調用方式

# 標準語法聲明函數
function test1(){
    echo 這是一個標準的定義函數
}

# 快捷語法聲明函數
test2() {
    echo 這是一個快捷方式定義的函數
}
# 調用函數
test1
test2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章