天天看點

linux-shell程式設計基礎(基本文法)

1 shell程式設計用途

通過終端編寫腳本程式,輔助開發人員完成工程自動化操作

2 編寫規範

  • 腳本程式是Unix/Linux系統中的特殊檔案,需要妥善管理
  • 放在指定路徑的scripts/目錄下
  • 字尾名統一使用.sh
  • 第一行代碼 #!/bin/bash 指定程式執行

3 執行方式

  • 通過指令執行
    • bash 檔案名
    • sh 檔案名
  • 直接執行(需要執行權限)
    • ./檔案名

4 注釋

  • 除第一行的#!/bin/bash,單行注釋以 # 開頭
  • 多行注釋(多行注釋方法較多,這裡隻是其中一種)
    • :<<自定義字元 注釋内容 自定義字元

5 标準輸出

  • 列印完換行
    • echo “要列印的資訊”
  • 列印完不換行
    • echo -n “要列印的資訊”
  • 可以不加雙引号,但規範寫法要添加

6 标準輸入

  • 顯示輸入資訊:
    • read -p “提示資訊”
  • 不顯示輸入資訊
    • read -s “提示資訊”

7 變量

  • 命名規則
    • 遵循變量命名規則(見名知義、字母數字下劃線組成、數字不能開頭)
  • 指派
    • 變量名=值
    • 兩邊不需要空格
# 可以用雙引号也可以不用雙引号
name=Jack 
           
  • 使用變量
    • 在變量名前面添加 $ 符号 "
    • 與其他字元串拼接使用 ${name}_001
echo "name:$name
echo "${name}_001"
           
  • 引号
    • 雙引号-強引用:輸出指派
    • 單引号-弱引用:不輸出指派

8 選擇結構

8.1 單分支結構

  • 判斷表達式中符号的兩端或**[ ]内兩端**要有空格,指派沒有空格
if 條件
then
    條件為True執行的代碼
fi
           

8.2 雙分支結構

if [ 條件1 ];then
    條件1為True執行的代碼
else
   條件不滿足執行代碼
fi
           

8.3 多分支結構

if [ 條件1 ];then
    條件1為True執行的代碼
elif [ 條件2 ];then
    條件2為True執行的代碼
elif ....
else
    任何條件都不滿足執行的代碼
fi
           

8.3 判斷符号

8.3.1 檔案判斷

  • 判斷檔案是否存在 if [ -e 檔案路徑 ]
  • 判斷是否檔案 if [ -f 檔案路徑 ]
  • 判斷是否檔案夾 if [ -d 檔案路徑 ]
  • 判斷檔案是否可讀 if [ -r 檔案路徑 ]
  • 判斷檔案是否可寫 if [ -d 檔案路徑 ]
  • 判斷檔案是否可執行 if [ -x 檔案路徑 ]

8.3.2 字元串判斷

  • 判斷兩個字元是否相等 if [ s1 = s2 ]
  • 判斷兩個字元是否不相等 if [ s1 != s2 ]
  • 判斷字元串長度是否為0 if [ -z s ]
  • 判斷字元串是否為空 if [ -n s ]

8.3.3 整數判斷

  • 判斷是否相等 [ num1 -eq num2 ]
  • 判斷是否不相等 [ num1 -eq num2 ]
  • 判斷是否大于 [ num1 -eq num2 ]
  • 判斷是否小于 [ num1 -eq num2 ]
  • 判斷是否大于等于 [ num1 -eq num2 ]
  • 判斷是否小于等于 [ num1 -eq num2 ]

8.3.4 邏輯判斷

  • 并且關系 [ a && b ] 或 [ a -a b ]
  • 或者關系 [ a || b ] 或 [ a -o b ]
  • 取反 [ ! a ]

8.4 case流程控制

case 變量 in
	變量1)
		代碼1
        ;;
    變量2)
        代碼2
        ;;
     *)
        全部都沒有比對成功的代碼
        ;;
esac
           

9 循環結構

9.1 for循環

for 臨時變量 in (資料組)
do 
循環執行代碼
done
           

9.2 while循環

while 條件
do
 循環執行的代碼
done
           

10 整數運算

  • 運算符号
    • 求和 num1 + num2
    • 求差 num1 - num2
    • 求積 num1 * num2 或 num1 * num2
    • 求商 num1 / num2
    • 取餘 num1 % num2
  • 表達式
    • expr 表達式

      expr n u m 1 + num1+ num1+num2 # 操作符号兩邊不加空格是拼接

      expr $num1 + $num2 # 相加(其他運算同理)

      expr $num1 \ $num2* # expr乘法運算*不能直接使用,否則會報錯,需要轉義後才能相乘

    • $(()) 表達式,可以直接運算,可以指派
      • res=$((num1 + num2))
    • $[] 表達式,可以直接運算,可以指派
      • res=$[num1+num2]
    • let 關鍵字
let i++
 let num+=1 
           

11 函數

11.1 函數聲明

  • 标準文法
function 函數名稱(){
	函數中的代碼
}
           
  • 簡潔方式
函數名稱(){
   函數中的代碼
}
           
  • shell中函數參數傳遞有自己的方式,不要在括号内添加形式參數

11.2 函數調用

  • 直接使用函數名稱調用,後面不需要加()

11.3 函數傳遞

  • 參數不需要在函數内聲明,直接通過函數擷取
  • 調用函數的同時傳遞參數,參數直接放在函數名稱後面,用空格分隔
函數名 參數1 參數2 參數3
           

11.4 函數傳回值

  • $* 擷取所有的參數
  • [email protected] 擷取所有的參數
  • $# 擷取參數的個數
  • $n 擷取第n個參數
  • $? 擷取上一個指令或五福執行結果,傳回0,執行正常或服務運作中,傳回1,執行不正常,傳回3,服務已停止;傳回4,服務不存在

12 指令替換

先完成 `` 裡面的指令行,然後将其結果替換出來

繼續閱讀