【问题标题】:Error "command not found" when setting value to variable [duplicate]将值设置为变量时出现“找不到命令”错误[重复]
【发布时间】:2017-05-21 07:12:46
【问题描述】:

我有以下 test.sh 脚本:

#!/bin/bash
foo=0
bar=foo;
${bar}=1
echo $foo;

输出:

./test.sh: line 4: foo=1: command not found
0

为什么会出现“找不到命令”错误?如何将脚本更改为“echo $foo”输出 1?

【问题讨论】:

  • foo=0; bar=foo; echo ${!bar} 输出:0

标签: bash shell


【解决方案1】:

不幸的是,这不是间接的方式。做你想做的事,你可以像这样使用printf

printf -v "$bar" "1"

它将存储打印的值(这里是1作为-v的参数给出的变量名,当$bar在这里扩展时将是foo

另外,你可以使用declare 喜欢

declare "$bar"=1

它将在执行declare 命令之前进行变量替换。

在您的尝试中,bash 处理的顺序对您不利。在完成变量扩展之前,该行被拆分为命令。命令可以包含变量赋值,但是,此时您没有name=value 形式的变量赋值,因此命令的一部分不会被视为赋值。在那之后,变量扩展完成,它变成了foo=1,但是到那时我们已经决定它是否是一个赋值,所以仅仅因为它现在看起来像一个并不意味着它会被这样对待。

由于它没有作为变量赋值处理,所以不能将其视为命令。您的路径中没有名为 foo=1 的命令,因此您会收到 command not found 的错误。

【讨论】:

    【解决方案2】:

    需要用到eval函数,比如

    #!/bin/bash
    foo=0
    bar=foo;
    eval "${bar}=1"
    echo $foo;
    

    ${bar}=1 将首先经过替换过程,使其变为 foo=1,然后 eval 将在您的 shell 上下文中评估它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-28
      • 2018-12-09
      • 2015-06-02
      • 2019-02-28
      • 1970-01-01
      • 2014-05-26
      相关资源
      最近更新 更多