Проблема с Bash-скриптом - PullRequest
3 голосов
/ 21 июля 2010

Я могу выполнить эту команду нормально, с выводом, который я хочу:

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.

Ответы [ 5 ]

4 голосов
/ 21 июля 2010

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

ifconfig eth0 | awk '/HWaddr/{print $5}'
4 голосов
/ 21 июля 2010

Вы не печатаете переменную, вы запускаете ее как имя команды. Вы ищете

echo "$CASS_INTERNAL"

(Привыкайте всегда заключать в кавычки двойные кавычки.)

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

printf "%s\n" "$CASS_INTERNAL"
4 голосов
/ 21 июля 2010
CASS_INTERNAL=`ifconfig eth0 | grep HWaddr | awk '{print \$5}'`
echo $CASS_INTERNAL

Ваш:

$CASS_INTERNAL

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

1 голос
/ 21 июля 2010

Ну, сначала вы grep для HWaddr, так что пятое поле в этой строке - это MAC-адрес рассматриваемого сетевого адаптера, а не ваш локальный IP-адрес.

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

Из того, что я понимаю, вы хотите вместо этого поместить нужную командную строку в переменную, а затем оценить это .Этот шаблон обычно называют отложенной оценкой и делает возможным в 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
1 голос
/ 21 июля 2010

Может быть, вы хотите

echo $CASS_INTERNAL
...