Arrays 使用eval初始化动态数组时出现语法错误

Arrays 使用eval初始化动态数组时出现语法错误,arrays,bash,Arrays,Bash,然后我收到一条错误信息,上面写着 var=(a b c) eval "${var[0]}=(1 2)" 那么,语法错误意味着什么?如何解决它呢?非常感谢 理解eval如何影响您编写的行的最简单方法是将eval替换为echo。发出带有echo的命令时,会显示以下内容: bash: syntax error near unexpected token `1' 如您所见,eval行将执行的命令将设置变量$a,而不是变量$var。事实上,如果出于任何原因,${var[0]}的值变为1(当您尝试这样做

然后我收到一条错误信息,上面写着

var=(a b c)
eval "${var[0]}=(1 2)"

那么,语法错误意味着什么?如何解决它呢?非常感谢

理解
eval
如何影响您编写的行的最简单方法是将
eval
替换为
echo
。发出带有echo的命令时,会显示以下内容:

bash: syntax error near unexpected token `1'
如您所见,eval行将执行的命令将设置变量
$a
,而不是变量
$var
。事实上,如果出于任何原因,
${var[0]}
的值变为
1
(当您尝试这样做时),
eval
行将变为:

$ var=(a b c)
$ echo "${var[0]}=(1 2)"
a=(1 2)
行,如果它得到
eval
ed将触发您看到的错误

解决方案取决于你到底愿意做什么

如果要更改存储在
${var[0]}
中的变量
$a
的值,则可以使用:

$ var=(1 2)
$ echo "${var[0]}=(1 2)"
1=(1 2)
如果
${var[0]}
1
,将发出以下错误:

declare -a "${var[0]}=(1 2)"
在我看来,这是一个更有意义的信息

或者,如果您确实想避免使用eval:

 bash: declare: `1=(1 2)': not a valid identifier
如果
$values
可能包含空格或换行符(或修改后的IFS可能包含的值),则需要更复杂的脚本:

declare -a a=([0]="1" [1]="2")

理解
eval
如何影响您编写的行的最简单方法是用
echo
替换
eval
。发出带有echo的命令时,会显示以下内容:

bash: syntax error near unexpected token `1'
如您所见,eval行将执行的命令将设置变量
$a
,而不是变量
$var
。事实上,如果出于任何原因,
${var[0]}
的值变为
1
(当您尝试这样做时),
eval
行将变为:

$ var=(a b c)
$ echo "${var[0]}=(1 2)"
a=(1 2)
行,如果它得到
eval
ed将触发您看到的错误

解决方案取决于你到底愿意做什么

如果要更改存储在
${var[0]}
中的变量
$a
的值,则可以使用:

$ var=(1 2)
$ echo "${var[0]}=(1 2)"
1=(1 2)
如果
${var[0]}
1
,将发出以下错误:

declare -a "${var[0]}=(1 2)"
在我看来,这是一个更有意义的信息

或者,如果您确实想避免使用eval:

 bash: declare: `1=(1 2)': not a valid identifier
如果
$values
可能包含空格或换行符(或修改后的IFS可能包含的值),则需要更复杂的脚本:

declare -a a=([0]="1" [1]="2")

您想做什么?您确定正在
bash
中运行脚本吗?这对我很有用。@Cyrus他想设置
a=(12)
为什么不使用关联数组?你的例子让人觉得你只是想使用硬编码的值列表创建多个相同的数组。这似乎毫无意义,任何更复杂的问题1)需要不同的解决方案,2)都是一个巨大的警告信号,表明您使用了错误的语言。您想做什么?您确定要在
bash
中运行脚本吗?这对我很有用。@Cyrus他想设置
a=(12)
为什么不使用关联数组?你的例子让人觉得你只是想使用硬编码的值列表创建多个相同的数组。这似乎毫无意义,任何更复杂的问题1)需要不同的解决方案,2)都是一个巨大的警告信号,表明您使用了错误的语言。
read
命令并没有按照您希望的方式工作。在这里,字符串根本不需要进行分词,因此
read
只是在空白处分割字符串,而不考虑数组元素之间的边界。用
值=(“1 2”3 4”)
试试这个
a
以4个元素结束,而不是2个元素。@chepner True:read受IFS值的影响。在这种情况下,我们需要用NUL分隔数组值。这将需要使用更重的枪:NUL终止的过程替换。在这种情况下,read将保持值之间的正确分隔,不会出现任何问题。请尝试添加的脚本。丑陋:),但它会工作
bash
4.4大约在6个月前正式发布;现在无需参考alpha版本。
read
命令的工作方式与您所希望的不同。在这里,字符串根本不需要进行分词,因此
read
只是在空白处分割字符串,而不考虑数组元素之间的边界。用
值=(“1 2”3 4”)
试试这个
a
以4个元素结束,而不是2个元素。@chepner True:read受IFS值的影响。在这种情况下,我们需要用NUL分隔数组值。这将需要使用更重的枪:NUL终止的过程替换。在这种情况下,read将保持值之间的正确分隔,不会出现任何问题。请尝试添加的脚本。丑陋:),但它会工作
bash
4.4大约在6个月前正式发布;现在无需参考alpha版本。