100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace

Zsh Scripting Cheat Sheet

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
Get a Free Quote

Share this Cheat Sheet