Bash重新为变量赋值时出现“command not found”错误消息。

4

有什么想法为什么会发生这种情况?为什么我必须手动显式地重新分配变量,但如果变量名中有另一个变量,则无法这样做?

脚本:

#!/bin/bash

a_1=1
a_2=1

for temp in 1 2
do
    a_$temp="2"
    echo $((a_$temp))
done

a_1=2
a_2=2
echo $a_1
echo $a_2

输出:

[dgupta@della4 Rates_Of_Quenching]$ ./test.sh
./test.sh: line 8: a_1=2: command not found
1
./test.sh: line 8: a_2=2: command not found
1
2
2
2个回答

5

改为:

a_$temp="2"

使用:

declare a_$temp="2"

创建一个动态命名的变量。

2
就bash而言,您正在尝试执行命令'a_1=2',而不是执行赋值操作。您可以使用declare或其同义词typeset来避免这种情况:
'a_1=2'                       # bash: a_1=2: command not found
typeset 'a_1=2' 
echo $a_1                     # 2
declare 'a_1=3'
echo $a_1                     # 3

虽然可以使用 declare 命令,但是你可能想要利用 bash 数组(自从 bash 版本 2 发布之后就一直存在)而不是使用带有数字后缀的变量:

a=(1 1)
echo ${a[0]}                  # 1
echo ${a[1]}                  # 1
for i in 0 1; do a[i]=2; done
echo ${a[0]}                  # 2
echo ${a[1]}                  # 2

@mklement0 感谢您的反馈,我已经编辑了我的答案。 - Tom Fenech
@mklement0 我同意你的想法。对于较长的脚本,我通常会单独显示输出。我已经编辑为在注释中显示命令的输出,这至少意味着命令可以直接复制粘贴。 - Tom Fenech
好主意;将输出放置在 注释 中是一个更简单的选择。 - mklement0
@mklement0 当然,如果我没有显示任何输出,也没有提供任何解释,但是关键是第一个到达那里,我的答案将会受到三倍的赞赏。不过我并不感到沮丧;) 再次感谢您的反馈。 - Tom Fenech
感谢您倾听我的反馈。实际上,不同风格的答案对于不同的受众和不同的时机都是有用的。如果您是新手并且只想得到答案而不被过多信息所困扰,那么快速简单的答案有时可能更有用;然而,随着时间的推移,像您提供的更详细的答案也可能会找到它的受众。 - mklement0
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接