shell速查表
阿新 • • 發佈:2020-11-21
1. 變數
#!/bin/bash
msg="hello world"
echo $msg
變數名的命名須遵循如下規則:
- 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
2. 傳參
#!/bin/bash
echo "執行的檔名:$0";
echo "第一個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";
指令碼內獲取引數的格式為:
$n。n 代表一個數字,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推……
另外,還有幾個特殊字元用來處理引數:
引數 說明 $#
傳遞到指令碼的引數個數 $*
以一個單字串顯示所有向指令碼傳遞的引數。
如"$*"
用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有引數。$$
指令碼執行的當前程序ID號 $!
後臺執行的最後一個程序的ID號 $@
與 $*
相同,但是使用時加引號,並在引號中返回每個引數。
如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有引數。$-
顯示Shell使用的當前選項,與set命令功能相同。 $?
顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。
3. 陣列
#!/bin/bash my_array=(A B "C" D) echo "第一個元素為: ${my_array[0]}" echo "第二個元素為: ${my_array[1]}" echo "第三個元素為: ${my_array[2]}" echo "第四個元素為: ${my_array[3]}" echo "陣列的元素為: ${my_array[*]}" echo "陣列的元素為: ${my_array[@]}" echo "陣列元素個數為: ${#my_array[*]}" echo "陣列元素個數為: ${#my_array[@]}"
執行結果如下:
第一個元素為: A
第二個元素為: B
第三個元素為: C
第四個元素為: D
陣列的元素為: A B C D
陣列的元素為: A B C D
陣列元素個數為: 4
陣列元素個數為: 4
4. 基本運算子
原生 bash 不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
① 算數運算子
#!/bin/bash echo "2加2等於"`expr 2 + 2` echo "2減2等於"`expr 2 - 2` echo "2乘2等於"`expr 2 \* 2` echo "2除2等於"`expr 2 / 2` echo "2除2取餘"`expr 2 % 2`
② 關係運算符
#!/bin/bash
a=10
b=20
if [ $a -eq $b ] # 檢測兩個數是否相等,相等返回 true。
if [ $a -ne $b ] # 檢測兩個數是否不相等,不相等返回 true。
if [ $a -gt $b ] # 檢測左邊的數是否大於右邊的,如果是,則返回 true。
if [ $a -lt $b ] # 檢測左邊的數是否小於右邊的,如果是,則返回 true。
if [ $a -ge $b ] # 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。
if [ $a -le $b ] # 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。
③ 布林運算子
#!/bin/bash
if [ ! false ] # 非運算,返回 true
if [ true -o false ] # 或運算,返回 true
if [ true -a false ] # 與運算,返回 false
④ 邏輯運算子
#!/bin/bash
a=10
b=20
if [[ $a -lt $b && $a -gt $b ]] # 邏輯的 AND, 返回 false
if [ $a -lt $b ] && [ $a -gt $b ] # 邏輯的 AND, 返回 false
if [[ $a -lt $b || $a -gt $b ]] # 邏輯的 OR, 返回 true
if [ $a -lt $b ] || [ $a -gt $b ] # 邏輯的 OR, 返回 true
⑤ 字串運算子
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ] # 檢測兩個字串是否相等,相等返回 true。
if [ $a != $b ] # 檢測兩個字串是否相等,不相等返回 true。
if [ -z $a ] # 檢測字串長度是否為0,為0返回 true。
if [ -n "$a" ] # 檢測字串長度是否為0,不為0返回 true。
if [ $a ] # 檢測字串是否為空,不為空返回 true。
⑥ 檔案測試運算子
檔案測試運算子用於檢測 Unix 檔案的各種屬性。
操作符 | 說明 |
---|---|
-b file | 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 |
-c file | 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 |
-d file | 檢測檔案是否是目錄,如果是,則返回 true。 |
-f file | 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。 |
-g file | 檢測檔案是否設定了 SGID 位,如果是,則返回 true。 |
-k file | 檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。 |
-p file | 檢測檔案是否是有名管道,如果是,則返回 true。 |
-u file | 檢測檔案是否設定了 SUID 位,如果是,則返回 true。 |
-r file | 檢測檔案是否可讀,如果是,則返回 true。 |
-w file | 檢測檔案是否可寫,如果是,則返回 true。 |
-x file | 檢測檔案是否可執行,如果是,則返回 true。 |
-s file | 檢測檔案是否為空(檔案大小是否大於0),不為空返回 true。 |
-e file | 檢測檔案(包括目錄)是否存在,如果是,則返回 true。 |
5. echo
① 命令格式
#!/bin/bash
echo "It is a test"
echo It is a test
echo "\"It is a test\"" # 轉義
name=Chris
echo "$name is handsome"
echo -e "OK! \n" # 顯示換行 -e 開啟轉義
echo "It is a test" > myfile # 顯示結果定向至檔案
echo '$name\"' # 原樣輸入字串,不進行轉義或取變數(使用單引號)
echo `date` # 顯示命令執行結構
② 顏色顯示
echo -e "\033[字背景顏色;文字顏色m字串\033[0m"
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 紅色字 \033[0m”
echo -e “\033[32m 綠色字 \033[0m”
echo -e “\033[33m 黃色字 \033[0m”
echo -e “\033[34m 藍色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天藍字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 紅底白字 \033[0m”
echo -e “\033[42;37m 綠底白字 \033[0m”
echo -e “\033[43;37m 黃底白字 \033[0m”
echo -e “\033[44;37m 藍底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天藍底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”
\33[0m 關閉所有屬性
\33[1m 設定高亮度
\33[4m 下劃線
\33[5m 閃爍
\33[7m 反顯
\33[8m 消隱
\33[30m — \33[37m 設定前景色
\33[40m — \33[47m 設定背景色
\33[nA 游標上移n行
\33[nB 游標下移n行
\33[nC 游標右移n行
\33[nD 游標左移n行
\33[y;xH設定游標位置
\33[2J 清屏
\33[K 清除從游標到行尾的內容
\33[s 儲存游標位置
\33[u 恢復游標位置
\33[?25l 隱藏游標
\33[?25h 顯示游標
6. sprintf
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
結果:
姓名 性別 體重kg
郭靖 男 66.12
楊過 男 48.65
郭芙 女 47.99
%s %c %d %f
都是格式替代符
d
: Decimal 十進位制整數 -- 對應位置引數必須是十進位制整數,否則報錯!
s
: String 字串 -- 對應位置引數必須是字串或者字元型,否則報錯!
c
: Char 字元 -- 對應位置引數必須是字串或者字元型,否則報錯!
f
: Float 浮點 -- 對應位置引數必須是數字型,否則報錯!
%-10s
指一個寬度為10個字元(-表示左對齊,沒有則表示右對齊),任何字元都會被顯示在10個字元寬的字元內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
%-4.2f
指格式化為小數,其中.2指保留2位小數。
7. test
Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字元和檔案三個方面的測試。
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
8. 流程控制
① if-else
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
elif [ $a -lt $b ]
then
echo "a 小於 b"
else
echo "沒有符合的條件"
fi
② for
#!/bin/bash
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
③ while
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
④ case
#!/bin/bash
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read aNum
case $aNum in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數字'
;;
esac
⑤ break
break命令允許跳出所有迴圈(終止執行後面的所有迴圈)。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"
break
;;
esac
done
⑥ continue
跳出當前迴圈。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的!"
continue
echo "遊戲結束"
;;
esac
done
⑦ until
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
9. 函式
#!/bin/bash
funWithParam(){
echo "第一個引數為 $1 !"
echo "第二個引數為 $2 !"
echo "第十個引數為 $10 !"
echo "第十個引數為 ${10} !"
echo "第十一個引數為 ${11} !"
echo "引數總數有 $# 個!"
echo "作為一個字串輸出所有引數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
結果:
第一個引數為 1 !
第二個引數為 2 !
第十個引數為 10 !
第十個引數為 34 !
第十一個引數為 73 !
引數總數有 11 個!
作為一個字串輸出所有引數 1 2 3 4 5 6 7 8 9 34 73 !
10. 輸入輸出
#!/bin/bash
who > today.log # 執行結果覆蓋到檔案 today.log
echo "菜鳥教程:www.runoob.com" >> today.log # 執行結果追加到檔案 today.log
wc -l < today.log # 統計 today.log 行數
wc -l << EOF
李白
蘇軾
王勃
EOF
11. 檔案包含
test1.sh
#!/bin/bash
name="Chris"
test2.sh
#!/bin/bash
#使用 . 號來引用test1.sh 檔案
. ./test1.sh
# 或者使用以下包含檔案程式碼
# source ./test1.sh
echo $name
注:被包含的檔案 test1.sh 不需要可執行許可權。