2015-06-18 49 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"