2016-04-11 5 views
0
#!/bin/bash 

function func_name { 

arg1=$1; arg2=$2; 

if [[ "${arg1}" == "abcd" ]]; then 
    echo enterd abcd condition 
else 
    echo entered else 
fi 

} 

export -f func_name 

find . -name "*" -type d -exec bash -c '(cd {} && 

func_name; 

)' bash $1 $2 {} \; 

Пытается запустить функцию, имеющую условие, как условие подобия в инструкции поиска. Он просто входит в другую часть. Зачем?не входит, если условие при использовании функции

+0

Вы никогда не отвечали на запросы о разъяснении в [предыдущем заданном вопросе] (// stackoverflow.com/questions/36493277/do-2-processes-at-a-time-1find-command-2if-else-condition- в зависимости от комманда), и теперь у вас есть другой вопрос с той же проблемой. Мы не можем читать ваши мысли, а код, который не делает то, что вы хотите, только говорит нам, чего вы не хотите. Вам нужно объяснить, что вы хотите выполнить, и как вы думаете, что этот код приведет вас туда. – tripleee

+1

Обратите внимание, что '-name '*'' по существу не-op; он сообщает о скрытых именах, начинающихся с '.' и тех, которые обычно видны. –

+0

Я пометил один из ответов, принятый, нажав зеленую галочку рядом с ответом ClaudioM – amit

ответ

2

Непонятно, какие аргументы следует передавать где, но ваша текущая попытка, безусловно, неверна. Вы не передаете любые аргументы func_name, когда вы его вызываете, поэтому "$arg1" распространяется на пустую строку. Я подозреваю, что вы хотите что-то вроде

find . -name "*" -type d -exec bash -c 'cd "$1" && func_name "$2" "$3"' {} "$1" "$2" \; 

Здесь func_name явно дано аргументы, переданные в оригинальном сценарии. Вам не нужно подоболоть в аргументе -c, так как вся команда уже выполняется в отдельном процессе.

Если вы используете bash 4 или более поздней версии, вам, вероятно, фактически не нужно использовать find.

shopt -s globstar 
for d in **/*/; do 
    pushd "$d" 
    func_name "$1" "$2" 
    pops 
done 
+0

arg1 и arg2 являются аргументами командной строки – amit

+0

Это ясно, но как именно вы хотите и ожидаете, что они будут переданы в подоболочку, и на функцию? – tripleee

+0

Я хотел, чтобы аргументы командной строки даже читались функцией. Однако решение chepner для basah 4 или более поздних версий отлично работает. Но я не получил правильное значение решения find find, данное им – amit

0

Переменные внутри функционального блока оцениваются только при вызове функции. Если вы хотите связать некоторые переменные во время объявления функции, используйте eval или пару глобальных переменных.

#!/bin/bash 

_private_foo=$1 
_private_bar=$2 

func_name { 
    if [[ "$_private_foo" == "abcd" ]]; then 
    echo entered abcd condition 
    else 
    echo entered else 
    fi 
} 

Если последующий код никогда не изменяет глобальные переменные _private_foo и _private_bar функция будет работать, как если начальные глобальные значения $1 и $2 интерполировались в определении функции, без многочисленных осложнений и опасностей eval.

Если вам нужна функция для работы в подоболочке, вам также нужно будет export глобальными или каким-либо иным способом передать их, как указано в @chepner.

+1

Вам придется экспортировать '_private_foo' и' _private_bar', хотя, если 'func_name' вызывается оболочкой, запущенной' find', так как оболочка использует динамическую область. – chepner

+0

@chepner Хорошее дополнение, спасибо! – tripleee