为何find命令未找到文件时Shell脚本的else分支不执行?
问题原因与解决办法
核心原因
if语句判断的是赋值操作的退出状态码,而这里的退出状态由find命令决定:
find命令只要自身执行没有出错(比如无权限问题、指定路径存在),哪怕完全没匹配到目标文件,它的退出状态码依然是0(表示命令执行成功)。- 所以不管有没有找到文件,
if的条件都会判定为真,进而执行then分支,永远走不到else。
解决办法
可以通过两种方式修正:
方法1:判断变量是否为空
先执行find赋值,再检查变量内容是否非空:
filedir=$(find . -type f -name "*.sql.gz" -mtime -1 -printf "%f\n") if [ -n "$filedir" ]; then echo "$filedir" else echo "oops" fi
注意给$filedir加双引号,避免文件名含空格时出现异常。
方法2:让无匹配时返回非0状态
通过管道配合grep,利用grep在无输入时返回非0的特性:
if filedir=$(find . -type f -name "*.sql.gz" -mtime -1 -printf "%f\n" | grep .); then echo "$filedir" else echo "oops" fi
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

