This is a cheat sheet for how to perform various actions to ZSH, which can be tricky to find on the web as the syntax is not intuitive and it is generally not very well-documented.
Description |
Syntax |
Get a single character |
${VARNAME[index]} |
Get the string from a specific index |
${VARNAME[index,-1]} |
Get a substring |
${VARNAME[from,to]} |
Replace the first occurrence in a string |
${VARNAME/toreplace/replacement} |
Replace the last occurrence in a string |
${VARNAME//toreplace/replacement} |
Cut a string after a model |
${VARNAME%%model*} |
Check if a string starts by a specific substring |
if [[ $VARNAME = "startstr"* ]] |
Description |
Syntax |
Create an array |
VARNAME=() |
Push to an array |
VARNAME+(value) |
Access an array's element |
VARNAME[index] |
Remove first element from an array (shift) |
shift VARNAME |
Remove last element from an array (pop) |
shift -p VARNAME |
Get an array's length |
${#VARNAME[@]} |
Iterate over an array's values |
for value in VARNAME; |
Get index of a value in an array |
${VARNAME[(i)value]} |
Get an array slice after the specified index |
${VARNAME:index} |
Get an array slice after the specified index |
${VARNAME:index:length} |
Check if a value is contained in an array |
if (( ${VARNAME[(i)value]} <= ${#VARNAME[@]} )); |
Check if an array is empty |
if [[ -z $VARNAME ]] |
Check if an array is not empty |
if [[ ! -z $VARNAME ]] |
Description |
Syntax |
Compute a mathematical expression (variables don't need to be prefixed with $ in it) |
$((expression)) |
Description |
Syntax |
Get the value of a variable whose name is in another variable |
${(P)NAMEVAR} |
Get the list of all defined variables, as an array |
${(k)parameters} |
Delete a variable |
unset VARNAME |
Description |
Syntax |
Declare a local variable (not accessible outside the function) |
local varname=... |
Get the original executable name |
$0 |
Get a parameter |
$1 (second is $2 , etc.) |
Expand all parameters |
$* |
Expand all parameters but keep them quoted if needed |
$@ (tip: it's an array!) |
Remove the first parameter from $@ |
shift |
Remove the last parameter from $@ |
shift -p |
Exit the function with a status code (behaves like for a command) |
return 1 (or any other code) |
Get the list of all functions, as an array |
${(k()functions} |
Delete a function |
unset -f func_name |
Description |
Syntax |
Display the list of all defined aliases |
alias |
Get the list of all defined aliases, as an array |
${(k)aliases} |
Define an alias |
alias name="command arg1 arg2 arg3 ..." |
Remove an alias |
unalias name |
Get the arguments, with escaped spaces |
${@:q} |
A word on conditionals
Syntaxes:
# 1)
if expression
then
# instructions
fi
# 2)
if expression; then
# instructions
fi
# 3)
if expression; then ...; fi
# 4)
if expression; then
# instructions
else
# instructions
fi
# 5)
if expression; then
# instructions
elif expression
# instructions
else
# instructions
fi
Description |
Syntax |
Check if a string is empty or not defined |
if [[ -z $VARNAME ]]; |
Check if a string is defined and not empty |
if [[ ! -z $VARNAME ]]; |
Check if a file exists |
if [[ -f "filepath" ]]; |
Check if a directory exists |
if [[ -d "dirpath" ]]; |
Check if a symbolic link exists |
if [[ -L "symlinkpath" ]]; |
Check if a shell option is set |
if [[ -o OPTION_NAME ]]; |
Check if two values are equal |
if [[ $VAR1 = $VAR2 ]]; |
Check if two values are different |
if [[ $VAR1 != $VAR2 ]]; |
Check if a number is greater than another |
if (( $VAR1 > $VAR2 )); |
Check if a number is smaller than another |
if (( $VAR1 < $VAR2 )); |
Check if a command exits successfully (exit code 0 ) |
if command arg1 arg2 ... |
Check if a command doesn't exit successfully (exit code != 0 ) |
if ! command arg1 arg2 ... |
Syntaxes:
# 1)
for itervarname in iterable
do
# instructions
done
# 2)
for itervarname in iterable; do
# instructions
done
# 3)
for itervaname in iterable; do ...; done
Description |
Syntax |
Iterate over a range (inclusive) |
for i in {from..to}; |
Iterate over a list of filesystem items |
for i in globpattern; |
Iterate over a list of filesystem items, fail silently if no match found |
for i in globpattern(N); |
Return a value from within a function:
function add() {
local sum=$(($1 + $2))
echo $sum
}
function add_twice() {
local sum=$(add $1 $2) # get the callee's STDOUT
local sum_twice=$(add $sum $sum)
echo $sum_twice
}
echo $(add 2 3) # 5
echo $(add_twice 2 3) # 10
Conditionals use expressions, such as in if [[ -z $VARNAME ]];
the expression is [[ -z $VARNAME ]]
. These can also be used in while
loops, as well as be used outside of blocks:
[[ -z $VARNAME ]] && echo "VARNAME is defined!"
[[ -f $FILEPATH ]] && echo "File exists!"
This works because conditional expressions ([[ ... ]]
and (( ... ))
) don't actually return a value; they behave like commands and as such set the status code to 0
if the condition is true, or 1
else.
If we want to display the message only if the condition is falsey:
[[ -z $VARNAME ]] || echo "VARNAME is defined!"
[[ -f $FILEPATH ]] || echo "File exists!"