bash - 我现在做错了什么?

时间:2015-04-12 00:44:30

标签: bash function terminal refactoring

在检查文件和目录后,我决定将它们分解为单独的函数并进行调用。我究竟做错了什么?抱歉最近问了这么多问题。

function checkForFilesInCurrentDir(){
    # check if there are files in the current directory
    doFilesExist=`find . -maxdepth 1 -type f`
    if [ -z "$doFilesExist" ]; then
        echo "no files"
        return 0 
    else
        echo "some files"
        return 1
    fi
}

function checkForDirsInCurrentDir(){
    # check if there are dirs excluding . and .. in the current directory
    doDirsExist=`find . -mindepth 1 -maxdepth 1 -type d`
    if [ -z "$doDirsExist" ]; then
        echo "no dirs"
        return 0
    else
        echo "some dirs"
        return 1
    fi
}
# function to cd to the next non-empty directory or next branching directory
function cdwn(){
    # check if there are files in current dir
    filesInDir=`checkForFilesInCurrentDir`
    dirsInDir=`checkForDirsInCurrentDir`
    if [[ "$filesInDir" -eq 1 ]]  && [[ "$dirsInDir" -eq 1 ]]; then
        echo "now is a good time to cd"
    else
        echo "dirs or files detected"
    fi
}

在我返回true / false之前以同样的方式进行测试但我改为返回1/0以防万一,但这似乎不是问题。这比使用时节省的时间更长,所以我需要确保从中学习,以便我未来的努力更快......

运行程序时,我得到以下输出。 sh.exe“:[[:没有文件:表达式中的语法错误(错误标记是”文件“)) 检测到目录或文件

我或许应该提到我使用git bash终端在Windows 7上。

1 个答案:

答案 0 :(得分:1)

您应该在cdwn

中执行类似的操作
 function cdwn {
     # check files in dir and output immediately 
     checkForFilesInCurrentDir
     # store the return value
     ret="$?"

     # check for dirs in dir and output
     checkForDirsInCurrentDir

     if [[ $ret -eq 0 ]] && [[ $? -eq 0 ]]; then
         echo success
     else
         echo "at least one failed"
     fi
 }

您可以通过访问shell内置$?来检查上次调用函数的退出状态。这可能对你有很大的帮助!

哦,顺便说一下:尝试在成功时使用代码0退出,并使用其他整数进行错误等。

进一步说明

您试图检查被调用函数的退出状态(即返回值),它们存储在内置$?的shell中。相反,您使用以下方式定义变量:variable=$(some command)。这会将函数或命令的所有输出都放在变量中。

例如:使用var=$(ls)会将所有文件和文件夹存储在变量var中。但命令以exit 0结尾,但未显示为输出,因此无法从var检索。此退出状态将保存在$?

在您的情况下,您将checkForFilesInCurrentDir的输出保存到变量中。由于你的功能回应了某些文件'或者'没有文件',这是变量的内容,而不是退出代码。因此,您必须检查[[ $filesInDir = "some files" ]]以检查是否找到了文件。但最好使用退出代码,该代码存储在$?中。这样,如果回声发生变化或者你为函数添加了另一个回声,你就不必重写控制结构。