2015-06-18 53 views
0

當我嘗試殼 -shell變量的意外級聯

執行下面的代碼行
#!/bin/sh 
mc=XX:XX:XX:XX; dd bs=1 count=2 if=/dev/random 2>/dev/null |hexdump -v -e '/1 ":%02X"' 
echo $mc 

輸出我得到的是

:04:CCXX:XX:XX:XX 

,即。 X的末尾連接起來而不是起始。我也試過這個(如在SO上的答案中提到的) -

#!/bin/sh 
mc=XX:XX:XX:XX 
mc=$mc dd bs=1 count=2 if=/dev/random 2>/dev/null |hexdump -v -e '/1 ":%02X"' 
echo $mc 

我仍然得到相同的輸出。我在這裏錯過了什麼?我是殼新手,所以請原諒我的任何明顯的錯誤

+0

爲什麼你期望'echo'的輸出發生在其他地方,而不是在它之前的命令輸出之後?何時以及如何爲'mc'賦值,對其值的'echo'何時執行沒有影響。腳本從上到下進行評估; 'echo'在'dd |之後hexdump'。無論如何,目前還不清楚你正在嘗試完成什麼或者你期望如何發生 - 也許擴展你想要做的事以及這個代碼應該如何促進這一點。 – tripleee

+0

我正嘗試使用上面的代碼生成隨機MAC地址。 XX:XX:XX:XX表示固定部分,對於生成的任何新地址將被固定,剩餘部分地址將隨機生成 – Backspace

回答

0

您應該使用一個子shell把命令的輸出mc,不執行該命令,並用逗號將其輸出到stdout mc已被分配的東西,之前你寫mc到stdout:

#!/bin/sh 
mc=XX:XX:XX:XX$(dd bs=1 count=2 if=/dev/random 2>/dev/null |hexdump -v -e '/1 ":%02X"') 
echo $mc 

說明:var=$(cmd)提出什麼cmdvar變量寫在標準輸出。由於hexdump寫入標準輸出,所以必須編寫var=foo:$(hexdump)來連接輸出hexdumpfoo

1

如果您希望mc=some commands將輸出some commands在變量mc,這不是它的工作原理。正確的語法是mc=$(some commands)

mc=some commands的含義是mc=some分配用於commands的持續時間,然後mc返回到其舊的值時commands飾面。

順便說一句,除非特別要求shell執行值的令牌拆分和通配符擴展,否則應引用最終值。帶變量插值的雙引號的echo "$mc"