作者:楊玉傑
鏈接:https://www.jianshu.com/p/a98a334bfb25
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 為執行腳本的第二個參數,以此類推……
另外,還有幾個特殊字符用來處理參數:
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 文件的各種屬性。
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 不需要可執行權限。
閱讀更多 Java面經 的文章