Bash
如何在 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)
首先更正命令的語法,正確放置分號。代替:
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 }