Larry
Larry

Reputation: 462

Is space considered a metacharacter in Bash?

I have searched for the list of metacharacters in Bash but space is not enlisted. I wonder if I'm right by assuming that space is the "token separation character" in Bash, since it not only works as such with Shell programs or builtins but also when creating an array through compound assignment - quotes escape spaces, just like they do most other metacharacters. They cannot be escaped by backslashes, though.
Parameters are passed to programs and functions separated by spaces, for example. Can someone explain how (and when) bash interprets spaces? Thanks!
I've written an example:

$ a=(zero one two)

$ echo ${a[0]}

$ zero

$ a=("zero one two")

$ echo ${a[0]}

$ zero one two

Upvotes: 0

Views: 632

Answers (3)

rici
rici

Reputation: 241691

According to the Posix shell specification for Token Recognition, any shell (which pretends to be Posix-compliant) should interpret whitespace as separating tokens:

  1. If the current character is an unquoted <newline>, the current token shall be delimited.

  2. If the current character is an unquoted <blank>, any token containing the previous character is delimited and the current character shall be discarded.

Here <blank> refers to the character class blank as defined by LC_CTYPE at the time the shell starts. In almost all cases, that character class consists precisely of the space and tab characters.

It's important to distinguish between the shell mechanism for recognizing tokens, and the use of $IFS to perform word-splitting. Word splitting is performed (in most contexts) after brace, tilde, parameter and variable, arithmetic and command expansions. Consider, for example:

$ # Setting IFS does not affect token recognition
$ bash -c 'IFS=:; arr=(foo:bar); echo "${arr[0]}"'
foo:bar
$ # But it does affect word splitting after variable expansion
$ bash -c 'IFS=: foobar=foo:bar; arr=($foobar); echo "${arr[0]}"'
foo

Upvotes: 2

Jordan Running
Jordan Running

Reputation: 106027

Yes it is. From the Bash Reference Manual's Definitions section:

blank

A space or tab character.

metacharacter

A character that, when unquoted, separates words. A metacharacter is a blank or one of the following characters: ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’.

Upvotes: 1

chepner
chepner

Reputation: 530960

From the man page:

metacharacter
      A character that, when unquoted, separates words.  One of the following:
      |  & ; ( ) < > space tab
                     ^^^^^

Upvotes: 2

Related Questions