1. 程式人生 > 實用技巧 >shell速查表

shell速查表

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 不需要可執行許可權。

reference:

[1] http://www.runoob.com/linux/linux-shell.html