用字符串评估变量

时间:2012-12-18 21:54:50

标签: bash eval

我是bash的新手,但这应该是一个非常常见的场景。我有以下bash“伪文本”

VAR1=oldValue
VAR2=var2

COMMAND="-option1 "$VAR1" -option2 "$VAR2

run $COMMAND $OTHERSTUFF

VAR1=newValue

run $COMMAND $OTHERSTUFF
#$COMMAND is stil using oldValue

我应该使用eval为COMMAND变量生成新值吗?

4 个答案:

答案 0 :(得分:2)

$ COMMAND具有旧值,因为在BASH中,$ VAR1和$ VAR2在最初分配时将替换它们的实际值。如果您希望使用新的VAR1值更新COMMAND,您可以这样做:

run -option1="$VAR1" -option2="$VAR2" $otherStuff

eval()是低效的(因为你要解析一些代码两次)并且必须小心使用。

答案 1 :(得分:1)

我自己是新手,但我认为问题是,命令变量不会改变,因为你必须将它设置为新值。在$命令中将保留您的旧内容

答案 2 :(得分:1)

您应该将您设置的值设置为单引号中的COMMAND,以便不在现场插入变量。然后在运行$ COMMAND时使用eval,以便在COMMAND插入到该字符串后插入COMMAND中的字符串,如下所示:

var1=hello

cmd='echo $var1'

eval $cmd

var1=goodbye

eval $cmd

我必须说这是一种非常不规则的做事方式。您应该只是重置COMMAND而不是将某种伪动态引用嵌入其中的变量。

答案 3 :(得分:1)

使用数组

options=( -option1 x -option2 y )

options[1]=oldValue
options[3]=var2
run "${options[@]}" "$OTHERSTUFF"

options[1]=newValue
run "${options[@]}" "$OTHERSTUFF"

如果您不想直接分配给数组,请使用函数来封装血腥细节:

initialize_options() { options=( -option1 x -option2 y ); }

set_first()  { set_value 1 "$1"; }
set_second() { set_value 3 "$1"; }
set_value()  { option[$1]="$2"; }

initialize_options

set_first oldValue
set_second var2
run "${options[@]}" "$OTHERSTUFF"

set_first newValue
run "${options[@]}" "$OTHERSTUFF"

我刚刚想到了 - 这可能更简单:

do_run() { run -option1 "$1" -option2 "$2" "$OTHERSTUFF"; }

VAR1=oldValue
VAR2=var2
do_run "$VAR1" "$VAR2"

VAR1=newValue
do_run "$VAR1" "$VAR2"