Bash脚本判断文件超1.6GB时目标命令未触发的原因排查
问题分析与解决方案
这个问题大概率是脚本解释器和语法兼容性导致的,我来帮你拆解一下核心原因和解决办法:
核心问题:[[ 是Bash专属语法,但脚本用了#!/bin/sh
你的脚本开头写的是#!/bin/sh,但里面用了[[ ... ]]这种Bash特有的条件表达式。很多Linux系统里,/bin/sh其实是POSIX兼容的轻量shell(比如dash),并不支持[[语法。当脚本在这类shell下运行时:
[[会被当作一个不存在的命令执行,直接返回失败状态- 不管
find有没有找到符合条件的大文件,条件判断都会走else分支,所以somecmdbecausefileisbigger永远不会触发
另外还有一个可能的小坑:如果/home/methuselah/file是目录而非单个文件,find会遍历目录下所有文件,只有当其中存在大于阈值的文件时才会输出内容,这可能和你“检查特定文件大小”的预期不符。
解决方案
根据你的需求,这里有几种可行的修复方式:
1. 改用POSIX兼容的条件判断(保留#!/bin/sh)
用grep -q .来检测find的输出是否非空——grep -q .会在输入有内容时返回成功(0),无内容时返回失败(1),完美适配POSIX shell:
#!/bin/sh SIZE_THRESHOLD=1717986918 if find /home/methuselah/file -type f -size +${SIZE_THRESHOLD}c 2>/dev/null | grep -q .; then somecmdbecausefileisbigger else somecmdbecausefileissmaller fi
2. 切换到Bash解释器
把脚本开头改成#!/bin/bash,这样[[ ... ]]语法就能正常工作了:
#!/bin/bash SIZE_THRESHOLD=1717986918 if [[ $(find /home/methuselah/file -type f -size +${SIZE_THRESHOLD}c 2>/dev/null) ]]; then somecmdbecausefileisbigger else somecmdbecausefileissmaller fi
3. 直接检查单个文件大小(更高效)
如果你只是要检查/home/methuselah/file这一个文件的大小,完全不需要用find,用stat直接获取文件字节数更高效,还能增加错误处理:
#!/bin/sh SIZE_THRESHOLD=1717986918 FILE_PATH="/home/methuselah/file" # 先验证文件是否存在且为普通文件 if [ -f "$FILE_PATH" ]; then # 获取文件大小(单位:字节) FILE_SIZE=$(stat -c "%s" "$FILE_PATH") # 比较大小 if [ "$FILE_SIZE" -gt "$SIZE_THRESHOLD" ]; then somecmdbecausefileisbigger else somecmdbecausefileissmaller fi else echo "Error: $FILE_PATH 不存在或不是普通文件" >&2 exit 1 fi
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

