如何在ImageMagick的convert命令中嵌入Bash条件简化脚本?
简化根据条件动态拼接ImageMagick convert命令的Bash脚本
问题描述
我有一段Bash脚本,会根据变量$DETAILS的值调用ImageMagick的convert工具堆叠不同类型的图片,两个分支仅差两个\( .. \)格式的图片块。想简化脚本,避免重复编写大段重复的convert命令,比如尝试把Bash条件直接嵌入命令内部(示意写法可能不合法):
# 符合条件时添加${dist}和${angl}图片的两个块 convert \( "${output}/${target}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) **!NB >>> if [ "$DETAILS" == 1 ];** then \( "${output}/${dist}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) \( "${output}/${angl}*.png" **fi;** <<< -bordercolor lightgoldenrod2 -border 0x2 -append \) -bordercolor lightgoldenrod2 -border 2x0 +append -background white -alpha deactivate ${output}/HBONDS-summary.png
原始分支脚本:
if [ "$DETAILS" == 1 ]; then #垂直堆叠3类图片 convert \( "${output}/${target}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) \( "${output}/${dist}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) \( "${output}/${angl}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) -bordercolor lightgoldenrod2 -border 2x0 +append -background white -alpha deactivate ${output}/HBONDS-summary.png else #垂直堆叠1类图片 convert \( "${output}/${target}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) -bordercolor lightgoldenrod2 -border 2x0 +append -background white -alpha deactivate ${output}/HBONDS-summary.png fi
可行简化方案
直接把Bash条件嵌入convert命令内部的写法不合法,但可以通过Bash参数拼接的方式实现简化,核心是提前用条件生成可选命令段,再统一传给convert。
方法1:数组存储参数(最安全可靠)
用数组拆分命令的固定部分和可选部分,按需拼接后执行:
# 初始化基础命令段 convert_args=( \( "${output}/${target}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) ) # 根据DETAILS值添加额外图片块 if [ "$DETAILS" -eq 1 ]; then convert_args+=( \( "${output}/${dist}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) \( "${output}/${angl}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) ) fi # 添加公共后缀参数 convert_args+=( -bordercolor lightgoldenrod2 -border 2x0 +append -background white -alpha deactivate "${output}/HBONDS-summary.png" ) # 执行最终命令 convert "${convert_args[@]}"
方法2:条件表达式拼接字符串(适合简单场景)
通过Bash的命令替换,在一行内完成可选段的拼接:
convert \ \( "${output}/${target}*.png" -bordercolor lightgoldenrod2 -border 0x2 -append \) \ $( [ "$DETAILS" -eq 1 ] && echo -n '\( '"${output}/${dist}"'*.png -bordercolor lightgoldenrod2 -border 0x2 -append \) \( '"${output}/${angl}"'*.png -bordercolor lightgoldenrod2 -border 0x2 -append \)' ) \ -bordercolor lightgoldenrod2 -border 2x0 +append \ -background white -alpha deactivate \ "${output}/HBONDS-summary.png"
注意:如果路径或文件名包含空格、特殊字符,这种方法需要额外转义处理,数组方法的兼容性更好。
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

