如何在Bash中正确拼接exiftool参数以避免引号丢失问题?
解决Bash中exiftool参数传递的引号问题
在自动化用exiftool给媒体文件添加元数据时,为避免重复重写文件,需要一次性组合所有参数执行命令,但用字符串拼接参数会出现引号丢失、参数被错误拆分的问题,导致exiftool报错“文件未找到”。
正确方案:使用Bash数组存储参数
Bash数组能精准保留每个参数的边界,不会因空格或特殊字符拆分参数,完全适配exiftool的参数传递需求。
- 初始化基础参数数组
exiftool_args=(-q -m -overwrite_original_in_place -api largefilesupport=1)
- 条件添加日期参数
当create_date变量已设置时,将日期参数追加到数组中:
if [ ! -z "$create_date" ]; then exiftool_args+=(-AllDates="$create_date") fi
- 执行exiftool命令
通过"${exiftool_args[@]}"展开数组,确保每个参数被正确传递:
exiftool "${exiftool_args[@]}" "$file"
为什么字符串拼接会失败
Bash展开不带引号的字符串变量时,会按空白字符拆分内容。即使你在字符串中手动添加引号,展开时引号会被当作普通字符,无法起到分隔参数的作用。比如-AllDates='2025:03:21 06:00:00'会被拆成-AllDates='2025:03:21和06:00:00'两个独立参数,exiftool会把后者识别为不存在的文件名,从而报错。
使用数组后,展开的命令完全符合预期:
exiftool -q -m -overwrite_original_in_place -api largefilesupport=1 -AllDates="2025:03:21 06:00:00" "/path/to/file"
内容的提问来源于stack exchange,提问作者ClassyUnderexposure
相关产品推荐
相关产品推荐

