1

我是 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

4 回答 4

2

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

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

eval() 效率低下(因为您要解析某些代码两次),必须小心使用。

于 2012-12-18T22:06:09.060 回答
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"
于 2012-12-19T00:18:34.837 回答
1

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

于 2012-12-18T22:00:03.260 回答
1

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

var1=hello

cmd='echo $var1'

eval $cmd

var1=goodbye

eval $cmd

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

于 2012-12-18T22:02:20.150 回答