2016-12-03 2 views
0

Ich möchte eine Reihe von Arrays (nacheinander) für eine Funktion in einem Skript verfügbar machen. Die Daten, die ich in Array-Form auswerten möchte, sind dynamisch und ich muss irgendwie aus einer Textdatei mit Daten in ein Skript importieren, wenn sich die Daten ändern. Ich beschäftige mich mit den Rohdaten, so dass meine vorverarbeiteten Daten, die die Form hat:Dynamisches Array in Bash-Skript importieren

1 2 3 32 509.1001 
3.01 43.56 23.5 
1209 898 34.67 0 
etc... 

In einem Bash-Skript myscript.sh, habe ich versucht, die folgende (direkt inspiriert von @ choroba der solutions):

#!/bin/bash 
# 
# somehow, import array `testream` here 
# 
function array_contain(){ 
    # pass array to script by name 
    array_arg=$2[@] 
    loc_array=("${!array_arg}") # magic here ! 
    local arr_elt 
    for arr_elt in "${loc_array[@]}"; do 
     if [ "$arr_elt" == "$1" ]; then 
      printf "%d%s\n" "$1" " - yup"; # do something 
      exit 0 
     fi 
    done 
    printf "%d%s\n" "$1" " nope"; # do something else 
    exit 1 
} 
array_contain "$1" testream 

Das prbm funktioniert nur dann, wenn beim Aufruf $myscript.sh 34.23 testream das Array testream aus myscript.sh bekannt ist. In der Antwort von choroba wird diesem Array tatsächlich ein Inhalt in der Shell zugewiesen, wenn die Funktion definiert ist und direkt von der interaktiven Shell ausgeführt oder einfach innerhalb des Skripts definiert wird.

Also, wie importiere ich die Array-Daten aus einer Datei, legen Sie sie in das Array testream so $myscript.sh 34.23 testream funktioniert? -- Prost.

Antwort

0

können Sie diese verwenden, um ein Array von Dateiinhalt lesen Zeile für Zeile zu erstellen:

readarray -t ARRAY_CREATED_FROM_FILE < <(cat < "/path/to/testream" 2> /dev/null) 

for item in "${ARRAY_CREATED_FROM_FILE[@]}"; do 
    echo "reading each line. Content: ${item}" 
done 

Vielleicht kann Ihnen helfen.

+0

Hallo und danke, aber warum verwenden: 'rearray -t array_to_populate <<(cat Cbhihe

+0

Ist das gleiche für Sie in diesem Fall, aber vielleicht nützlich, wenn Sie mehr Komplexität wollen, ich meine, zwischen Klammern können Sie piped Befehle zum Beispiel setzen. 'reararray -t array_to_populate <<(cat OscarAkaElvis

+0

Nun, ich kannte den 'mapfile'-Befehl ... Aber es ist ratsam, wenn Sie in diesem Forum oder irgendwo auf SE antworten, * antworten Sie einfach auf das OP *. Für einen weiteren Kommentar kann Ihnen jemand sagen: 'readarray -t array_to_populate <<(cat Cbhihe