Instiq
Chapter 1 · Shells and Shell Scripting·v1.0.0·Updated 7/6/2026·~14 min

What's changed: Initial version (topic 1.06, subtopics 1.06.1–1.06.2)

1.2Shell Scripting

Key points

Learn shell scripting—the heaviest topic on exam 102 (weight 6): the shebang (#!), execute permissions (chmod, chown), positional parameters ($0, $1..$n, $#, $*, $@, shift), exit status ($?, exit), conditionals (if, case), loops (for, while), shell functions, PATH-independent scripts, and debugging (bash -x, bash -v).

Shell scripts automate routine work and carry weight 6—the highest of any subtopic on exam 102. The goal is building parts that even non-Linux users can run safely; questions probe the behavior of arguments, return values, and branching, not rote syntax.

1.2.1The skeleton of a script

  • The shebang (#!/bin/bash) names the interpreter for this script—the same mechanism serves sh, python, etc.
  • Running needs read + execute permission (chmod +x script.sh./script.sh); manage ownership with chown. Without execute permission, bash script.sh still works (read is enough).
  • Positional parameters: $0 (script name), $1$n (nth argument), $# (argument count), $*/$@ (all arguments). shift moves them left by one ($2 becomes $1).
  • Exit status: $? holds the last command's result (0 = success, non-zero = failure). A script sets its own with exit N.

1.2.2Branching, loops, functions

  • if: if [ "$1" = "start" ]; then …; elif …; else …; fi ([ ] is the test command; closes with fi).
  • case branches one value by patterns: case "$1" in start) …;; stop) …;; *) …;; esac (closes with esac; default is *)).
  • for iterates a list (for f in *.log; do …; done); while repeats while true (while read line; do …; done < file). Both close with done.
  • A shell function names a routine (backup() { tar czf "$1.tar.gz" "$1"; }; the function keyword also works). Inside, $1 refers to the function's own argument.
  • PATH-independent scripts call commands by absolute path or set PATH themselves at the top (so user environments cannot break them). Debug with bash -x (prints each expanded command as executed) and bash -v (echoes lines as read).
Exam point

Answer instantly: $# = argument count, $0 = script name, $? = last exit status (0 = success). Also standard: if→fi, case→esac, for/while→done, execution trace = bash -x, consuming arguments with shift in a loop. Beware distractors claiming exit 1 means success (0 does).

Assemble a 30-line practical script mentally—a service wrapper svc.sh start nginx: start with the shebang; then validate arguments with if [ $# -ne 2 ]; then echo "Usage: $0 {start|stop} name"; exit 1; fi (wrong count → print usage, fail). Then admit only allowed operations: case "$1" in start|stop) systemctl "$1" "$2";; *) exit 2;; esac. Callers can chain on $? via svc.sh start nginx && echo OK || echo NGhonoring "0 = success" is what makes a script a reusable part. Process many files with for f in "$@"; do process "$f"; done; consume arguments with while [ $# -gt 0 ]; do …; shift; done. When it misbehaves, bash -x svc.sh start nginx shows what each variable expanded to, line by line—the fastest route to the bug.

Variable/syntaxMeaningPairs with
$0 / $1..$n / $# / $@Name / nth / count / all argsshift moves them left
$? / exit NLast result / own status0 = success, non-zero = failure
if / caseConditional / pattern branchClose with fi / esac
for / whileList / condition loopClose with done
Warning

Trap: "$# counts arguments including the script name" is wrong—$# counts arguments only ($0 excluded). "Exit status 1 means success" is wrong—0 is success; non-zero is failure. Fabricated closers like "endcase"/"endif" are classic wrong options (correct: esac, fi).

Shebang, positional parameters, control flow, exit status, and debugging.
"0 = success" makes scripts composable

1.2.3Section summary

  • Skeleton = #! shebang + chmod +x; arguments via $0/$1../$#/$@ and shift; status via $? (0 = success) and exit N
  • Branch with if…fi / case…esac, loop with for/while…done, modularize with functions; debug with bash -x (trace)

Sign in to track progress — Log in.

Quick check

(just a quick review)

Q1. You want to check the number of arguments and print usage when too few. Which special variable holds the count?

Q2. Inside a script you must test whether the previous command succeeded. What do you check, and what means success?

Q3. A script misbehaves; you want each executed command printed after variable expansion. How do you run it?

Check your understandingPractice questions for Chapter 1: Shells and Shell Scripting