Quick Reference
| Topic | File |
|---|---|
| Arrays and loops | arrays.md |
| Parameter expansion | expansion.md |
| Error handling patterns | errors.md |
| Testing and conditionals | testing.md |
Quoting Traps
- Always quote variables—
"$var"not$var, spaces break unquoted "${arr[@]}"preserves elements—${arr[*]}joins into single string- Single quotes are literal—
'$var'doesn't expand - Quote command substitution—
"$(command)"not$(command)
Word Splitting and Globbing
- Unquoted
$varsplits on whitespace—file="my file.txt"; cat $filefails - Unquoted
*expands to files—quote or escape if literal:"*"or\* set -fdisables globbing—or quote everything properly
Test Brackets
[[ ]]preferred over[ ]—no word splitting, supports&&,||, regex[[ $var == pattern* ]]—glob patterns without quotes on right side[[ $var =~ regex ]]—regex match, don't quote the regex-zis empty,-nis non-empty—[[ -z "$var" ]]tests if empty
Subshell Traps
- Pipes create subshells—
cat file | while read; do ((count++)); done—count lost - Use
while read < fileor process substitution—while read; do ...; done < <(command) ( )is subshell,{ }is same shell—variables in( )don't persist
Exit Handling
set -eexits on error—but not inif,||,&&conditionsset -uerrors on undefined vars—catches typosset -o pipefail—pipeline fails if any command fails, not just lasttrap cleanup EXIT—runs on any exit, even errors
Arrays
- Declare:
arr=(one two three)—orarr=()thenarr+=(item) - Length:
${#arr[@]}—not${#arr} - All elements:
"${arr[@]}"—always quote - Indices:
${!arr[@]}—useful for sparse arrays
Parameter Expansion
- Default value:
${var:-default}—use default if unset/empty - Assign default:
${var:=default}—also assigns to var - Error if unset:
${var:?error message}—exits with message - Substring:
${var:0:5}—first 5 chars - Remove prefix:
${var#pattern}—##for greedy
Arithmetic
$(( ))for math—result=$((a + b))(( ))for conditions—if (( count > 5 )); then- No
$needed inside$(( ))—$((count + 1))not$(($count + 1))
Common Mistakes
[ $var = "value" ]fails if var empty—use[ "$var" = "value" ]or[[ ]]if [ -f $file ]with spaces—always quote:if [[ -f "$file" ]]localin functions—without it, variables are globalreadwithout-r—backslashes interpreted as escapesechoportability—useprintffor reliable formatting