2010-07-20 6 views
3

je peux courir cette fin de commande, avec la sortie que je veux:question de script Bash

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

Cependant, quand je mets la commande à une variable, et imprimer la variable, je reçois une erreur:

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

my internal xxx ip: command not found

étrange chose - mon IP interne montre réellement. Comment puis-je m'y prendre sans erreur? Cela ne devrait pas avoir d'importance, mais j'utilise la dernière version d'Ubuntu.

+0

En utilisant dos guillemets (par exemple ') entourant la commande l'exécute réellement. Vous exécutez donc la commande sur la première ligne et stockez le résultat dans CASS_INTERNAL. Comme le dit Wikken, vous voulez simplement retourner le résultat en utilisant "echo". Une alternative serait de stocker le texte de la commande dans CASS_INTERNAL (en utilisant des guillemets doubles - et non des backquotes) et de l'exécuter en utilisant simplement $ CASS_INTERNAL. Dans votre exemple, vous l'exécutez en utilisant des guillemets sur la première ligne et de nouveau sur la deuxième ligne en utilisant $ CASS_INTERNAL. – xagyg

Répondre

1

Eh bien, vous grep pour HWaddr premier, donc le cinquième champ sur thi s cette ligne est l'adresse MAC de la carte réseau en question - pas votre adresse IP locale. D'autres ont suggéré que la solution consiste simplement à faire écho au résultat, ce qui signifie que si eth0 dans cet exemple n'est pas disponible à ce moment où la ligne est exécutée, cela ne fonctionnera pas. De ce que je comprends vous souhaitez plutôt mettre la ligne de commande désirée dans une variable, puis évaluer plus tard. Ce modèle est communément appelé évaluation paresseuse, et est fait possible in bash en utilisant le eval builtin:

#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 

Votre:

$CASS_INTERNAL 

essaierait de l'exécuter comme une commande.

+0

+1, travaille pour moi –

+0

wow, c'était facile. Merci! –

+0

+1 Exactement: correct, je veux exécuter cette commande, ne pas l'imprimer. – YumYumYum

1

voulez-vous peut-être

echo $CASS_INTERNAL 
4

Vous n'êtes pas l'impression de la variable, vous utilisez comme un nom de commande. Vous cherchez

echo "$CASS_INTERNAL" 

(Prenez l'habitude de toujours mettre des guillemets doubles autour de substitutions variables.)

Plus Note shell avancée: dans ce cas, il n'a pas d'importance, mais en général echo peut ont des problèmes avec certains caractères spéciaux (- et \\), il est donc préférable d'utiliser le plus compliqué, mais commande totalement fiable suivante:

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

ne doivent pas utiliser grep

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