2 min read

Scripting with Zsh on macOS Tahoe

While the Getting Started with macOS Tahoe guide introduces a basic script, Zsh offers a robust set of features for complex automation. This guide dives deeper into the syntax and capabilities of Zsh scripting.

The Shebang

Every Zsh script on macOS Tahoe should start with the "shebang" line. This tells the system which interpreter to use.

#!/bin/zsh

Variables

Variables in Zsh do not require data type declarations.

#!/bin/zsh

# String variable
OS_NAME="macOS Tahoe"

# Integer variable
VERSION=26

echo "Running on $OS_NAME version $VERSION"

Conditionals

Zsh uses <a href='/%20...%20'> ... </a> for conditional tests, which is more powerful and safer than the older [ ... ] syntax found in generic sh.

#!/bin/zsh

FILE="config.txt"

if <a href='/%20-f%20%22%24FILE%22%20'> -f "$FILE" </a>; then
    echo "$FILE exists."
else
    echo "$FILE does not exist. Creating it..."
    touch "$FILE"
fi

Common Test Operators

  • -f: File exists and is a regular file.
  • -d: Directory exists.
  • -z: String is empty.
  • -n: String is not empty.

Loops

Automate repetitive tasks using loops.

For Loop

Iterate over a list of items or files.

#!/bin/zsh

# Rename all .txt files to .md
for file in *.txt; do
    mv "$file" "${file%.txt}.md"
done

Handling Arguments

Scripts can accept input from the command line.

  • $1, $2, etc.: Positional arguments.
  • $#: Number of arguments passed.
  • $@: All arguments as a list.
#!/bin/zsh

if <a href='/%20%24%23%20-eq%200%20'> $# -eq 0 </a>; then
    echo "Usage: $0 <name>"
    exit 1
fi

echo "Hello, $1!"

User Input

You can pause the script to ask for user input using read.

#!/bin/zsh

read "response?Do you want to continue? (y/n) "

if <a href='/%20%22%24response%22%20%3D~%20%5E%5BYy%5D%24%20'> "$response" =~ ^[Yy]$ </a>; then
    echo "Continuing..."
else
    echo "Aborting."
    exit 0
fi