2012-09-19 2 views
0

Я пытаюсь выяснить, почему мой обход не работает. Я считаю, что я изолировал проблему до точки в коде, где он говорит «каталог содержит», а затем то, что было передано функции. Функция получает переданный массив, содержащий все новые пути к файлу для эха, но по какой-то причине он получает только первый. Я передаю массив неправильно или может быть что-то еще?Рекурсивная ширина первого обхода в Bash

#!/bin/bash 

traverse(){ 
    directory=$1 
    for x in ${directory[@]}; do 
    echo "directory contains: " ${directory[@]} 
    temp=(`ls $x`) 
    new_temp=() 
    for y in ${temp[@]}; do 
     echo $x/$y 
     new_temp=(${new_temp[@]} $x/$y) 
    done 
    done 

    ((depth--)) 

    if [ $depth -gt 0 ]; then 
    traverse $new_temp 
    fi 
} 

ответ

1

Вы не можете передавать массивы в качестве аргументов. Вы можете передавать только строки. Вам нужно будет сначала развернуть массив в список его содержимого. Я позволил сделать depth локальным для вашей функции, вместо того, что я предполагаю, является глобальной переменной.

traverse(){ 
    local depth=$1 
    shift 
    # Create a new array consisting of all the arguments. 
    # Get into the habit of quoting anything that 
    # might contain a space 
    for x in "[email protected]"; do 
    echo "directory contains: [email protected]" 
    new_temp=() 
    for y in "$x"/*; do 
     echo "$x/$y" 
     new_temp+=("$x/$y") 
    done 
    done 

    ((depth--)) 
    if ((depth > 0)); then 
    traverse $depth "${new_temp[@]}" 
    fi 
} 

$ dir=(a b c d) 
$ init_depth=3 
$ traverse $init_depth "${dir[@]}" 
+0

Ahh, спасибо за это :) – Sam

Смежные вопросы