为什么这个bash脚本不能递归运行?

时间:2017-08-21 18:34:14

标签: linux bash recursion

我将以递归方式运行数据的基本目录,然后修改其中的每个文件,并在另一个基本目录上创建一个新文件。所以我需要两个参数,一个是原始数据库目录的路径,另一个是我放入新文件的基本目录。但是我的代码有问题。当我把这两个参数放在main函数下时,而不是在终端上输入它们。希望有人可以帮助我。

以下是我的代码:

function traverse() {   
    for file in $(ls "${data_path}")
    do
        echo "in file: ${data_path}/${file}"
        if [[ ! -d ${data_path}/${file} ]]; then

            if [[ ${data_path}/${file} == *.nii.gz ]];then

                echo "is nifti: ${data_path}/${file} "

            else
        echo "not file"
        echo ${data_path}

        temp_path=${data_path/'/data2/Projects/Incoming_monkey'/}
        new_path="${new_destination}/${temp_path}"
        mkdir -p ${new_path}
        echo ${new_path}
        fi
        else
            echo "entering recursion with: ${data_path}/${file}"
            traverse "${data_path}/${file}" "${new_destination}"
        fi
    done
}
function main() {

   echo "main start"

   data_path=/data2/Projects/Incoming_monkey/MAJOM/08_20170706/func
   new_destination=/data2/Projects/reorientation

   traverse "${data_path}" "${new_destination}"
}

main

1 个答案:

答案 0 :(得分:0)

我没有试图推断代码背后的逻辑,但我可以看到一些明显的错误。在main函数中创建的变量data_pathnew_destination是全局的,这就是为什么您能够在traverse函数中读取它们的原因。为了解决这个问题,我在它们之前添加了declare关键字,以便成为main函数的本地关键字。此外,您将这两个变量作为参数传递给traverse函数,该函数从代码中不读取任何参数。为了解决这个问题,我将变量名称替换为$ 1和$ 2,将它们作为参数读取。

编辑:找到更多需要本地化的变量。 (temp_pathnew_path

#!/bin/bash

function traverse() {   
    for file in $(ls "${1}") # Replace data_path with 1
    do
        echo "in file: ${1}/${file}"
        if [[ ! -d ${1}/${file} ]]; then

            if [[ ${1}/${file} == *.nii.gz ]];then

                echo "is nifti: ${1}/${file} "

            else
        echo "not file"
        echo ${1}

        declare temp_path=${1/'/data2/Projects/Incoming_monkey'/}
        declare new_path="${2}/${temp_path}"   # Replaced new_destination by 2
        mkdir -p ${new_path}
        echo ${new_path}
        fi
        else
            echo "entering recursion with: ${1}/${file}"
            traverse "${1}/${file}" "${2}"
        fi
    done
}
function main() {

   echo "main start"

   declare data_path=/data2/Projects/Incoming_monkey/MAJOM/08_20170706/func
   declare new_destination=/data2/Projects/reorientation

   traverse "${data_path}" "${new_destination}"
}

main