globale Varialben in shell script

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hey Folk,

    wenn ich eine globale Veriable "s" in einem Shell-Script deklarieren will.
    export s=0

    soweit so gut jetzt kommt eine schleife in der diese Variable um 1 erhöht wird.
    …loop
    export s=$(( $s + 1 ))

    nach dem loop loop steht dann
    echo “$s”

    der Wert ist 0
    Warum ist das so?
    Wenn ich das echo in der Schleife stelle wird $s schön hochgezählt

    Kann mir hierzu jemand was sagen?

    icon_danke_ATDE.gif

  • Achso,

    naja ich lege das shell-script in rc.local
    dieses Script überwacht ein input - sobald dieser abfällt wird eine email ausgegeben.
    Die Daten liegen in einer mysql datenbank.
    Genau dafür benötige ich diese Schleife, denn ich möchte erst die Datenbank auslesen und alle Werte in ein Array speichern.
    Es läuft der Counter mit - doch wenn der dann nachher 0 ist klappt das nicht so recht

  • Also noch mal:

    Du hast ein Script. In diesem Script setzt du eine Variable s.
    Was willst du nun mit dieser Variablen machen?
    Wenn du diese in einem anderen Script nutzen/abrufen willst, dann musst du den Vorschlag von framp anwenden. Oder

    Code
    source myScrip.sh

    Wenn du die Variable aber im selben Script, später verändern willst brauchst du nix weiter zu beachten...

    ...es sei denn du deklarierst die Variable so:

    Code
    _set() {
      local s=123
    }

    dann wär diese Variable nur in der function _set verfügbar

    Ansonsten bitte genauer beschreiben was du machst und vor hast (am besten das Script posten und dann beschreiben was du machen willst)

  • Hmm jetzt habe ich die Datei schon vermurkst - sorry
    Also ich greife über ein Shell.Script auf eine mysql - database zu.
    Habe aber jetzt das Problem mit den Variablen.
    Entweder ich bekomme den Query Zeilenweise oder Wortweise.

    Habe es einfach noch nicht gecheckt wie ich in einem Shell-Script ein Array anlegen kann.
    klar das declare -a arr["me","du","ich"]
    meine ich nicht. Sondern ein Array welches von einer Textdatei oder Datenbank kommt.!!!!

    icon_danke_ATDE.gif

  • Poste doch bitte einfach mal dein Script damit es leichter ist dir zu helfen


    PS: declare -A funktioniert nicht mit bash v3. Man muss aber auch nicht unbedingt solche a["b"]=c arrays nutzen, es gibt auch noch andere Wege - nur ob und wie das in deinem Fall sinnvoll wäre muss ich zZt noch anzweifeln

  • OK also mal bis hier:
    #!/bin/sh

    date "+%d-%m-%Y %H:%m:%S Stromausfall" >> /var/log/vca.log

    mysql -u root -pxxx -D neu < script.sql > output.tab

    s=0
    cnt=0

    for i in $(cat output.tab); do

    if [ "$s" = "2" ]; then
    name=$i
    echo "$name"
    else
    cnt=`expr $cnt + 1`
    fi
    s=`expr $s + 1`
    if [ "$cnt" = "2" ]; then
    cnt=0
    s=0
    # net rpc shutdown -S $name -U administrator%$i -c "Strom weg" -t 1 -f
    echo "$name"
    echo "$i"
    sleep 10
    fi
    done;

    # while read line; do echo $line ;done < output.tab
    ich weiß - momentan ist das Problem die Schleife - Agesehen davon, dass es niemals meine Absicht war die Datenbankausgabe in ein Textfile zu schreiben und von dort wieder einzulesen.
    Ich will nichts weiter machen als eine IP-Adresse und das Passwort von einer Datenbank holen und mit rcp die jeweiligen Rechner runterfahren

    Aber irgendwas läuft da schief??
    icon_wallbash.gif

  • Bist Du hier:

    Zitat


    # net rpc shutdown -S $name -U administrator%$i -c "Strom weg" -t 1 -f


    sicher ;) ?
    Ich hab' das als "Remote procedure call" in Erinnerung
    Ansonsten würde ich sagen, dass Du keine Environment-Variable(n) setzen musst.

    cheers,
    -ds-

  • Das nächste mal bitte den Code in Kode posten...

    Gewöhn dir außerdem an die moderner bash anstatt sh zu nutzen (bash ist abwärtskompatibel, aber sh kann nicht das selbe wie bash)


    Was steht denn in der Datenbank drin?
    Werden alle Results benötigt?
    Wieso fängst du erst beim zweiten Result an?

    Dein Script:

    Etwas unleserlich/unverständlich geschrieben

    Dein gewählter Weg ist suboptimal, über eine extra Datei zu arbeiten erzeugt eine unnötige Belastung der SD - stattdessen wäre es besser die Ausgabe des mysql Befehls direkt zu verarbeiten und auch dafür zu sorgen dass die column names geskipped werden. Pipe einfach die Ausgabe des Befehls direkt an die while Schleifen..

    Was stünde denn in $i drin? Das kann ich grad nicht nachvollziehen... Kann ich also nur raten das es "id" wäre?

    Folgendes sollte dein ursprüngliches Problem umgehen und wäre auch schonender für die SD:

  • Genau so funktioniert es!
    Danke!

    Nein, die ID ist mir nicht wichtig. Ich lese nur den PC-Namen und das Kennwort aus. Das sortiert nach einer Folge (will ja nicht den SQL-Server runterfahren, während ein anderer Server noch auf dieser DB ist).

    Kann mich also nur wiedermal bedanken!

    icon_danke_ATDE.gif

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!