PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit awk und if


MADxHAWK
03.05.2011, 15:22
Hallo,

ich benötige zum loggen des onlinstatus meines Routers ein kleines Script, das mir aus Online eine 1 und aus offline eine 0 macht, da die Statusausgabe entweder "OK Online" bzw. "OK Offline" lautet.

Deshalb habe ich mir das folgende kleine Script gebastelt:

#!/bin/sh

case "$1" in
up)
status=`/usr/local/bin/cimon 192.168.6.1 status pppoe | awk '{print $2}'`
echo "Debugmsg: status = $status"
if [ "$status" = "Online" ]; then
echo 1
exit 1
else
echo 0
exit 1
fi
;;

*)
echo "Usage: router {up|ip}" >&2
exit 1
;;
esac
exit 0
Leider funktioniert das Script jedoch nicht, hier die Ausgabe:

madx:/var/www# ./router.sh up
Debugmsg: status = Online
0

Es wird immer nur der "else block" ausgeführt. Ich bin noch neu was Shell-Scripting angeht und habe absolut keine Idee was hier falsch sein kann.

Dies sind die Ausgaben von cimon:

madx:/var/www# /usr/local/bin/cimon 192.168.6.1 status pppoe
OK Online

madx:/var/www# /usr/local/bin/cimon 192.168.6.1 status pppoe | awk '{print $2}'
Online


Ich hoffe einer von euch kann mir helfen.

Gruss
MAD


kill4h`
03.05.2011, 18:10
Wenn du mal genau hinsiehst, dann entdeckst du, dass dein awk ein Newline am Ende mit rauswirft, denn wenn du "$status" ausgibst und anschließend in den if-Blöcken die "echo"s ausführst, wird die Zahl in der nachfolgenden Zeile ausgegeben.

Lösung: entweder, du entfernst das Newline in deinem awk Aufruf, durch nachfolgende Variablenmanipulation, oder du fügst ein Newline am Ende des zu vergleichenden Strings ein, also "Online\n", schon klappts :)

MADxHAWK
03.05.2011, 21:13
Hi,

Danke für deine Antwort, habe die If-Abfrage mal wie folgt geändert:
if [ "$status" = "Online\n" ]; thentrotzdem wird nach wie vor der elseblock ausgeführt

madx:/var/www# ./router.sh up
Debugmsg: status = Online
0


ich habs auch mit "Online\r" bzw "Online\r\n" getestet, immer das gleiche :(
php ist da irgendwie einfacher :S

Gruss
MAD

Xpyder
04.05.2011, 02:51
Warum schreibst Du nicht einfach das OK mit rein?
also:
if [ "$status" = "OK Online\n" ]; then

MADxHAWK
04.05.2011, 12:30
Hi,

funktioniert leider auch nícht:

status=`/usr/local/bin/cimon 192.168.6.1 status pppoe`
echo "Debugmsg: status = $status"

if [ "$status" = "OK Online\n" ]; then
[...]


Ausgabe:

madx:/var/www# ./router.sh up
Debugmsg: status = OK Online
0



Wird noch immer nur der elseblock ausgeführt.

Gruss
MAD

MADxHAWK
05.05.2011, 18:05
Hi,

ich habe mal die Ausgabe von /usr/local/bin/cimon 192.168.6.1 status pppoe > test.txt in eine Datei schreiben lassen. Öffne ich die Datei zeigt mir notepad++ folgendes an: OK OnlineCRLF

Daraufhin habe ich das script folgendermassen geändert:

status=`/usr/local/bin/cimon 192.168.6.1 status pppoe`

echo $status

if [ "$status" = "OK Online\r\n" ]; then
[...]


Trotzdem wird weiterhin NUR der elseblock ausgeführt. Langsam verzweifel ich.

josch
06.05.2011, 00:39
Hi,

ich habe mal die Ausgabe von /usr/local/bin/cimon 192.168.6.1 status pppoe > test.txt in eine Datei schreiben lassen. Öffne ich die Datei zeigt mir notepad++ folgendes an: OK OnlineCRLF

Daraufhin habe ich das script folgendermassen geändert:

status=`/usr/local/bin/cimon 192.168.6.1 status pppoe`

echo $status

if [ "$status" = "OK Online\r\n" ]; then
[...]


Trotzdem wird weiterhin NUR der elseblock ausgeführt. Langsam verzweifel ich.

Ich hab jetzt nur den letzen Post gelesen:

versuch's mal mit nem' partiellen match auf der Zeile/Variable:

if [[ "$status" == *OK Online* ]]; then

damit springst du in den then block sobald in $status irgendwo die Zeichenfolge "OK Online" drin steht; unabhängig davon was davor steht oder folgt