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,则不必重写控制结构。
在对文件和目录进行检查后,我决定将它们分解成单独的函数并进行调用。我究竟做错了什么?抱歉最近问了这么多问题。
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,则不必重写控制结构。