我是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变量生成新值吗?
答案 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"