Bash

如何在 bash for 循環中使用臨時環境變數?

  • February 28, 2016

我想跑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)

首先更正命令的語法,正確放置分號。代替:

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

在命令執行期間設置環境變數的語法僅在命令是簡單命令時才有效(更準確地說,是外部命令或類似命令的內置命令 - 請參閱何時可以使用臨時 IFS 進行欄位拆分?更多細節)。您不能將它與復雜的命令一起使用,例如 for 循環。*VARIABLE*=*VALUE* *COMMAND*

你的第一次嘗試失敗了,因為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
}

引用自:https://unix.stackexchange.com/questions/266197