[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Issue declaring an array via a variable name
From: |
Chet Ramey |
Subject: |
Re: Issue declaring an array via a variable name |
Date: |
Sun, 22 Aug 2021 16:36:52 -0400 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 |
On 8/21/21 6:02 PM, Hunter Wittenborn wrote:
As an end user I would expect the unquoted `('
operator to cause a syntax error, just as it does in `echo ('.
Well I'm expecting '(' to be part of the shell's syntax (when unquoted; so
likewise not cause a syntax error), but when looking at things like the left
side of a variable assignment, I'm sure you'll agree that it should allow any
string that fits a variable's normal specification (regardless of being an
array or not).
Maybe this is best seen as a misunderstanding about order of operations.
Before the `declare' builtin is executed, the command has to be parsed.
The parser identifies the token `declare' as the first word of a simple
command, and further identifies `declare' as a declaration command, as
explained in the documentation.
One thing about the shell's metacharacters (of which `(' is one) is that
they have to be quoted when they appear somewhere outside where the shell's
grammar permits. One place bash allows `(' -- an extension to the POSIX
grammar -- is on the rhs of an assignment statement.
Given a declaration command, the shell parser allows assignment statements
as arguments. An assignment statement, as documented, takes the form
identifier=value
where `identifier' is a `name' (as defined in the bash documentation) or an
array subscript of the form `name[index]'.
The key to understanding this is that all of this must happen before any of
the shell's word expansions, including quote removal, take place.
If the shell parser can't recognize a word, or at least the word that's
been accumulated when it sees the `(' operator, as a valid assignment
statement, the exception to having to quote the left paren doesn't come
into play.
We can disregard arguments that contain `=' that may be treated as
assignments when `declare' sees them as long as they don't contain any
shell metacharacters:
`declare "${value}"="x"`
`declare "y"="x"`
However, if you want the parser to allow an unquoted metacharacter, you
have to follow the rules that allow it to happen, and this does not:
`declare "${value}"=("x" "z")`
Because "${value}" is not a valid shell `name' and cannot appear on the
lhs of an assignment statement.
Given that, it should be obvious why the above is a syntax error.
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU chet@case.edu http://tiswww.cwru.edu/~chet/
- Issue declaring an array via a variable name, Hunter Wittenborn, 2021/08/14
- Re: Issue declaring an array via a variable name, Hunter Wittenborn, 2021/08/19
- Re: Issue declaring an array via a variable name, Oğuz, 2021/08/20
- Re: Issue declaring an array via a variable name, Hunter Wittenborn, 2021/08/21
- Re: Issue declaring an array via a variable name, Alex fxmbsw7 Ratchev, 2021/08/21
- Re: Issue declaring an array via a variable name, Lawrence Velázquez, 2021/08/21
- Re: Issue declaring an array via a variable name, Oğuz, 2021/08/22
- Re: Issue declaring an array via a variable name,
Chet Ramey <=
- Re: Issue declaring an array via a variable name, Alex fxmbsw7 Ratchev, 2021/08/22
- Re: Issue declaring an array via a variable name, Lawrence Velázquez, 2021/08/22
- Re: Issue declaring an array via a variable name, Alex fxmbsw7 Ratchev, 2021/08/22