iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0

小弟今天下班前就感覺頭有點陣痛,身體不舒服。切身感受到加班後還要回家寫鐵人賽真的不容易,真的很佩服寫完 30 天的大神們。今天就寫一些簡單的內容,希望大家見諒,回到家先吞一顆普拿疼撐著!

✒️ 建立一個新的檔案

首先我們要在自己的桌面上建立一個 Shell 腳本檔案,然後在裡面撰寫要執行的程式。

# 移動到桌面
cd ~/Desktop

# 新增一個 Shell 檔案
touch myFirstScript.sh

# 用文字編輯器打開 Shell 檔案
nano myFirstScript.sh

建立好檔案以後我們就可以開始撰寫程式!首先要在檔案的最上方輸入

#!/bin/bash

告訴電腦這是一個由 Bash 撰寫的 Shell 程式檔,可以執行裡面的內容。

🍀 詢問自己的需求

第一個問題就是問自己:「我為什麼寫腳本?」也許是因為要執行無聊乏味的指令,不想要自己手動操作,所以靠腳本來協助自動化執行。

第二個問題就是:「這個腳本要做什麼?」今天就來練習一個簡單的猜數字遊戲

這個猜數字遊戲會介紹到列印、變數、函數、管道、forif-elsewhile。算是一個非常基本但是又有趣的小題目!

⚙️ 基礎指令介紹

那剛剛說的那些東西是什麼呢?我們來看看以下列表

  1. 變數:讓使用者可以輸入的值,在腳本中可以被執行或列印。
  2. 函數:昨天有提到過 Bash 其實有物件導向的概念,所以我們也可以透過呼叫 function 來執行我要的結果,程式碼也會更容易讀!
  3. 管道:一種篩選機制,能夠幫你過濾掉不必要的資訊。
  4. for:是一種迴圈,設定你的條件例如:從 0~9 總共執行 10 次。
  5. if-else:判斷式,如果發生什麼就執行什麼。
  6. 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

❓ 為什麼在 read 的時候不用把 guess 加上 " 和 $?

在 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 的鐵人賽文章


上一篇
【Day.11】自動化掃描,用 BashShell 解除你的雙手!
下一篇
【Day.13】網路 TCP/UDP/IP 封包是什麼?
系列文
從零開始的 Linux 世界14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言