Why does Zsh complain of my variable assignment as "command not found"?

When I try to write a Zsh script on macOS Big Sur, Version 11.5.1, I noticed that it keeps failing to recognize my variables as variables.

Instead, Zsh treats them as UNIX-like commands.

Screenshot of the problem on the Terminal Application - variable assignment problem for Zsh shell scripts

In the screenshot linked above, I did the following on the Terminal application.

  • Showed the contents of the simple Zsh shell script.
  • Used the "ls -l" UNIX-like command to indicate its file permissions, and show that it is an executable Zsh shell script.
  • Executed the Zsh shell script, which shows that the Zsh script interpreter complains of how my variable name is a "command not found".

The source code for my Zsh shell script is provided as follows:

#!/bin/zsh

unix_cmd = "ls -al"

Can you please kindly let me know what am I missing, and what did I do wrong?

I just want to assign values to variables in my Zsh shell scripts.

Thank you so much, and have a great day! Ciao!


Solution 1:

The syntax to assign a value to a variable is foo=bar, not foo = bar. Whitespaces matter. The latter syntax is a command foo with arguments = and bar.

Few examples of how = is interpreted:

code meaning
foo=bar proper assignment; now the value of foo is bar
foo = bar command foo with arguments = and bar
foo =bar command foo with one argument =bar
foo= bar command bar with foo in its environment; the value of foo is empty
foo=1 bar command bar with foo in its environment; the value of foo is 1
foo='1 bar' proper assignment; now the value of foo is 1 bar
foo=' bar' proper assignment; now the value of foo is bar (note the leading space)
foo=\ bar proper assignment; now the value of foo is bar (note the leading space)
foo-x=bar command foo-x=bar (because foo-x is not a valid name for a shell variable)

This is not specific to Zsh. The POSIX shell (sh) and POSIX-compliant shells behave this way. Zsh (while not being POSIX-compliant in general) also follows.