Bash脚本中如何检测指定文件所在目录是否可写?
解决目录可写性检查的路径格式问题
我看了你写的这段检查文件所在目录是否可写的脚本,确实在路径处理的边缘场景下容易踩坑——比如当目标文件在根目录下、或者你不小心传入了一个目录路径时,${fullPATH%/*}的截取逻辑会出错,导致pathDIR的格式不符合预期,进而影响可写性判断。
现有代码的潜在问题
- 根目录场景适配失效:如果输入的是根目录下的文件(比如
/test.txt),${fullPATH%/*}能正确得到/;但如果误传入根目录本身(/),这个截取会得到空字符串,导致后续的[ ! -w "" ]直接报错。 - 未校验输入类型:如果用户传入的是一个目录路径,你的逻辑会错误地检查该目录的父目录,完全偏离了“检查给定文件所在目录”的需求。
修正后的脚本
#!/bin/bash # 先检查参数数量是否正确 if [ $# -ne 1 ]; then echo "用法: $0 <文件路径>" exit 1 fi fullPATH=$(realpath "$1") echo "realpath => $fullPATH" # 判断目标是否为文件,避免传入目录导致逻辑错误 if [ -d "$fullPATH" ]; then echo "错误: 你传入的是目录路径,请传入具体的文件路径。" exit 1 fi # 改用dirname工具获取目录部分,适配所有路径场景 pathDIR=$(dirname "$fullPATH") echo "pathDIR => $pathDIR" # 执行可写性检查并给出提示 if [ ! -w "$pathDIR" ]; then echo "$1 所在的目录不可写。" exit 1 else echo "目录可写。" exit 0 fi
关键改进点
- 用
dirname替代手动截取:dirname是专门用于提取路径目录部分的工具,能完美处理所有边缘情况——比如dirname "/test.txt"返回/,dirname "/"返回/,彻底避免手动字符串截取的格式问题。 - 增加输入校验:提前检查参数数量和输入类型,确保脚本只处理有效的文件路径,避免无效输入导致的异常。
- 规范退出码:给每个分支加上明确的退出码,方便脚本被其他程序调用时判断执行结果。
测试场景参考
- 测试根目录下的文件:
./your_script.sh /test.txt,能正确识别目录为/并检查可写性。 - 测试普通文件:
./your_script.sh ~/documents/note.md,正确提取父目录~/documents。 - 测试传入目录:
./your_script.sh ~/documents,会直接提示错误,避免误判。
内容的提问来源于stack exchange,提问作者eNgE
相关产品推荐
相关产品推荐

