如何在 bash for 循环中使用临时环境变量?

如何在 bash for 循环中使用临时环境变量?

我想跑YII_ENV=prod yii kw/test十次。我试过

$ 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)-release (i686-pc-cygwin)

答案1

在命令持续时间内设置环境变量的语法仅在命令是简单命令时才有效(更准确地说,是外部命令或行为类似的内置命令 - 请参阅VARIABLE=VALUE COMMAND什么时候可以使用临时 IFS 进行字段拆分?更多细节)。您不能将它与复杂的命令(例如 for 循环)一起使用。

您的第一次尝试失败了,因为for它不是命令的第一个单词,因此它没有被解析为关键字,因此 bash 会查找调用的命令,for而不是解析 for 循环。您的第二次尝试失败了,因为循环中存在一个简单的语法错误:您需要在 , 之前使用分号或换行符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

或者,在子 shell 中运行循环。仅当循环不应该修改 shell 的环境时才可以使用此选项。

(
  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

相关内容