ubuntuusers.de

Bash: Parameter an ein Skript übergeben

Status: Ungelöst | Ubuntu-Version: Server 14.04 (Trusty Tahr)
Antworten |

jonasjonas

Anmeldungsdatum:
9. November 2016

Beiträge: Zähle...

Hallo Zusammen, das hier ist mein erster Forenbeitrag, ich hoffe ich mache nichts falsch.

Ich habe Server mit Virtualbox. Ich möchte ein Skript schreiben mit dem ich alle laufenden VMs herunterfahren kann und später wieder starten. Dieser Teil funktioniert auch, jedoch möchte ich gerne die Anweisung "start" oder "halt" als Parameter übergeben, dieser Teil funktioniert nicht. Auch das Beispiel aus dem Wiki https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger/ wirft bei mir Fehler.

#!/bin/bash
# willkommen
if [ $1 == "Pingu" ]
  then
    echo "Hallo, kleiner Pingu!"
  else
    echo "Hallo, $1"
fi

Ergibt:

jonas@jonas-PC ~ $ sh wikiBsp.sh Jonas
wikiBsp.sh: 3: wikiBsp.sh: Jonas: not found
Hallo, Jonas

Mein Skript:

#!/bin/bash
if [ $1 == "-s"|| "--start" ]
  then
    DO="start"
  elif [ $1 == "-h" || "--halt"]
  then
    DO="halt"
elif [ $1 == "-w" || "--which"]
  then
    echo "folgende VMs werden gestartet:"
    cat ~/.cache/runningvms
  else
    echo -e "Optionen: \n -h oder --halt \n -s oder --start \n -w oder --which    zeigt die zur startenden VMs"
fi

if [$DO =="start"]
  then
   "folgende VMs werden gestartet:"
    cat ~/.cache/runningvms

    Newline=$'\n'
    IFS=$Newline

    for vms in $(< ~/.cache/runningvms); do
       VBoxManage startvm $vms --type headless
    done

    IFS=
fi

if [$DO=="halt"]
  then
    echo "VBoxManage list runningvms:"
    VBoxManage list runningvms
    VBoxManage list runningvms | sed "s/\"\(.*\)\".*/\1/" >  ~/.cache/runningvms

    Newline=$'\n'
    IFS=$Newline

    for vms in $(< ~/.cache/runningvms); do
       VBoxManage controlvm $vms acpipowerbutton
    done

    IFS=
fi

Über alle Arten von Anregungen für mein Skript bin ich sehr dankbar.

Mfg Jonas

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7782

    if [ $1 == "Pingu" ]

Hier muss unbedingt das "$1" in " " stehen.

[ $1 == "-s"|| "--start" ]

Das gleiche und "-s" || "--start" wird nicht das machen was du meinst.

Vielleicht willst du hier auch lieber ein case .. esac verwenden, Beispiele dafür findest du selbst.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21827

Wohnort: Lorchhausen im schönen Rheingau

frostschutz schrieb:

    if [ $1 == "Pingu" ]

Hier muss unbedingt das "$1" in " " stehen.

Der Fehler passiert aber schon vorher. In der SH (und mit der wird das Skript aufgerufen) sollte man für Strings-Comparisons = verwenden. In der bash tut ==, bei dem Aufruf wird die Shebang allerdings ignoriert.

Sonst nichts hinzuzufügen 😉

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

jonasjonas schrieb:

Ergibt:

jonas@jonas-PC ~ $ sh wikiBsp.sh Jonas
wikiBsp.sh: 3: wikiBsp.sh: Jonas: not found
Hallo, Jonas

Warum schreibst du hier nicht

jonas@jonas-PC ~ $ bash wikiBsp.sh Jonas

?

Du kannst auch das Skript ausführbar machen und es dann direkt mit

./wikiBsp.sh

aufrufen.

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

jonasjonas schrieb:

Auch das Beispiel aus dem Wiki https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger/ wirft bei mir Fehler.

Welches Beispiel genau? Welchen Fehler?

jonasjonas

(Themenstarter)

Anmeldungsdatum:
9. November 2016

Beiträge: 2

#!/bin/bash
# willkommen
if [ $1 == "-p" ] 2>/run/shm/error.log
  then
    echo "Hallo, kleiner Pingu!"
  else
    echo "Hallo, $1"
fi
rm /run/shm/error.log

Danke für eure Hilfe. So funktioniert das Skript, wie gewünscht.

jonas@jonas-PC ~ $ bash wikiBsp.sh 
Hallo, 
jonas@jonas-PC ~ $ bash wikiBsp.sh -p
Hallo, kleiner Pingu!
jonas@jonas-PC ~ $ bash wikiBsp.sh Jonas
Hallo, Jonas

Gibt es eine elegantere Lösung als?

... 2>/run/shm/error.log
...
rm /run/shm/error.log

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7782

...

Hast du die Antworten überhaupt gelesen?

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

jonasjonas schrieb:

Gibt es eine elegantere Lösung als?

... 2>/run/shm/error.log
...
rm /run/shm/error.log
2>/dev/null

leitet die Fehlerausgabe ins Nirvana um. "eleganter" finde ich das aber nicht. Was willst Du damit erreichen? Wenn du abfangen willst, dass das Skript mit einem Parameter übergeben wird, kannst Du die Anzahl der Parameter mit

#@

checken.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21827

Wohnort: Lorchhausen im schönen Rheingau

frostschutz schrieb:

Hast du die Antworten überhaupt gelesen?

Scheinbar nicht. An der Stelle verabschiede ich mich aus dem Thread und wünsche noch viel Spaß

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

BillMaier schrieb:

#@
$# 

wäre dann die Zeile ohne Tippfehler...

Antworten |