Search code examples
bashvariablessyntaxcommand-line-argumentsquoting

Are quotes necessary in bash when declaring local variables based on the command line argument variable expansion?


Are the quotes in the below example necessary or superfluous. And why?

#!/bin/bash

arg1="$1"
arg2="$2"

How do you explain the fact when $1 is 123 echo abc, the first assignment is not interpreted as:

arg1=123 echo abc

which is a normal command (echo) call with argument abc and an environment variable (arg) passed to the execution.


Solution

  • From section 2.9.1 of the POSIX shell syntax specification:

    Each variable assignment shall be expanded for tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal prior to assigning the value.

    String-splitting and globbing (the steps which double quotes suppress) are not in this list.

    Thus, the quotes are superfluous -- not just for assignments where the right-and side refers to a positional parameter, but for all assignments barring those where (1) the behavior of single-quoted, not double-quoted, strings are desired; or (2) whitespace or other content in the value would be otherwise parsed as syntactic rather than literal.


    (Note that the decision on how to parse a command -- thus, whether it is an assignment, a simple command, a compound command, or something else -- takes place before parameter expansions; thus, var=$1 is determined to be an assignment before the value of $1 is ever considered! Were this untrue, such that data could silently become syntax, it would be far more difficult -- if not impossible -- to write secure code handling untrusted data in bash).