Shell 是什麼?
- Shell 指一種應用程序,它提供了一個界面 用戶通過這個界面訪問操作系統內核的服務
- Shell 腳本(shell script) 用shell 編寫的腳本程序。 shell 通常都是指 shell 腳本
- Linux的精髓:將多個程序(命令)組裝成大型程序, 而Shell 就是最好粘合劑
- Shell的優點 簡單、高效、易維護、隨寫隨用
- Shell 開發流程:需求分析、問題建模、爲代碼流程邏輯、代碼實現與運行、總結
- 腳本所有種類查看:cat /etc/shells
- 正在使用的種類:echo $SHELL
- 編碼規範:多加註釋說明、命名建議規則:變量名大寫、局部變量小寫、函數名小寫、函數變量 加 local
- 編輯器 VS Code:宿主機中寫的代碼,同步到虛擬機中,需要設置共享文件夾,配置sftp:查看 -> 命令面板 -> SFTP config
使用:
- bash頭部默認用bash:#!/bin/bash
- 註釋:#單行註釋用於行首解釋說明,多行註釋用::<<EOF ...EOF
Shell 基礎語法:
- 變量:命名只能使用英文字母,數字和下劃線、首個字符不能以數字開頭、中間不能有空格,可以使用下劃線(_)、不能使用bash裏的關鍵字(help命令查看)
- 變量分類:局部變量、環境變量、特殊變量
- 局部變量:僅在當前shell實例中有效、在腳本或命令中定義、函數內的變量 加 local
- 變量的定義和使用:
#!/bin/bash # 1. 變量的定義 和使用 my_name=zhangchulan echo "1. $my_name" # 2. 另一種定義方式 course="linux start" echo 2. ${course} # 3. 只讀變量, 不加$ readonly course course="linux kernel" echo "3. ${course}" # 4. 刪除變量, 不加$ unset my_name echo "4. ${my_name}" 結果: 1. zhangchulan 2. linux start 2-variable.sh: line 13: course: readonly variabl
基本運算:
- 算術運算:expr 求值操作、+加、 -減、 *乘、 /除、 % 取餘
#!/bin/bash # 算術基本運算, 加減乘除取餘 a=11 b=5 # 加法 expr val=`expr $a + $b` echo "$a + $b = $val" # 另一種數值運算 $[var] val=$[a-b] echo "$a - $b = $val" 結果: 11 + 5 = 16 11 - 5 = 6
- 關係運算: -eq 相等、-ne 不相等、-gt 大於、-ge 大於等於、-lt 小於、-le 小於等於
#!/bin/bash
# 關係運算
a=11
b=5
#例子, 其他 ne, gt, ge, lt, le 類似
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等於 b"
else
echo "$a -eq $b: a 不等於 b"
fi
結果:
11 -eq 5: a 不等於 b
- 布爾與邏輯運算:! 非運算 [ ! false ]、-o 或運算、-a 與運算 [ $a -lt 100 -a $b -gt 15 ] 、&& 邏輯與 [[ $a -lt 100 && $b -gt 100 ]] 、|| 邏輯或 、== 相等(數字)、 != 不等(數字)
#!/bin/bash
# 布爾運算
a=11; b=5
#例子, 其他 ne, gt, ge, lt, le 類似
if [ $a -eq $b ]
then
echo "$a equal $b : a 等於 b"
else
echo "$a not equal $b: a 不等於 b"
fi
# 邏輯運算 注意 兩個 [[ ]]
if [[ $a -gt 0 && $b -gt 0 ]]
then
echo "a, b 都大於 0"
fi
結果:
11 not equal 5: a 不等於 b
a, b 都大於 0
- 字符串:單引號:原樣輸出,變量無效;雙引號:可以包含變量
#!/bin/bash
course="Linux入門"
# 單引號
question="Linux 如何入門?$course"
echo $question
# 雙引號
answer="請學習$course:課程!"
echo $answer
# 字符串拼接
echo "拼接後一起輸出:\n"$question"\n"$answer
結果:
Linux 如何入門?Linux入門
請學習Linux入門:課程!
拼接後一起輸出:
Linux 如何入門?Linux入門
請學習Linux入門:課程!
1 #!/bin/bash
2 # 字符串長度
3 str="hello wolrd"
4 echo "字符串"$str"的長度爲:"${#str}
5
6 # 獲取子串, 從第1個字符開始,截取3個。
7 echo "字符串"$str"子串:"${str:1:3}
8
9 # 查找子串
10 matched=`expr index "$str" wo`
11 echo "字符串" $str "查找wo的位置在" $matched
結果:
字符串hello wolrd的長度爲:11
字符串hello wolrd子串:ell
5
字符串 hello wolrd 查找wo的位置5
- 字符串運算符:
1 #!/bin/bash
2 # 算術基本運算, 加減乘除取餘
3 a=11
4 b=5
5
6 # 加法 expr
7 val=`expr $a + $b`
8 echo "$a + $b = $val"
9
10 # 另一種數值運算 $[var]
11 val=$[a-b]
12 echo "$a - $b = $val"
結果:
11 + 5 = 16
11 - 5 = 6
- 數組:定義, 下標從 0 開始、設置/讀取、讀取數組所有元素 @、讀取數組長度
1 #!/bin/bash
2 # 1. 數組的定義
3 arr=(aa bb cc "hello world")
4 # 2. 設置 元素
5 arr[2]="222"
6 # 3. 讀取 元素
7 echo "下標爲2的元素:"${arr[2]}
8 # 4. 讀取 所有元素, 用 @
9 echo "所有元素:"${arr[@]}
10 # 5. 獲取數組長度, 用 #
11 len=${#arr[@]}
12 echo "數組長度:$len"
結果:
下標爲2的元素:222
所有元素:aa bb 222 hello world
數組長度:4
- 分支:if else \ case
1 #!/bin/bash
2
3 age=20
4 if [ $age -le 10 ] # <=10
5 then
6 echo "少年"
7 elif [ $age -le 20 ] # <=20
8 then
9 echo "青年"
10 elif [ $age -le 50 ] # <=50
11 then
12 echo "中年"
13 else # >50
14 echo "老年"
15 fi
結果:
青年
1 #!/bin/bash
2
3 status=1
4 case $status in
5 0) echo "todo"
6 ;;
7 1) echo "doing"
8 ;;
9 2) echo "done"
10 ;;
11 esac
結果:
doing
- 循環
1 #!/bin/bash
2 # for 循環輸出 數組內容
3 arr=(aa bb cc)
4 for item in ${arr[@]}
5 do
6 echo "$item"
7 done
結果:
aa
bb
cc
- 函數:function 關鍵字可選、函數後面的 () 可選
-
1 #!/bin/bash 2 #函數的定義和調用 3 function myfun() 4 { 5 echo "這是 shell 函數!" 6 } 7 8 myfun 結果: 這是 shell 函數! 1 #!/bin/bash 2 #函數傳參 和返回值 3 function add() 4 { 5 local ret=$(($1+$2)) 6 return $ret 7 } 8 9 add 5 8 10 echo $? 結果: 13
常用命令
- printf:打印輸出
- date:查看日期
- cut: 截取 ,下標從1開始,舉例: echo zhangchulan|cut -c2-3
- 文本處理三劍客:grep 查找,sed編輯,awk報告
- random根據date獲取