在检查文件和目录后,我决定将它们分解为单独的函数并进行调用。我究竟做错了什么?抱歉最近问了这么多问题。
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上。
答案 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" ]]
以检查是否找到了文件。但最好使用退出代码,该代码存储在$?
中。这样,如果回声发生变化或者你为函数添加了另一个回声,你就不必重写控制结构。