Mehrere Befehle mit Parametern ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
poncho
Beiträge: 106
Registriert: 23.12.2007 19:22:35

Mehrere Befehle mit Parametern ausführen

Beitrag von poncho » 11.09.2012 14:05:14

Hallo Leute,

ich versuche ein Script zu schreiben, dass mehrere Scripts in einer Schleife aufruft. Klingt simpel, ist es aber scheinbar nicht. Das ganze läuft unter einer relativ alten Bash 2.03 auf Solaris 10 (ja, das ist ein Debian-Forum aber Bash ist Bash).

So sieht das Script zur Zeit aus:

Code: Alles auswählen

#!/exlibris/aleph/a20_1/product/bin/bash

icingahost=ubsrvappl3
hostname=`hostname`
pluginpath=/usr/local/nagios/aleph_serv
nscapath=/exlibris/aleph/a20_1/alephm/icinga/send_nsca
nscaconf=/exlibris/aleph/a20_1/alephm/icinga/send_nsca.cfg

checks='
Aleph PC;check_aleph_pc;10 20
Aleph SIP2;check_aleph_sip2;2 10
Aleph SLNP;check_aleph_slnp;
Aleph WWW;check_aleph_www;
Aleph z39 Gate;check_aleph_z39_gate;
Aleph z39 Server;check_aleph_z39_server;
'

msg=""
IFS=$'\n'
for check in $checks
do
        service=`echo $check | cut -d ";" -f 1`
        command=`echo $check | cut -d ";" -f 2`
        arguments=`echo $check | cut -d ";" -f 3`
        output=`$pluginpath/$command $arguments | tail -1`
        code=$?
        msg="${msg}$hostname\t$service\t$code\t$output\n"
done

echo -e "$msg" | $nscapath -H $icingahost -c $nscaconf
$checks beinhaltet quasi ein Array mit Namen, Script und Scriptparametern. Die sollen in der Schleife gestartet werden.
Das Problem ist, dass die aufgerufenen Scripts immer nur einen einzigen Parameter sehen und nicht zwei wie oben 10 20. Es ist, als ob ich "10 20" (in Anführungszeichen) geschrieben hätte.

Ich vermute ja, dass es an "IFS=$'\n'" liegt aber ich weiß nicht, wie ich das anders bewerkstelligen soll.

Weiß jemand, wie ich das am besten lösen kann?

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Mehrere Befehle mit Parametern ausführen

Beitrag von Liffi » 11.09.2012 14:19:28

IFS vor der Schleife so setzen, aber den alten Wert sichern. In der Schleife dann den alten Wert benutzen. Moeglicherweise am Ende der Schleife IFS wieder auf \n setzen.
Ist aber nur geraten :-).

poncho
Beiträge: 106
Registriert: 23.12.2007 19:22:35

Re: Mehrere Befehle mit Parametern ausführen

Beitrag von poncho » 11.09.2012 14:26:38

Ha, funktioniert!
Es kann manchmal so einfach sein :)

Danke!

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Mehrere Befehle mit Parametern ausführen

Beitrag von r900 » 11.09.2012 16:36:30

poncho hat geschrieben:$checks beinhaltet quasi ein Array mit Namen, Script und Scriptparametern.
Dann könntest du auch ein richtiges array nehmen:

Code: Alles auswählen

checks=(
'Aleph PC;check_aleph_pc;10 20'
'Aleph SIP2;check_aleph_sip2;2 10'
'Aleph SLNP;check_aleph_slnp;'
'Aleph WWW;check_aleph_www;'
'Aleph z39 Gate;check_aleph_z39_gate;'
'Aleph z39 Server;check_aleph_z39_server;'
)
for check in "${checks[@]}"; do
   [...]
done

poncho
Beiträge: 106
Registriert: 23.12.2007 19:22:35

Re: Mehrere Befehle mit Parametern ausführen

Beitrag von poncho » 11.09.2012 16:39:58

Hmm, ich hatte das sogar probiert. Warum ich es verworfen hab, weiß ich gar nicht mehr. Es lag glaub ich daran, dass ich es direkt mit einem mehrdimensionalen Array probiert hab, was es wohl in der bash nicht gibt. Ja, so ist es natürlich etwas schöner.

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Mehrere Befehle mit Parametern ausführen

Beitrag von habakug » 11.09.2012 19:54:31

Hallo!

Ohne zu wissen was ein "richtiges Array" ist, würde ich die "Datenbank" extern pflegen:

Code: Alles auswählen

[lurk@home ~]$ cat checks.file 
Aleph PC;check_aleph_pc;10 20;
Aleph SIP2;check_aleph_sip2;2 10;
Aleph SLNP;check_aleph_slnp;
Aleph WWW;check_aleph_www;
Aleph z39 Gate;check_aleph_z39_gate;
Aleph z39 Server;check_aleph_z39_server;
...und dann so aufrufen:

Code: Alles auswählen

[...]
while IFS=\; read serv comm argu
do
        echo -e "$serv\t$comm\t$argu"
done < checks.file
[...]
Gruß, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Mehrere Befehle mit Parametern ausführen

Beitrag von r900 » 11.09.2012 20:09:01

habakug hat geschrieben: Ohne zu wissen was ein "richtiges Array" ist, würde ich die "Datenbank" extern pflegen:
Den Begriff "richtiges array" habe ich benutzt um zu der ursprünglichen Konstruktion abzugrenzen, die ich jetzt einfach mal pseudo array nenne. Ein array in bash sieht so aus:

Code: Alles auswählen

$ a=(Element1 Element2 Element3 usw.)
$ echo ${a[1]}
Element2
Oder hast du dich nur an dem Begriff "richtiges array" gestört?

Antworten