1

私はbashを初めて使用しますが、これは非常に一般的なシナリオです。私は次のbash「pseudoscript」を持っています

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()は非効率的であり(一部のコードを2回解析しているため)、注意して使用する必要があります。

于 2012-12-18T22:06:09.060 に答える
1

私自身は初心者ですが、問題は、コマンド変数が変更されないことです。これは、コマンド変数を新しい値に設定する必要があるためです。$コマンドでは、それ以外の場合は古いコンテンツが残ります

于 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 に答える
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 に答える