Shell程式設計規範與變數

无敌小鲁班發表於2024-05-08

目錄
  • 1.Shell指令碼概述
  • 2.Shell程式設計規範
    • (1)編寫指令碼程式碼
    • (2)指令碼編寫結構
    • (3)Shell指令碼的執行
  • 3.重定向與管道
    • (1)互動式硬體裝置
    • (2)重定向操作
    • (3)管道操作“|”
  • 4.Shell指令碼變數
    • (1)自定義變數
      • (1)定義一個新的變數
      • (2)賦值時使用引號
      • (3)設定變數的作用範圍
      • (4)整數變數的運算
    • (2)特殊變數
      • (1)環境變數
      • (2)只讀變數
      • (3)位置變數
      • (4)預定義變數

完成自動化運維工作,批次完成重複操作,結合crontab完成周期性任務

1.Shell指令碼概述

Shel指令碼的概念:將要執行的命令按順序儲存到一個文字檔案;給該檔案可執行許可權;可結合各種Shell控制語句以完成更復雜的操作。
Shell指令碼應用場景:重複性操作;互動性任務;批次事務處理;服務執行狀態監控;定時任務執行...

(1)Shell的作用——命令直譯器,“翻譯官”
介於系統核心與使用者之間,負責解釋命令列

(2)使用者登入Shell
登入後預設使用的Shel程式,一般為 /bin/bash
不同Shell的內部指令、執行環境等會有所區別


sh:UNIX最初使用的 shell,已經被bash所替換。
bash:基準於GNU的框架下發展出的Shell,是 sh 的擴充套件。
csh:語法有點類似於c語言的Shell。
tcsh:整合了csh,提供更多的功能。
nologin:奇怪的shell,這個shell可以讓使用者無法登入主機。

2.Shell程式設計規範

(1)編寫指令碼程式碼

使用vim文字編輯器
每行一條Linux命令,按執行順序依次編寫 vim XXX.sh
賦予可執行許可權,使指令碼具有可執行屬性chmod +x XXX.sh

程式語言型別:
編譯型:C C++ JAVA GO 程式碼檔案需要先編譯後,程式才能執行
解釋型:SHELL PYTHON 程式碼是邊解釋邊執行

(2)指令碼編寫結構

(1)申明直譯器
#!/bin/bash
#!/bin/python

(2)編寫註釋資訊:要以 # 號開頭表示為註釋,被註釋的語句在指令碼執行時是不會被執行的。

(3)編寫執行語句:按照順序編寫要執行的命令語句。

(3)Shell指令碼的執行

(1)bash 或 sh 指定指令碼檔案執行,可無執行許可權
絕對路徑或相對路徑指定指令碼檔案執行,要求有執行許可權
以上兩種方式都是在子Shell環境中執行指令碼

(2)source 或 . 指定指令碼檔案執行,可無執行許可權
會在當前shell環境中執行指令碼

3.重定向與管道

(1)互動式硬體裝置

標準輸入:從裝置接收使用者輸入的資料
標準輸出:透過該裝置向使用者輸出是資料
標準錯誤:透過該裝置報告執行出錯資訊

(2)重定向操作

命令 > 檔案 2>&1  效果等效於混合輸出
ls -lh > test.txt 2>&1
ls -lh             標準輸出       到螢幕  1 →螢幕
ls -lh > test.txt  重定向輸出     到 test.txt   1 → test.txt
2>&1               錯誤輸出 重定向到 標準輸出   2 → 1

(3)管道操作“|”

將左側的命令輸出結果,作為右側命令的處理物件

4.Shell指令碼變數

變數的作用:用來存放系統和使用者需要使用的特定引數(值)
變數名:使用固定的名稱,由系統預設或使用者定義
變數值:能夠根據使用者設定、系統環境的變化而變化
變相的型別:
自定義變數:由使用者自己定義、修改和使用
特殊變數:環境變數,只讀變數,位置變數,預定義變數

(1)自定義變數

(1)定義一個新的變數

變數名以字母或下劃線開頭,區分大小寫,建議大寫
變數名=變數值

檢視變數的值
echo $變數名


(2)賦值時使用引號

雙引號 "$XXX"   會把$看作為引用XXX變數值的特殊符號
單引號 '$XXX'   會把$看作為一個普通字元,不會引用變數的值
反撇號 `...`    命令替換,提取裡面的命令執行後的結果,效果等於$(...)

read -p "提示資訊" 變數名 #從鍵盤輸入中獲取變數值


(3)設定變數的作用範圍

預設情況下自定義的變數只能在當前shell環境中有效

讓自定義的變數在所有shell環境中有效的方法:
(1)在 /etc/profile 檔案中定義 export 變數名=變數值 匯出為全域性變數
source /etc/profile 立即生效 或 重新登入系統自動生效

(2)在 /etc/bashrc 檔案中定義 變數名=變數值
切換 shell 環境自動生效

(4)整數變數的運算

expr 變數1 運算子 變數2

運算子
+ 加法運算
- 減法運算
* 乘法運算
/ 除法運算
% 求模(取餘)運算

整數運算
echo $(expr 整數1 運算子 整數2)   $(expr $變數1 運算子 $變數2)   +  -  \*  /  %
echo $[整數1 運算子 整數2]        $[變數1 運算子 變數2]          +  -  *  /  %   
echo $((整數1 運算子 整數2))      $((變數1 運算子 變數2))        +  -  *  /  %   

let a=10+5
let a++    相當於   a=$[a+1]
let a--    相當於   a=$[a-1]
let a+=2   相當於   a=$[a+2]




浮點數運算
echo '4.5+2.1' | bc
awk 'BEGIN{print 4.5+2.1}'

(2)特殊變數

(1)環境變數

由系統提前建立,用來設定使用者的工作環境
配置檔案:/etc/profile、~/.bash_profile
常見的環境變數:
PWD、PATH
USER 、SHELL、HOME

env #檢視當前shell


(2)只讀變數

用於變數值不允許被修改的情況
readonly
只讀變數不可以被重新賦值
只讀變數不可以被刪除

(3)位置變數

(4)預定義變數

當天日期 date +"%Y%m%d"  
明天日期  date -d "1 day" +"%Y%m%d"              
昨天日期  date -d "-1 day" +"%Y%m%d"    
當月第一天  date +"%Y%m01"                
下個月第一天  date -d "1 month" +"%Y%m01"  
當月最後一天  date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d"   



相關文章