模块S05 条件表达式篇号S05-02 / 42预计阅读40 分钟主线Bash / POSIXtest/[文章目录本篇目标30 秒速览正文1. 文件测试也是 test 命令2. 存在与类型最常用的一组3. 权限-r -w -x4. 非空文件-s5. 符号链接与 -L、-e 的陷阱6. 时间比较-nt 与 -ot7. 否定!8. 实战模式8.1 脚本开头检查依赖文件8.2 创建前检查目录8.3 与 if grep -q 区分8.4 不要用 [ -f ] 代替 mkdir -p9. 谓词速查表读脚本检查清单练习判断题实操题改错题下一篇预告本篇目标掌握[/test中的文件测试谓词判断路径是否存在、是普通文件还是目录、是否可执行、是否符号链接等。能在脚本里写出「先判路径、再操作」的安全逻辑并分清-f与-e、-d的差异。30 秒速览-e path路径存在任意类型。-f path存在且为普通文件regular file。-d path存在且为目录。-L path存在且为符号链接本身不自动跟链接。-x-r-w当前用户是否可执行、可读、可写。-s path存在且大小大于 0。-nt-ot两路径比修改时间较新 / 较旧。路径变量必须$path注意断开的符号链接。正文1. 文件测试也是test命令if[-f$CONFIG];thensource$CONFIGfi与 S05-01 相同[是命令成功条件为真→ 退出码0。2. 存在与类型最常用的一组谓词为真时-e path路径存在文件、目录、链接、设备等-f path存在且为普通文件-d path存在且为目录-L path存在且为符号链接-h path同-L部分系统-b-c-p块设备、字符设备、命名管道少见-S pathsocket少见cfg/etc/myapp.conf[-e$cfg]||echo路径不存在[-f$cfg]echo是普通文件[-d$cfg]echo是目录对文件路径为假实战选择你想判断用配置文件在不在-f输出目录有没有-d随便什么存在就行-e这是不是软链-L[-f$OUT]||{echo缺少输出文件;exit1;}mkdir-p$DIR# 常先 [ ! -d $DIR ] 再 mkdir[!-d$DIR]mkdir-p$DIR3. 权限-r-w-x针对当前运行脚本的用户谓词含义-r可读-w可写-x可执行目录的-x表示可进入script./deploy.sh[-x$script]./deploy.sh# 不可执行时改用[-f$script]bash$script目录要有x才能cd进去[-x$DIR]cd$DIR4. 非空文件-s[-s$LOG]echo日志非空[!-s$LOG]echo日志为空或不存在注意不存在时-s为假与「空文件」需区分时要先-eif[-e$LOG][!-s$LOG];thenecho日志文件存在但为空fi5. 符号链接与-L、-e的陷阱link/tmp/mylink# 指向 /etc/passwd[-e$link]# 真能解析到目标时[-L$link]# 真路径本身是链接[-f$link]# 真若目标存在且为文件断开的链接目标不存在[-e$broken]# 假[-L$broken]# 真仍是链接对象读脚本需要跟链接目标时用readlink等不要只靠-f。6. 时间比较-nt与-ot谓词含义file1 -nt file2file1 比 file2新修改时间file1 -ot file2file1 比 file2旧if[$SRC-nt$DST];thencp$SRC$DSTfi任一文件不存在时行为依赖实现应先-e再比。7. 否定![!-e$LOCK]touch$LOCK[!-f$PID_FILE]start_daemon8. 实战模式8.1 脚本开头检查依赖文件:${CONFIG:?set CONFIG}[-f$CONFIG]||{echonot a file:$CONFIG2;exit1;}8.2 创建前检查目录[-d$OUT_DIR]||mkdir-p$OUT_DIR8.3 与if grep -q区分判断对象用法文件是否存在[ -f path ]文件内容是否匹配grep -q pattern path8.4 不要用[ -f ]代替mkdir -pmkdir -p已能创建多级目录[ -d ]用于分支逻辑存在则清理、不存在则创建等。9. 谓词速查表谓词含义-e存在-f普通文件-d目录-L符号链接-s存在且非空-r-w-x读、写、执行-nt-ot更新、更旧读脚本检查清单判断「配置文件」是否用-f而不是仅-e判断「目录」是否用-d路径是否$var软链场景是否区分-L与-f比时间前是否确认两个路径都存在练习判断题[ -e $f ]为真时$f一定是普通文件。[ -d /tmp ]一般为真。[ -x $dir ]对目录表示可以cd进入该目录。断开的符号链接[ -L link ]为真[ -e link ]为假。参考答案错也可能是目录、设备等。对典型系统上 /tmp 是目录。对。对。实操题对当前目录下S05-02-demo.txt自建空文件或非空文件测试fS05-02-demo.txttouch$f2/dev/null||trueforopin-e-f-d-s-r-w;do[$op$f]echo$op: true||echo$op: falsedone改错题if[-f$CONFIG];then.$CONFIGfiif[-d$OUT_DIR];thenrm-rf$OUT_DIR/*fi参考if[-f$CONFIG];then.$CONFIGfiif[-d$OUT_DIR];thenrm-rf${OUT_DIR:?}/*fi下一篇预告S05-03《[[与模式匹配Bash 条件表达式》—、通配、正则~以及为何很多脚本改用[[专栏必读三星。