小弟今天下班前就感覺頭有點陣痛,身體不舒服。切身感受到加班後還要回家寫鐵人賽真的不容易,真的很佩服寫完 30 天的大神們。今天就寫一些簡單的內容,希望大家見諒,回到家先吞一顆普拿疼撐著!
首先我們要在自己的桌面上建立一個 Shell 腳本檔案,然後在裡面撰寫要執行的程式。
# 移動到桌面
cd ~/Desktop
# 新增一個 Shell 檔案
touch myFirstScript.sh
# 用文字編輯器打開 Shell 檔案
nano myFirstScript.sh
建立好檔案以後我們就可以開始撰寫程式!首先要在檔案的最上方輸入
#!/bin/bash
告訴電腦這是一個由 Bash 撰寫的 Shell 程式檔,可以執行裡面的內容。
第一個問題就是問自己:「我為什麼寫腳本?」也許是因為要執行無聊乏味的指令,不想要自己手動操作,所以靠腳本來協助自動化執行。
第二個問題就是:「這個腳本要做什麼?」今天就來練習一個簡單的猜數字遊戲!
這個猜數字遊戲會介紹到列印、變數、函數、管道、for
、if-else
、while
。算是一個非常基本但是又有趣的小題目!
那剛剛說的那些東西是什麼呢?我們來看看以下列表
變數
:讓使用者可以輸入的值,在腳本中可以被執行或列印。函數
:昨天有提到過 Bash 其實有物件導向的概念,所以我們也可以透過呼叫 function
來執行我要的結果,程式碼也會更容易讀!管道
:一種篩選機制,能夠幫你過濾掉不必要的資訊。for
:是一種迴圈,設定你的條件例如:從 0~9 總共執行 10 次。if-else
:判斷式,如果發生什麼就執行什麼。while
:也是一種迴圈,但是和 for
不同的地方就是能用判斷式。判斷式的運算子
意義 | Java | Python | Bash |
---|---|---|---|
等於 | == |
== |
-eq |
不等於 | != |
!= |
-ne |
小於 | < |
< |
-lt |
小於等於 | <= |
<= |
-le |
大於 | > |
> |
-gt |
大於等於 | >= |
>= |
-ge |
條件式的寫法
語言 | for 迴圈 | while 迴圈 |
---|---|---|
Java | for (int i=0; i<5; i++) { ... } |
while (i < 5) { ... } |
Python | for i in range(5): ... |
while i < 5: ... |
Bash | for (( i=0; i<5; i++ )); do ... done |
while [ $i -lt 5 ]; do ...; i=$((i+1)); done |
變數的設定就是用 $
來表示,例如:
# 執行猜數字遊戲的時候輸入三個變數
bash guessNumber.sh $1 $2
# bash guessNumber.sh 100 10
你可以靠這種變數的方式,讓使用者輸入值,這樣就變的更彈性囉!
有了以上概念後,我們就可以來簡單的寫下一個猜數字小遊戲,裡面就會運用到上述的所有功能,也能讓自己看懂 bash 的執行方式。往後如果有看到 .sh
的腳本檔案,不妨用 cat
或是 nano
查看或編輯喔!
#!/bin/bash
# --- 變數 ---
TARGET=$(( RANDOM % 100 + 1 )) # 隨機數字 (1~100)
MAX_TRIES=5 # 最大嘗試次數
tries=0 # 玩家已經猜的次數
# --- 函數 ---
check_guess() {
# $1 = 玩家輸入的數字
if [ "$1" -eq "$TARGET" ]; then
echo "🎉 恭喜!你猜對了!答案是 $TARGET"
return 0 # 回傳 0 代表正確
elif [ "$1" -lt "$TARGET" ]; then
echo "太小了!再大一點~"
else
echo "太大了!再小一點~"
fi
return 1 # 回傳 1 代表還沒猜中
}
echo "==== 猜數字遊戲 ===="
echo "我心裡想了一個 1 到 100 的數字,給你 $MAX_TRIES 次機會!"
# --- while 迴圈 ---
while [ $tries -lt $MAX_TRIES ]; do
tries=$(( tries + 1 ))
# --- 管道 ---
echo "$guess" | wc -c
# 顯示玩家輸入了多少字元(包含換行符號)
# 讀取玩家輸入
read -p "第 $tries 次猜: " guess
# --- if-else 判斷正則表達式 (regex) ---
if ! [[ "$guess" =~ ^[0-9]+$ ]]; then
echo "請輸入整數!"
continue
fi
# 呼叫函數判斷
check_guess "$guess"
if [ $? -eq 0 ]; then
break # 猜對就跳出迴圈
fi
# --- for 迴圈 (小彩蛋:顯示剩餘機會的倒數) ---
for (( i=MAX_TRIES; i>tries; i-- )); do
echo "還剩 $(( i - tries )) 次機會!"
break # 只顯示一次就 break
done
done
# --- if-else 判斷遊戲結果 ---
if [ $tries -ge $MAX_TRIES ] && [ "$guess" -ne "$TARGET" ]; then
echo "😢 遊戲結束!答案是 $TARGET"
fi
在 Bash 裡 read variable
的意思是:把使用者輸入的字串讀進 variable 這個變數裡。read
後面跟的是「變數名稱」,不是變數的值。所以你直接寫 read guess
就好,不需要 $guess
或 "guess"
。
read guess # ✅ 正確,輸入存到變數 guess
read $guess # ❌ 錯誤,等於 read "",Bash 不知道要存去哪
read "guess" # ❌ 錯誤,等於 read guess 但帶了引號,會被當成字串
就像我們在 Java 裡面不會把變數加上 "
一樣:
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
希望這篇文章能夠幫助到大家更熟悉 Linux 的基礎,也能自己試著寫一個腳本來跑跑看,有錯誤也能自己修正囉!大家不妨試著把遊戲改成自己輸入答案和次數,挑戰你的同事或朋友吧!
LoveCode 愛寫扣論壇
鳥哥的 Linux 私房菜
HY 的鐵人賽文章