bash - 我现在做错了什么?

bash - what am i doing wrong now?

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

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": [[: 无文件: 表达式语法错误(错误标记为 "files") 检测到目录或文件

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

你可能应该在 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 退出,并使用其他整数表示错误等

进一步说明

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

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

在您的例子中,您将 checkForFilesInCurrentDir 的输出保存到一个变量中。由于您的函数回显 'some files' 或 'no files',这是变量的内容,而不是退出代码。所以你必须检查 [[ $filesInDir = "some files" ]] 来检查是否找到了文件。但最好使用存储在 $? 中的退出代码。这样,如果 echo 发生变化或者您向函数添加另一个 echo,则不必重写控制结构。