2015-06-18 2 views
0

Когда я пытаюсь выполнить следующие строки кода на оболочечнойНеожиданное конкатенации переменных оболочки

#!/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

Вы должны использовать подоболочку поставить вывод команды в mc, а не запятая, которая выполняет команду и записывает свой вывод в стандартный вывод послеmc присвоены то и перед тем вы пишете mc на стандартный вывод:

#!/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)cmd ставит то, что пишет на стандартный вывод в переменную var. Поскольку hexdump пишет в стандартный вывод, вы должны написать var=foo:$(hexdump), чтобы объединить вывод hexdumpпослеfoo.

1

Если вы надеетесь, что mc=some commands поставит выход some commands в переменной mc, что это не так, как это работает. Правильный синтаксис для этого - mc=$(some commands).

Смысл в том, что mc=some commandsmc=some назначается на срок commands, а затем mc возвращается к своему старому значению, когда commands отделки.

Кстати, вы должны указать окончательное значение, если только вы специально не требуете, чтобы оболочка выполняла разделение токена и расширение подстановочного знака значения. echo "$mc" с двойными кавычками вокруг переменной интерполяции.

Смежные вопросы