ubuntuusers.de

bash Array

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

new1

Avatar von new1

Anmeldungsdatum:
23. Januar 2009

Beiträge: 117

hallo @ all ich versuche ein Skript zu schreiben aber ich habe ein Problem mit Array's. Die Syntax ist einleuchtend aber irgend wie möchte mein Rechner das nicht umsetzen.

Zu Test Zwecken habe ich ein kleinen Skript aus der wiki genommen:

1
2
3
4
#!/bin/bash
array[1]="Hallo"

echo ${array[*]} 

Aber wenn ich das versuchen mit sh test zu starten bekomme ich das:

artur@artur-desktop:~/Dokumente$ sh test
test: 2: array[1]=Hallo: not found
test: 4: Bad substitution

Ich habe schon einiges darüber gelesen aber vielleicht mache ich ach Form Fehler, aber die Syntax sollte so stimmen.

gehtmaguad

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

wenn du das scipt auf diese weise startest sollte es funktionieren:

script ausführbar machen:

chmod u+x test

script ausführen:

./test

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

wenn ich mich nicht irre, kriegst du damit die Anzahl der Elemente im Array

echo ${array[*]} 

gehtmaguad

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

pinguino schrieb:

wenn ich mich nicht irre, kriegst du damit die Anzahl der Elemente im Array

echo ${array[*]} 

Um die Anzahl zu erhalten muss man vor dem Array ein Route hinzufügen:

echo ${#array[*]}

Im aktuellen Syntax wird der Inhalt wiedergegeben.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

new1 schrieb:

1
#!/bin/bash

Aber wenn ich das versuchen mit sh test zu starten bekomme ich das:

artur@artur-desktop:~/Dokumente$ sh test

Du schreibst oben, es sei ein Bashscript, und startest es dann als sh-Script. Das kann zwar funktionieren, funktioniert aber nicht immer.

Umgekehrt wohl eher könnte man die meisten sh-Skripte auch per Bash starten. Die Shells sind aber nur teilweise kompatibel.

gehtmaguads Lösung empfehle ich auch, wollte nur erklären, wieso es eine ist. Alternativ wäre auch

bash test

eine.

Wer schreibt mal einen kurzen Wikiartikel dazu, der leicht gefunden wird? ☺

gehtmaguad

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

user unknown schrieb:

Alternativ wäre auch

bash test

eine.

Wieso kann ich auf diese Art ein Script ausführen, ohne dafür Execute-Rechte zu haben?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4668

Wohnort: Berlin

@gehtmaguad: Wieso nicht? Du hast ja die Rechte um die bash auszuführen. Für die ist das Skript dann einfach eine normale Textdatei, die eingelesen und interpretiert wird.

new1

(Themenstarter)
Avatar von new1

Anmeldungsdatum:
23. Januar 2009

Beiträge: 117

Wenn ich das verstehe habe ich bloß das falsch aufgerufen

Das heißt:

bash test

Ich danke euch ihr habt mir wirklich geholfen, und wider was gelernt 👍

gehtmaguad

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

Marc 'BlackJack' Rintsch schrieb:

@gehtmaguad: Wieso nicht? Du hast ja die Rechte um die bash auszuführen. Für die ist das Skript dann einfach eine normale Textdatei, die eingelesen und interpretiert wird.

stimmt, eig. eh logisch 😉 danke

new1

(Themenstarter)
Avatar von new1

Anmeldungsdatum:
23. Januar 2009

Beiträge: 117

Noch eine frage zum Array. Ich habe ein Skript der aus einer Datei Zeilen weise was ausliest und das dann in ein Array Speichert.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
PF="/home/artur/Dokumente/TO/read.txt"
I="1"

cat $PF | while read FILE
 do
  array[$I]=$FILE
  I=$((I+1))
 done

  echo ${array[9]}

Leider ist es so das ich den letzten teil des Skripts nicht ausführen kann da die Schleife sich in einem eigene Prozess sich befindet. Ich möchte gern wissen wie ich das umgehen kann und den Automatismus beibehielten kann.

wenn ich das ausführe passiert folgendes

artur@artur-desktop:~/Dokumente$ bash test

artur@artur-desktop:~/Dokumente$ 

wie kann ich die Werte des Array's auch außerhalb des Prozesses verwenden

p.s. Die Datei ist nicht leer!

mfg new

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Der Index eines Arrays startet bei 0. Der manuelle Zähler ist allerdings eh überflüssig, da man Werte einfach durch Zuweisung an den leeren Index an ein Array anhängen kann. cat ist ebenso überflüssig und ist durch eine Shell-Umleitung zu ersetzen. Außerdem fehlt das Quoting der $file-Variable. Korrigiert sieht die Schleife so aus:

1
2
3
while read file; do
  array[]="${file}"
done < $PF

PF ist übrigens kein guter Name, da er keinerlei Aufschluss über den Inhalt der Variable gibt. Durchgehend groß geschriebene Namen sind übrigens per Konvention Konstanten vorbehalten.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

x[]=42 funktioniert weder in der zsh noch in der bash. Ich würde es ja so machen:

1
2
3
4
i=0
while read file; do
    array[$((i++))]="$file"
done

Auch ist die Information, dass der Intex eines Arrays bei 0 starte, so nicht richtig. Ein "Array" in der bash ist kein Array im eigentlichen Sinn, sondern eine Hashtabelle von Zahlen nach Strings. Ein bash-"Array" kann durchaus an der dritten Stelle einen Eintrag enthalten und an der ersten nicht. Beispielsweise kann man mit array=([1]=3 [3]=4) ein "Array" erzeugen, das nur an den Indizes 1 und 3 belegt ist. Mit ${!array[@]} kann man die Menge der belegten Indizes erhalten.

new1

(Themenstarter)
Avatar von new1

Anmeldungsdatum:
23. Januar 2009

Beiträge: 117

ja danke das sind alles super Vorschläge, aber es ist leider nicht das was ich wissen möchte

es geht darum ob ich aus der schleife die werte sprich aus einem anderen Prozess Eindämmen kann und weiter verwenden kann.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Wenn Du, wie von Lunar bereits vorgeschlagen, anstelle von cat eine Shell-Umleitung verwendest, wird die while-Schleife nicht in einer Subshell ausgeführt.

new1

(Themenstarter)
Avatar von new1

Anmeldungsdatum:
23. Januar 2009

Beiträge: 117

"KLATSCH AN DIE STIRN" jop das das funktioniert^^

Antworten |