2017-01-25 21 views
1

У меня есть пользовательский проверочного Баш функциюпередать результаты поиска в пользовательскую функцию bash?

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

, который я пытаюсь вызвать как:

main `find . -name hello` 

но только повторяющий первый файл, переданный в списке. Оригинальный выход find . -name hello является

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

Как я могу убедиться, что весь список передается?

Спасибо!

+0

Есть ли конкретная причина, почему вы должны использовать функцию? Здесь я не вижу смысла – Inian

+0

Быстрое и грязное исправление в вашем случае было бы заменить $ 1 в функции $ @ –

ответ

1

Используйте соответствующий Process-Substitution синтаксис цикла над файлами, и вы не нужна функция, если вы хотите, чтобы выполнить определенное действие на каждом из файлов с find выхода, просто сделать

#!/bin/bash 

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

(или), если вы боитесь иметь специальные символы в именах файлов, таких как пробел или любой метасимвол, используйте опцию -print0, если она поддерживается (GNU findutils) для разделения файлов на \0 де-лимитер и чтения он возвращается с тем же де-ограничителем.

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

Я просто сделать НЕ рекомендуется использовать функцию этого-путь, но вы можете сделать что-то подобное,

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")" 

(или) более-просто просто сделать,

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

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

Ключом здесь является двойная кавычка командной строки $(..), которая возвращает вывод find, чтобы сохранить новую строку charac которые затем передаются в пользовательскую функцию.

+0

спасибо! я не совсем уверен, что делаю это правильно, но я пробовал: main() { , тогда как IFS = read -r file do do echo "$ file" # Другие действия на «$ file» go here сделано <<($ 1) } с вызовом: main 'find. -type f -name «OUTCAR» ', и это не сработало – lenzinho

+0

@lenzinho: Почему вы снова используете эту функцию? Нет смысла использовать его таким образом. Используйте точный синтаксис, как я. – Inian

+0

Я надеюсь использовать функцию, потому что планирую сделать этот вызов несколько раз в будущем и хочу иметь гибкость при вызове различных опций в зависимости от ситуации. – lenzinho