这几天我一直在尝试做某事,但我被难住了;无论我如何解决这个问题,我都会遇到同样的问题。我有一个文本文件,其中有 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