Zsh Scripting Cheat Sheet
Zsh-specific syntax for arrays, globbing, parameter expansion, and prompt/plugin config that goes beyond POSIX sh scripting.
2 PagesIntermediateFeb 2, 2026
Arrays (1-indexed!)
Zsh arrays are 1-indexed by default, unlike bash.
bash
arr=(one two three)echo $arr[1] # "one" (1-indexed, unlike bash's 0-index)echo ${arr[1]} # same, braces optional for simple indexecho ${#arr} # 3, length of arrayecho ${arr[-1]} # "three", negative indices work# Slicingecho ${arr[1,2]} # "one two"# Append / iteratearr+=(four)for item in $arr; do echo "$item"done# Associative arraystypeset -A colorscolors=(red "#f00" green "#0f0")echo $colors[red] # "#f00"
Extended Globbing
Enable setopt extendedglob for powerful pattern matching without find.
bash
setopt extendedglobls *.txt~backup.txt # all .txt except backup.txtls **/*.py # recursive glob, any depthls *(.) # only regular files in cwdls *(/) # only directoriesls *(.om[1]) # most recently modified regular filels *.log(.N) # .N suppresses "no match" error instead of failing# Qualifiers: (.)=file (/)=dir (@)=symlink (x)=executable# (Lxx)=size, (mxx)=modified within xx days
Parameter Expansion
Zsh-flavored modifiers for defaults, substitution, and case conversion.
bash
name=""echo ${name:-default} # use "default" if name is unset or emptyecho ${name:=default} # same, and also assigns name=defaultpath="/usr/local/bin/zsh"echo ${path:h} # "/usr/local/bin" (head, like dirname)echo ${path:t} # "zsh" (tail, like basename)echo ${path:e} # "" (extension)echo ${path:r} # "/usr/local/bin/zsh" (root, strip extension)str="Hello World"echo ${(L)str} # "hello world" lowercaseecho ${(U)str} # "HELLO WORLD" uppercaseecho ${(C)str} # "Hello World" capitalize each word# Splitting a string into an arraywords=(${(s: :)"a b c"})
Functions, Autoload & Prompt
Function definitions, autoloaded functions, and PS1-equivalent PROMPT.
bash
greet() { local name=${1:-world} print "Hello, $name"}# Autoloaded functions (in fpath, loaded lazily)autoload -Uz compinit && compinitautoload -Uz colors && colors# PROMPT uses %-escapes instead of bash's \-escapesPROMPT='%F{cyan}%n@%m%f %~ %# '# %n=user %m=host %~=cwd(with ~) %#=# if root else %# Hooksprecmd() { print "runs before each prompt" }
Common setopt Flags
Behavior toggles that differ from bash and are commonly set in .zshrc.
- setopt AUTO_CD- cd into a directory just by typing its name
- setopt NULL_GLOB- unmatched globs expand to nothing instead of erroring
- setopt NO_CASE_GLOB- case-insensitive globbing
- setopt HIST_IGNORE_DUPS- don't record duplicate consecutive history entries
- setopt SHARE_HISTORY- share history live across all open sessions
- setopt AUTO_PUSHD- cd pushes the old dir onto the directory stack
- setopt CORRECT- suggest corrections for mistyped commands
- emulate sh -c '...'- run a snippet in POSIX-compatible mode
Pro Tip
Use zsh -xv script.sh (or set -x inside the script) to trace execution with expanded variables when a glob or parameter expansion isn't doing what you expect — zsh's expansion rules are powerful but easy to misread.
Was this cheat sheet helpful?
Explore Topics
#ZshScripting#ZshScriptingCheatSheet#Programming#Intermediate#Arrays1Indexed#ExtendedGlobbing#ParameterExpansion#FunctionsAutoloadPrompt#DataStructures#CommandLine#CheatSheet#SkillVeris
Advertisement
Sri Hayavadhana Info-Tech
Professional Web Designing Services
- Responsive Websites
- E-commerce Solutions
- SEO Friendly Design
- Fast & Secure
- Support & Maintenance