shell速查表

作者:楊玉傑
鏈接:https://www.jianshu.com/p/a98a334bfb25
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 為執行腳本的第二個參數,以此類推……

另外,還有幾個特殊字符用來處理參數:

shell速查表

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 文件的各種屬性。

shell速查表

shell速查表

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


分享到:


相關文章: