bash forループで一時的な環境変数を使用する方法は?

bash forループで一時的な環境変数を使用する方法は?

YII_ENV=prod yii kw/test10回走りたいです。頑張った

$ YII_ENV=prod for x in 1..10 do; yii kw/test done;
-bash: for: command not found
1304682651

(一度は実行したようです。)私も試してみました。

$ for x in {1..10} do; YII_ENV=prod yii kw/test done;
-bash: syntax error near unexpected token `YII_ENV=prod'

GNU bash、バージョン 4.3.39(2)-リリース(i686-pc-cygwin)

答え1

コマンド期間中に環境変数を設定する構文は、コマンドが単純なコマンドである場合にのみ機能します(より正確には同様に機能する外部コマンドまたは組み込みコマンド - 参照)。VARIABLE=VALUE COMMANDフィールド分割にはいつ一時的な IFS を使用できますか?詳細は)。 for ループなどの複雑なコマンドでは使用できません。

最初の試みはforコマンドの最初の単語ではないため失敗し、キーワードで解析されないため、bashはforforループを解析する代わりに呼び出されたコマンドを探します。 2番目の試みは、ループの単純な構文エラーのため失敗します。前にセミコロンまたは改行文字が必要です。それ以外の場合はキーワードとして認識されないdoためです。doまた、前にはセミコロンが必要ですdone

for x in {1..10}; do YII_ENV=prod yii kw/test; done

ループ中に変数を設定するには、以前の値を上書きすることが重要でない場合は、変数を設定して後で設定を解除します。

export YII_ENV=prod
for x in {1..10}; do yii kw/test; done
unset YII_ENV

または、サブシェルでループを実行します。ループがシェル環境を変更してはいけない場合にのみ、このオプションを使用してください。

(
  export YII_ENV=prod
  for x in {1..10}; do yii kw/test; done
)

あるいは、関数内でループを実行し、変数を関数にローカルにします。これにはbash、ksh、またはzshが必要です。これは通常のshでは機能しませんが、構文にはとにかく{...}そのような要件があります。

call_yii () {
  typeset YII_ENV=prod
  export YII_ENV
  for x in {1..10}; do yii kw/test; done
}

答え2

まず、コマンド構文を修正してセミコロンを正しく配置します。変える:

for x in 1..10 do; yii kw/test done;

有効(正しい中括弧拡張を追加):

for x in {1..10}; do yii kw/test; done

次に変数を追加します。

for x in {1..10}; do YII_ENV=prod yii kw/test; done

関連情報