Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash将值重新分配给变量;“未找到命令”;_Bash - Fatal编程技术网

Bash将值重新分配给变量;“未找到命令”;

Bash将值重新分配给变量;“未找到命令”;,bash,Bash,知道为什么会这样吗?为什么我必须手动显式地重新分配变量,但如果变量名中有另一个变量,我就不能这样做 脚本: #!/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

知道为什么会这样吗?为什么我必须手动显式地重新分配变量,但如果变量名中有另一个变量,我就不能这样做

脚本:

#!/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
而不是:

a_$temp="2"
使用:


创建具有动态名称的变量。

就bash而言,您尝试执行命令
'a_1=2'
,而不是执行赋值。您可以通过使用或其同义词
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
虽然可以使用
声明
,但您可能希望利用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

+1,但是(a)
bash
认为
typeset
过时了(如果需要最大的可移植性,它仍然有它的位置)和(b)您包含的提示字符串(
bash-4.3$
)都会产生视觉噪音,并使复制粘贴代码以进行验证变得更加困难(说明运行代码的
bash
版本是值得称赞的,但这可以单独完成,不过,根据讨论的功能,如果功能很久以前引入,说明版本可能根本不需要)@mklement0谢谢您的反馈,我已经编辑了我的答案。不客气;我实际上在考虑根本不使用提示字符串(即使只是
$
)我知道,
$
很吸引人,因为它被广泛用于表示提示,而我知道没有一个同样著名的符号来表示输出(有吗?)。但是,我认为颠倒逻辑是有益的:命令没有前缀,输出有一些指示符。解决这个问题的一个方法(不是很优雅)是将输出放在单独的代码段中。@mklement0我同意你的想法。对于较长的脚本,我通常会单独显示输出。我已编辑以显示注释中的命令,这至少意味着命令可以直接复制粘贴。好主意;将输出放在注释中是一个更简单的选择。
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