2017-06-02 4 views
0

Ich würde gerne die Antwort auf wahrscheinlich ziemlich einfache Frage herausfinden: Ich würde in Anführungszeichenfolgen mit Whitespaces innerhalb als eigenständige Argumente für die Funktion übergeben.Als Argumente an die Funktion übergeben

Es gibt die folgende Datei mit Daten (zum Beispiel):

one 
two three 
four five six 
seven 

Und es ist Skript mit 2 einfachen Funktionen:

params_checker() 
{ 
    local first_row="$1" 
    local second_row="$2" 
    local third_row="$3" 

    echo "Expected args are:${first_row} ; ${second_row} ; ${third_row}" 
    echo "All args are:" 
    for arg in "[email protected]"; do 
     echo "${arg}" 
    done 
} 

read_from_file() 
{ 
    local args_string 

    while read line; do 
     args_string="${args_string} \"${line}\"" 
     echo "Read row: ${line}" 
    done < ./test_input 

    params_checker ${args_string} 
} 

read_from_file 

Mit anderen Worten: Ich mag würde Zeilen von Text erhalten Datei als Argumente für die Funktion params_checker (jede Zeile aus der Datei als anderer Parameter, ich muss Leerzeichen in den Zeilen). Versuchen Sie, kombinierte String zu machen mit zitierte "Substrings" wurde nicht, und Ausgang war:

~/test_sh$ sh test_process.sh 
Read row: one 
Read row: two three 
Read row: four five six 
Read row: seven 
Expected args are:"one" ; "two ; three" 
All args are: 
"one" 
"two 
three" 
"four 
five 
six" 
"seven" 

Erwartung ist $ 1 = "Eins", $ 2 = "zwei, drei", $ 3 = "vier fünf sechs" ... Das Zitieren von $ {args_string} bei der Übergabe an params_checker ergab ein anderes Ergebnis, die Zeichenfolge wird als einzelnes Argument übergeben.

Könnten Sie bitte helfen, den richtigen Weg zu finden, wie man solche Zeichenfolgen mit Leerzeichen aus Datei als eine andere eigenständige Funktion Argumets übergeben?

Vielen Dank für Ihre Hilfe!

Antwort

1

In bash/ksh/zsh würden Sie ein Array verwenden. In sh, können Sie die Parameter „$ 1“, „2 $“ usw. verwenden:

read_from_file() 
{ 
    set --     # Clear parameters 

    while read line; do 
     set -- "[email protected]" "$line" # Append to the parameters 
     echo "Read row: ${line}" 
    done < ./test_input 

    params_checker "[email protected]"  # Pass all parameters 
} 
0

Dort gehen Sie, diese sollten Sie geben, was Sie suchen:

#!/bin/bash 
params_checker() 
{ 
    local first_row="$1" 
    local second_row="$2" 
    local third_row="$3" 
    local forth_row="$4" 

    echo "Expected args are: ${first_row} ; ${second_row} ; ${third_row} ; ${forth_row}" 

    echo "All args are:" 
    for i in "[email protected]" 
    do 
     echo "$i" 
    done 
} 

read_from_file() 
{ 
    ARRAY=() 
    while read line; do 
     echo "Read row: ${line}" 
     ARRAY+=("$line") 
    done < ./test_input 

    params_checker "${ARRAY[@]}" 
} 

read_from_file; 

Das in BASH gut funktionieren sollte. Wenn Ihre Datei den Namen test.sh hat, können Sie sie wie folgt ausführen: ./test.sh

+0

Was ist der Zweck dieser Variablen selbst zuweisen? –

+0

Danke @chepner. Das ist viel sauberer. –

Verwandte Themen