Bash 将变量赋值解释为命令

Bash 将变量赋值解释为命令

这几天我一直在尝试做某事,但我被难住了;无论我如何解决这个问题,我都会遇到同样的问题。我有一个文本文件,其中有 2 列;第一个是变量名称,第二个是要运行的命令,输出分配给第一列中的变量。我通常read将两列分配给它们自己的变量,然后将完整的表达式放入一个新变量中并执行它。无论我怎么做,我总是得到表达式作为命令名称和错误“命令未找到”。

这有点复杂,所以让我告诉你。脚本是:

while read varName varCmd
do
        echo varName is $varName
        echo varCmd is $varCmd
        declare cmd=$varName=$varCmd
        echo Command is $cmd
        "$cmd"
        echo 1st Value is $varFoo
        echo 2nd Value is $varBar

done < testvars.txt

文本文件是:

varFoo  echo foo
varBar  echo bar

除了赋值执行本身之外,一切正常。这是我得到的:

varName is varFoo
varCmd is echo foo
Command is varFoo=echo foo
./testvars.sh: line 8: varFoo=echo foo: command not found
1st Value is
2nd Value is
varName is varBar
varCmd is echo bar
Command is varBar=echo bar
./testvars.sh: line 8: varBar=echo bar: command not found
1st Value is
2nd Value is

看起来 Bash 将整个事情解释为一个命令名称(字符串),而不是将 解释=为一个运算符。

我该怎么做才能让 Bash 正确解释赋值表达式?

答案1

这与您不能执行此操作的方式类似:

name=foo
"$name"=123

或这个:

cmd="ls -l | grep ^d"
$cmd

赋值词被这样识别变量被扩展,类似于变量扩展之前解析其他运算符的方式(之后不被识别)。这也是其他 shell 所做的事情以及标准所说的,因此在很多意义上都是“正确”的行为。

如果你想引用另一个变量中命名的变量,可以使用 namerefs (来自 Bash 4.3),并且declare命令本身也可以做到这一点。这些将分配123给一个名为的变量foo

declare -n p=foo
p=123

或者

varname=foo
declare "$varname=123"

然而,使用通常更有意义关联数组:

key=foo
value=123
declare -A aa
aa["$key"]="$value"

如果您要存储命令,请参阅

答案2

是的,使用 eval,但是您必须使命令字符串被执行。

eval $varName=$($varCmd)

或者你可以...

declare cmd="$varName=$($varCmd)"
eval $cmd

答案3

使用eval,在 中描述man bash

 eval $varBar

相关内容