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 stringSingle quotes are literal—
'$var'doesn't expandQuote command substitution—
"$(command)"not$(command)
Word Splitting and Globbing
Unquoted
$varsplits on whitespace—file="my file.txt"; cat $filefailsUnquoted
*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 lostUse
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 quoteIndices:
${!arr[@]}—useful for sparse arrays
Parameter Expansion
Default value:
${var:-default}—use default if unset/emptyAssign default:
${var:=default}—also assigns to varError if unset:
${var:?error message}—exits with messageSubstring:
${var:0:5}—first 5 charsRemove prefix:
${var#pattern}—##for greedy
Arithmetic
$(( ))for math—result=$((a + b))(( ))for conditions—if (( count > 5 )); thenNo
$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