Bash脚本处理含空格文件名失效,如何利用$@正确传参?
解决Bash脚本处理含空格文件名失效的问题
问题根源
你的脚本核心问题是变量引用时没加双引号,导致带空格的文件名被Bash拆分成多个独立参数;另外用cut截取文件名的方式不够健壮,遇到含多个点的文件名会出错。
修改后的脚本
for File in "$@" do # 用Bash内置语法提取不带扩展名的文件名,支持含多个点的情况 Name="${File%.*}" # 所有涉及文件名的变量必须用双引号包裹,保留空格 ffmpeg -i "$File" -vcodec libx264 -acodec aac -pix_fmt yuv420p "h264_${Name}.mp4" done
关键修改点
- 给变量加双引号:
"$File"和"h264_${Name}.mp4"确保带空格的文件名被当作一个完整参数传递,不会被Bash拆分。 - 替换cut为Bash参数扩展:
${File%.*}会删除文件名最后一个.及之后的内容,比cut更可靠,比如处理my.video.file.mov时,能正确得到my.video.file而不是my。
传参方式说明
你原来用的ToH264MP4 "My Video Name With Spaces.mov"或ToH264MP4 *都是正确的传参方式,不需要调整,修改脚本即可解决问题。
内容的提问来源于stack exchange,提问作者Kirk Sealls
相关产品推荐
相关产品推荐

