2010-07-20 2 views
3

я могу запустить эту команду штраф, с выходом я хочу:Bash проблема сценария

ifconfig eth0 | grep HWaddr | awk '{print $5}' 

Однако, когда я поставил команду на переменную, и напечатать переменную, я получаю сообщение об ошибке:

CASS_INTERNAL=`ifconfig eth0 | grep HWaddr | awk '{print \$5}'` 
$CASS_INTERNAL 

my internal xxx ip: command not found

странная вещь - мой внутренний IP на самом деле показывает вверх. Как мне обойтись без ошибок? Это не имеет значения, но я использую последнюю версию Ubuntu.

+0

Используя обратные кавычки (т.е. ') окружающий команда фактически выполняет его. Таким образом, вы выполняете команду в первой строке и сохраняете результат в CASS_INTERNAL. Как говорит Wikken, вы просто хотите вернуть результат с помощью «echo». Альтернативой было бы сохранить текст команды в CASS_INTERNAL (используя двойные кавычки, а не backquotes) и выполнить его, используя просто $ CASS_INTERNAL. В вашем примере вы выполняете его с использованием backquotes в первой строке и снова во второй строке, используя $ CASS_INTERNAL. – xagyg

ответ

1

Ну, вы Grep для HWaddr первого, так что пятое поле на Тхи s эта строка является MAC-адресом соответствующего сетевого адаптера - не локальным IP-адресом.

Другие предположили, что решение состоит в том, чтобы просто эхо результата, что означает, что если eth0 в этом примере недоступен в тот момент времени, который выполняется, эта строка не будет работать.

Из того, что я понимаю, вы хотите вместо этого поставить нужную командную строку в переменную, затем оцените это позже. Эта модель обычно называется ленивой оценкой, и сделана possible in bash с помощью Eval: встроенной команды

#put the desired command in variable 
CASS_INTERNAL='ifconfig eth0 | grep HWaddr | awk "{print \$5}"' 

# .... 

#at later on - evaluate its contents! 
eval $CASS_INTERNAL 
11:22:33:aa:bb:cc 
4
CASS_INTERNAL=`ifconfig eth0 | grep HWaddr | awk '{print \$5}'` 
echo $CASS_INTERNAL 

Ваш

$CASS_INTERNAL 

Попробовал бы, чтобы запустить его в качестве команды.

+0

+1, работы для меня –

+0

ничего себе, это было легко. благодаря! – 2010-07-20 22:50:44

+0

+1 Точно: правильно, я хочу запустить эту команду, а не печатать ее. – YumYumYum

4

Вы не печать переменной, вы используете его в качестве имени команды. Вы ищете

echo "$CASS_INTERNAL" 

(Входят в привычку всегда положить двойные кавычки подстановок переменных.)

Более продвинутая оболочка Примечание: в данном случае это не имеет значения, но в целом echo может есть проблемы с некоторыми специальными символами (- и \\), так что лучше использовать следующую более сложную, но вполне надежную команду:

printf "%s\n" "$CASS_INTERNAL" 
4

не должен использовать grep

ifconfig eth0 | awk '/HWaddr/{print $5}'