diff --git a/Linux/Bash Script/10-While.md b/Linux/Bash Script/10-While.md new file mode 100644 index 0000000..7ad88a7 --- /dev/null +++ b/Linux/Bash Script/10-While.md @@ -0,0 +1,138 @@ +# Bash `while` Loop Guide + +A clear, concise, and visually pleasant reference for using `while` loops in Bash. + +--- + +## 1. Overview + +The `while` loop in Bash repeatedly executes a block of commands **as long as a condition evaluates to true**. It is a fundamental control structure for iteration when the number of repetitions is not known in advance. + +### General form + +```bash +while [ condition ] +do + command1 + command2 + ... +done +``` + +* The condition is evaluated before each iteration. If it returns a zero (truthy) exit status, the loop body runs. Otherwise, the loop exits. +* Square brackets (`[ ... ]`) are a synonym for the `test` command; spacing matters. + +--- + +## 2. Examples + +### 2.1 Simple counter + +Counts from 1 to 5 and prints the current value. + +```bash +counter=1 + +while [ $counter -le 5 ] +do + echo "Counter: $counter" + ((counter++)) +done +``` + +**What it does:** + +* Initializes `counter` to 1. +* The loop continues while `counter` is less than or equal to 5. +* Prints and increments the counter each iteration. + +### 2.2 Waiting for a file to appear + +Polls for the existence of `/tmp/myfile.txt` once per second. + +```bash +while [ ! -f /tmp/myfile.txt ] +do + echo "Waiting for file..." + sleep 1 +done + +echo "File exists!" +``` + +**What it does:** + +* Checks if the file does **not** exist (`! -f`). +* Sleeps for one second between checks to avoid busy-waiting. +* When the file appears, exits the loop and prints confirmation. + +### 2.3 Interactive prompt with exit condition + +Keeps prompting the user until they type `q`. + +```bash +while true +do + read -p "Type 'q' to quit: " input + if [ "$input" = "q" ]; then + break + fi +done +``` + +**What it does:** + +* Uses an infinite loop (`while true`). +* Prompts the user each time. +* Exits the loop when the input equals `q` using `break`. + +--- + +## 3. Tips & Best Practices + +* **Quote variables** to avoid word splitting and issues when they are empty: `[ "$foo" = "bar" ]`. +* **Use arithmetic expressions** with `(( ... ))` when dealing with numbers (`((counter++))` is more concise than `counter=$((counter + 1))`). +* **Avoid busy loops:** if waiting on external state, insert a `sleep` to reduce CPU usage. +* **Use `set -u` and `set -e`** in scripts to catch undefined variables and stop on errors, but be careful when using them with conditional tests. +* **Test conditions explicitly:** e.g., use `-f`, `-d`, `-r`, `-s`, etc., for file-related checks. + +--- + +## 4. Common Pitfalls + +* Missing spaces inside `[ ]` — `while [$counter -le 5]` is invalid; it must be `[ $counter -le 5 ]`. +* Forgetting to initialize loop variables, leading to unexpected behavior when using them in tests. +* Using `read` without handling empty input; consider providing a default or validating. +* Infinite loops without an exit strategy (e.g., missing `break` or condition never false). + +--- + +## 5. Variations + +* **Until loop:** opposite of `while` — runs until a condition becomes true. + + ```bash + until [ -f /tmp/myfile.txt ] + do + echo "Waiting..." + sleep 1 + ``` + +done + +- **Command-based condition:** you can use any command whose exit status matters. + +```bash +while ping -c1 example.com >/dev/null 2>&1 +do + echo "Host is reachable" + sleep 5 +done +```` + +--- + +## 6. Summary + +Use `while` loops when the number of iterations depends on dynamic conditions (user input, file existence, external services). Combine with proper quoting, sleeping, and exit strategies to write robust and readable scripts. +