2015-12-18 23 views
1

我試圖編寫一個shell腳本來顯示作爲位置參數傳遞的環境變量的值。bash中值的值

for i in [email protected] 
do 
printf "$i" | xargs -I {} echo "${}" 
done 

但是,上面的代碼不起作用。 有人可以指導我通過。

謝謝。

+0

的第一個參數'printf'應該是一個格式字符串,比如' 「%S \ n」'。 – Barmar

+0

「$ {}」引起的雙引號導致正在運行的shell嘗試擴展它並失敗。 (我在這裏得到一個「錯誤的替代」錯誤。)除了答案中討論的要點之外。 –

回答

6

您的腳本的問題是xargs不使用shell來執行命令,因此參數$不會導致變量擴展。

而是使用間接變量引用,方法是將!放在變量名稱的前面,如Parameter Expansion文檔中所述。

for i in "[email protected]" 
do 
    printf "%s = %s\n" "$i" "${!i}" 
done 

結果:

$ ./testvar.sh HOME USER 
HOME = /Users/barmar 
USER = barmar 
2

xargs不通過運行一個shell命令,因此位置參數不擴大。

您可以使用bash -c執行echo命令和擴大的位置參數:

for i in "[email protected]"; do 
    echo "$i" | xargs -I {} bash -c 'echo "${}"' 
done 
+0

您不應該直接從'xargs'將參數擴展爲shell腳本。這是不安全的。 –

+1

'echo'也是一個可執行文件:'/ bin/echo'。內置只是一個優化。 – Barmar

+2

真正的解釋是'xargs'不能通過shell運行命令,所以'$'不會引起可變擴展。 – Barmar