前言
shell變數的型別:
- 自定義變數:由用戶自己定義,修改和使用
- 環境變數:由系統維護,用于設定作業環境
- 只讀變數:只可以讀取不可以更改
- 位置變數:通過命令列給腳本傳遞引數
- 預定義變數:Bash中內置的一類變數,不能修改 有些規定好的變數放在那里讓你使用
補充:系統內置變數:PATH,UID,HOSTNAME,USER
一、變數基礎
1.1命名要求
- 區分大小寫
- 不能使程式中的保留字和內置變數如:if, for,hostname 命令 a=
- 只能使用數字、字母及下劃線,且不能以數字開頭,注意:不支持短橫線 “ - ”,和主機名相反
- 不要使用內置的變數,使用英文盡量使用詞義通俗易懂,PATH
- 大駝峰 StudentFirstName
- 小駝峰 studentFirstName
- 下劃線 student_name
1.2定義變數
- name='value' 【變數名=變數值】
- $name(變數參考)
- ${name}(變數參考)
- 直接字串:name='root'
- 變數參考:name="$USER"
- 命令參考:name=`COMMAND` 或者 name=$(COMMAND)
注意:變數賦值是臨時生效,當退出終端后,變數會自動洗掉,無法持久保存,腳本中的變數會隨著腳本結束,也會自動洗掉
1.3弱參考和強參考
- "$name " 弱參考:其中的變數參考會被替換為變數值
- '$name ' 強參考:其中的變數參考不會被替換為變數值,而保持原字串

補充:
- 賦值時使用雙引號(" ")可以直接呼叫變數
- 賦值時使用單引號(' ')$只會被認為是字符$ 不會呼叫變數
- 賦值時使用(``反撇在tab上面)命令替換,提取命令執行后的輸出結 果$( ) 用法相同
- {}可以分隔變數值
格式:變數名+=追加值 [root@server ~]#title=CTO [root@server ~]#title+=feizirui [root@server ~]#echo $title
1.4read -p(從鍵盤輸入的內容變成變數)


1.5變數作用范圍
默認情況下,新定義的變數只在當前的shell環境中有效,因此稱為區域變數,當進入子程式或新的shell環境中,區域變數將無法再起作用,可以通過內部命令export將指定的變數為全域變數,使用戶定義的變數在所子shell環境中可以繼續使用,
方法:
- 格式1:export 變數名
- 格式2:export 變數名=變數值
舉例:

1.6整數的運算
expr只能進行整數的運算 格式: expr 變數1 運算子 變數2 [運算子 變數3] 運算子: 加法:+ 減法:- 乘法:\ * 除法:/ 取余(取模):%









1.7環境變數
環境變數:
可以使子行程(包括孫子行程)繼承父行程的變數,但是無法讓父行程使用子行程的變數
一旦子行程修改從父行程繼承的變數,將會新的值傳遞給孫子行程
一般只在系統組態檔中使用,在腳本中較少使用
1. 由系統提前創建,用來設定用戶的作業環境
2. 可以使用env查看環境變數
3. 需要記住的常用環境變數
- $USER 表示用戶名稱
- $HOME 表示用戶的宿主目錄
- $LANG 表示語言和字符集
- $PWD 表示當前所在作業目錄
- $PATH 表示可執行用戶程式的默認路徑

1.8環境變數的全域組態檔
組態檔位置在
- /etc/profile:修改此檔案會作用于所有用戶
- ~/.bash_profile:用戶獨立的組態檔,修改這個檔案只作用于當前用戶,可以用來長期變更或設定環境變數


![]()

1.9只讀變數
變數值不允許修改(重新賦值)的情況,無法使用 unset洗掉,最快方法重啟

1.10位置變數
位置變數也稱為位置引數,使用$1、$2、$3、…、$9 表示




1.11預定義變數
系統幫你定義好了 拿來用就可以了,你不需要知道為什么,記住以下:
- $*:表示所有位置引數的內容看成一個整體回傳,回傳所有 (45667) $1
- $@:表示所有位置引數的內容分割成n份,每份作為一個獨立的個體回傳,回傳所有 4 5 6 6 7
- $?:表示前一條命令執行后的回傳狀態,回傳值為 0 表示執行正確,回傳任何非 0值均表示執行出現例外
- $#:表示命令列中位置引數的總個數
- $0:表示當前執行的腳本或程式的名稱,當前腳本的名字
- $$:當前行程id
- $!:后臺任務最后一個id

二、條件陳述句
2.1測驗
- 格式1:test 條件運算式
- 格式2:[ 條件運算式 ],注意[]空格,否則會失敗
2.2運算子
- -d:測驗是否為目錄(Directory)
- -e:測驗目錄或檔案是否存在(Exist)
- -a:測驗目錄或檔案是否存在(Exist)
- -f:測驗是否為檔案(File)
- -r:測驗當前用戶是否有權限讀取(Read)
- -w:測驗當前用戶是否有權限寫入(Write)
- -x:測驗當前用戶是否有權限執行(eXcute)
- -L:測驗是否為軟連接檔案
2.3屬性測驗補充
- -s FILE:#是否存在且非空
- -t fd #:fd 檔案描述符是否在某終端已經打開
- -N FILE:#檔案自從上一次被讀取之后是否被修改過
- -O FILE:#當前有效用戶是否為檔案屬主
- -G FILE:#當前有效用戶是否為檔案屬組
條件測驗:判斷某需求是否滿足,需要由測驗機制來實作,專用的測驗運算式需要由測驗命令輔助完成
測驗程序:實作評估布爾宣告,以便用在條件性環境下進行執行
- 若真,則狀態碼變數 $? 回傳0
- 若假,則狀態碼變數 $? 回傳1
- 條件測驗命令


2.4比較整數數值
[ 整數1 運算子 整數2 ] 公式
- -eq:第一個數等于(Equal)第二個數
- -ne:第一個數不等于(Not Equal)第二個數
- -gt:第一個數大于(Greater Than)第二個數
- -lt:第一個數小于(Lesser Than)第二個數
- -le:第一個數小于或等于(Lesser or Equal)第二個數
- -ge:第一個數大于或等于(Greater or Equal)第二個數

2.5字串比較
1、常用的測驗運算子
- =:字串內容相同
- !=:字串內容不同,! 號表示相反的意思
- -z:字串內容為空
- -n: 字符是否存在
2、格式:
- [ 字串1 = 字串2 ] 是否相同
- [ 字串1 != 字串2 ] 是否不相同
- [ -z 字串 ] 是否為空
- [ -n 字串 ] 字符是否存在

2.6邏輯測驗(短路運算)
- 格式1:[ 運算式1 ] 運算子 [ 運算式2 ] ...
- 格式2:命令1 運算子 命令2 ...
常見條件:
- -a或&&:邏輯與,“而且”的意思全真才為真
- -o或||:邏輯或,“或者”的意思一真即為真
- !:邏輯否
(1)短路與 &&

1 CMD1 短路與 CMD2:&&同時滿足命令1和命令2 的要求,才會回傳正確 2 全真才為真,一假即為假 3 第一個CMD1結果為真 ,第二個CMD2必須要參與運算,才能得到最終的結果 4 第一個CMD1結果為假 ,總的結果必定為假,因此不需要執行CMD2
(2)短路或 ||

1 CMD1 短路或 CMD2 2 一真即為真 3 第一個CMD1結果為真 (1),總的結果必定為1,因此不需要執行CMD2 4 第一個CMD1結果為假 (0),第二個CMD2 必須要參與運算,才能得到最終的結果

1 ping 小腳本 2 -c 發送包的個數 3 -i 發送的間隔時間 4 -W 超時時間 5 -w 多少秒后停止ping操作



![]()

三、if陳述句分支結構
3.1if介紹

單分支結構: if 判斷條件; then 條件為真的分支代碼 fi
雙分支結構: if 判斷條件; then 條件為真的分支代碼 else 條件為假的分支代碼 fi
多分支結構: if 判斷條件1 then 條件1為真的分支代碼 elif 判斷條件2 then 條件2為真的分支代碼 elif 判斷條件3;then 條件3為真的分支代碼 ... else 以上條件都為假的分支代碼 fi
例1:


例2:


例3:


3.2case
格式: case 變數參考 in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 默認分支 ;;
case支持glob風格的通配符:
- * 任意長度任意字符
- ? 任意單個字符
- [0-9] 指定范圍內的任意單個字符
- |表示:或者意思,如: a|b
例1:


例2:

3.3echo
echo -n:表示不換行輸出 echo -e:表示輸出轉義符

data日期命令:
- date:查看當前系統時間
- -d :你描述的日期,顯示指定字串所描述的時間,而非當前時間
- %F:完整日期格式,等價于 %Y-%m-%d
- %T:時間(24小時制)(hh:mm:ss)


四、回圈陳述句
4.1for回圈
回圈含義:將某代碼段重復運行多次,通常有進入回圈的條件和退出回圈的條件
常見的回圈的命令:for, while, until

執行機制: 依次將串列中的元素賦值給“變數名”; 每次賦值后即執行一次回圈體; 直到串列中的元素耗盡,回圈結束; 如果省略 [in WORDS ... ] ,此時使用位置引數變數 in "$@" for (( 運算式1; 運算式2; 運算式3 )); do 命令; done




例1:
方法一:


方法二:


方法三:


4.2while和until
相對于for,需要知道回圈次數,我們只知道停止條件,不知道次數,就需要使用while,直到達到條件
while:當命令判斷為假時停止 until:當命令判斷為真時停止
雙重回圈及跳出回圈:
- break跳出單個回圈后面加數字2則代表跳出兩層回圈
- continue終止某次回圈中的命令,但是不會完全終止命令
例1:


例2:

4.3select 選單選擇
PS1 提示符
PS2 多行重定向
PS3 選單選擇



例1:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523192.html
標籤:其他
上一篇:ensp 鏈路聚合
下一篇:2022.10.30每日一題

