Bash脚本判断文件路径与文件名异常的问题求助
问题解决:区分带路径的文件与纯文件名的Bash脚本修复
我需要判断输入内容是仅文件名还是包含路径的文件路径,比如输入带路径的文件D:\SYSTEM\System\Quality controlled songs\My drip Confession.flac或者仅文件名My drip Confession.flac。但我写的Bash脚本在输入带路径的文件时,错误输出“Extracting Filename: $filename”,没执行路径处理逻辑,求修复方法。
原脚本代码:
#checks if the input is a directory if [[ -d $filename ]]; then echo "Extracting Filename and Directory: $filename " #this extracts the directory of the input directory=$(dirname "$filename") #this extracts the filename of the input filename=$(basename "$filename") #this makes the rest of the code execute in the input directory cd "$directory" #checks if the input is a file elif [[ -f $filename ]]; then echo "Extracting Filename: $filename " else echo "Invalid input: $filename " exit 1 fi
问题原因
你的脚本逻辑完全错了:-d是用来判断给定路径是不是目录,但带路径的文件本质还是文件,不是目录,所以会直接走到elif [[ -f $filename ]]分支,自然只会输出文件名的提示。你要做的是区分「输入是否包含路径」,而非「输入是目录还是文件」。
修复后的脚本
要判断输入是否包含路径,最简单的方式是用dirname命令:如果输入是纯文件名,dirname返回的结果是.(当前目录);如果包含路径,返回的就是对应的路径部分。修改后的脚本如下:
# 判断输入是否包含路径(dirname结果不是当前目录) if [[ $(dirname "$filename") != "." ]]; then echo "提取文件名和路径: $filename" # 提取目录部分 directory=$(dirname "$filename") # 提取纯文件名 filename=$(basename "$filename") # 切换到目标目录,失败则退出 cd "$directory" || exit 1 elif [[ -f "$filename" ]]; then echo "提取文件名: $filename" else echo "无效输入: $filename" exit 1 fi
补充说明
- 如果是在WSL环境处理Windows风格路径(带
\分隔符),可以先把路径转换为Unix风格,在脚本开头加一行:filename=${filename//\\//} cd "$directory" || exit 1的作用是防止切换目录失败后,后续代码在错误的目录执行,避免意外问题。
内容的提问来源于stack exchange,提问作者MobyGaming
相关产品推荐
相关产品推荐

