2017-01-25 3 views
1

Ich habe eine benutzerdefinierte bash TestfunktionErgebnisse von Find an eine benutzerdefinierte Bash-Funktion übergeben?

main() { 
    list=$1 
    for i in ${list}; do 
     echo $i 
    done 
} 

, die ich zu nennen versuche wie:

main `find . -name hello` 

aber es wird nur die erste Datei in der Liste geführt Echo. Die ursprüngliche Ausgabe von find . -name hello ist

./world1/hello 
./world2/hello 
./world3/hello 
./world4/hello 
./world5/hello 
./world6/hello 
./world7/hello 
./world8/hello 

Wie kann ich sicherstellen, dass die gesamte Liste geführt wird?

Danke!

+0

Gibt es einen bestimmten Grund, warum Sie die Funktion verwenden sollten? Ich kann hier keine Verwendung sehen – Inian

+0

Die schnelle und dreckige Lösung in Ihrem Fall wäre, die $ 1 in der Funktion durch $ @ –

Antwort

1

Verwenden Sie eine richtige Process-Substitution Syntax Schleife über Dateien, und Sie nicht eine Funktion benötigen, wenn Sie eine bestimmte Aktion auf jedem der Dateien von find Ausgang zu tun suchen, nur tun

#!/bin/bash 

while IFS= read -r file 
do 
    echo "$file" 
    # Your other actions on "$file" go here 
done < <(find . -type f -name "hello") 

(oder) Wenn Sie Angst haben, Sonderzeichen in Dateinamen wie Leerzeichen oder Metazeichen zu verwenden, verwenden Sie die -print0 Option, wenn sie unterstützt wird (GNU findutils Paket), um die Dateien auf \0 zu trennen und zu lesen es zurück mit dem gleichen De-Limiter.

while IFS= read -r -d '' file 
do 
    echo "$file" 
    # Your other actions on "$file" go here 
done < <(find . -type f -name "hello" -print0) 

ich nur einfach tun NICHT empfehlen diesen Weg mit der Funktion, aber man kann so etwas wie zu tun,

function findRead() { 
    while IFS= read -r file 
    do 
     echo "$file" 
     # Your other actions on "$file" go here 
    done <<<"$1"  
} 

findRead "$(find . -type f -name "hello")" 

(oder) mehr-einfach nur tun,

function findRead() {  
    for file in "$1" 
    do 
     echo "$file" 
    done 
} 

findRead "$(find . -type f -name "hello")" 

Der Schlüssel hier ist, die $(..) Befehl-Ersetzung, die die Ausgabe von find zurückgibt, double-quote, um das new-line char zu erhalten Diese werden dann Ihrer benutzerdefinierten Funktion zugeführt.

+0

Dank zu ersetzen! Ich bin mir nicht ganz sicher, ob ich das richtig mache, aber ich habe es versucht: main() { während IFS = read -r-datei do echo "$ file" # Ihre anderen Aktionen auf "$ file" gehen Sie hier done <<($ 1) } mit dem Aufruf: Haupt 'finden. -type f -name "OUTCAR" 'und es hat nicht funktioniert – lenzinho

+0

@lenzinho: Warum verwenden Sie die Funktion erneut? Es macht keinen Sinn, es so zu benutzen. Verwenden Sie die genaue Syntax wie ich. – Inian

+0

Ich hoffe, eine Funktion zu verwenden, weil ich plane, diesen Aufruf in der Zukunft mehrere Male zu machen und die Flexibilität haben möchte, je nach Situation verschiedene Optionen aufzurufen – lenzinho

Verwandte Themen