2016-04-21 6 views
2

Gerade jetzt einige der Code in meinem .zshrc Datei sieht wie folgt aus:Wie definiere ich eine Reihe von Bash-Befehlen als String?

inetFunction(){ 
    echo ${LRED}IP Address:${NC} 
    ifconfig en0 | grep "inet " | awk '{print $2}' 
} 

$ LRED ist definiert als die Farbe Light Red ändern und $ NC ist es wieder normal Einstellung. Ich implementiere die inetFunction mit dem Code alias inet='inetFunction'. Die Ausgabe des Befehls ist

wo die "IP-Adresse:" in rot ist. Ich wollte die IP-Adresse grün machen, aber aus irgendeinem Grund, wenn ich eine dieser versuchen, funktioniert es nicht:

${GREEN}ifconfig en0 | grep "inet " | awk '{print $2}' 

ifconfig en0 | grep "inet " | ${GREEN}awk '{print $2}' 

${GREEN}ifconfig en0 | grep "inet " | awk '{${GREEN} print $2}' 

Ich habe sogar versucht, das Ganze zu einem variablen Einstellung wie:

variable='ifconfig en0 | grep "inet " | awk '{print $2}'' 

und dann versuchen, echo ${GREEN} $variable zu tun, aber es funktioniert immer noch nicht.

Irgendwelche Ideen?

+3

Wissen Sie, dass grep | awk ist ein dummes anti-Muster? awk kann das greppen: 'ifconfig en0 | awk '/ inet/{print $ 1}' '. Spart eine teure Gabel und ein Rohr. – Jens

Antwort

2

$GREEN muss wiederholt werden. Es handelt sich um eine Reihe von ANSI-Farbcodes, die Ihr Terminal als Signal zum Ändern der Textfarbe erkennt.

echo -n "$GREEN" 
ifconfig en0 | grep "inet " | awk '{print $2}' 
echo -n "$NC" 

Oder kondensiert:

echo "$GREEN$(ifconfig en0 | grep "inet " | awk '{print $2}')$NC" 

Auch als @Jens weist darauf hin, Ihnen die grep und awk-Befehle wie so kombinieren kann:

echo "$GREEN$(ifconfig en0 | awk '/inet/{print $2}')$NC" 
0

Wie bereits in John Kugelman's answer${GREEN} Bedarf festgestellt gedruckt werden, um zu wirken.

Wie Sie awk sowieso laufen, können Sie einfach lassen Sie es die Arbeit machen:

ifconfig en0 | awk '/inet/{print "'${GREEN}'" $2 "'${NC}'"}' 
ifconfig eno1 | awk "/inet/{print \"${GREEN}\" \$2 \"${NC}\"}" 

Diese für mehr Kontrolle ermöglicht, was Farbe, vor allem bei komplexeren awk Programme.

Offensichtlich ist die dafür notwendige Notierung alles andere als schön. $2 muss von der Shell aus zitiert werden, so dass es von awk erkannt werden kann. ${GREEN} und ${NC} dürfen nicht aus der Shell zitiert werden, damit sie durch die Shell ersetzt werden können. Aber da sie jetzt nur Zeichenfolgen zu awk sind, müssen sie in doppelte Anführungszeichen für awk; Diese doppelten Anführungszeichen müssen auch von der Shell aus zitiert werden.

Um dies simplyfy Sie mit dem -v variable=value Parameter Variablen für awk auf der Kommandozeile übergeben können:

ifconfig en0 | awk -v green="$GREEN" -v nc="$NC" '/inet/{print green $2 nc}' 
Verwandte Themen