2016-04-26 82 views
1

我想执行一个复杂的bash命令,使用从一个long数组提供的数据作为参数。我想它必须以某种方式使用子shell。从一个数组提供的命令行参数

例如,而不是可行的 convert -size 100x100 xc:black -fill white -draw "point 1,1" -draw "point 4,8" -draw "point 87,34" etc etc etc image.png

我想使用不同的逻辑,其中所述参数是在相同的给定命令,更像是

convert -size 100x100 xc:black -fill white $(for i in 1,1 4,8 87,34 etc etc; -draw "point $i"; done) image.png 其不工作,因为$ i被解释为一个由参数构成的命令。

请注意,“我在...中;转换... $ i ...; done”将不起作用。 -draw "point x,y"系列参数必须位于同一个单一运行转换命令中,因为convert不接受现有图像中的-draw参数。

+0

您需要从嵌入式for循环'echo' /'printf''-draw ...'字符串。 –

+0

我的回答或任何其他问题是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过点击投票计数旁边的空心绿色勾号/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

回答

3

树立的-draw参数数组第一。

for pt in 1,1 4,8 87,34; do 
    points+=(-draw "point $pt") 
done 
convert -size 100x100 xc:black -fill white "${points[@]}" image.png 
-1

如何使用printf来扩大内容?

points=(1,1 4,8 87,34) 
printf -- '-draw "point %s" ' ${points[@]} 

(末尾没有新行)返回以下字符串:

-draw "point 1,1" -draw "point 4,8" -draw "point 87,34" 

你可以说:

points=(1,1 4,8 87,34) 
convert ... "$(printf -- '-draw "point %s" ' ${points[@]})" image.png 
#   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

这样,你存储点的数组和printf“传递”给convert命令。

+0

谢谢,但是,语法是'-draw'点x,y“'带短划线。当我尝试'printf'-draw ...''printf将它识别为-d选项并返回一个错误。我尝试用'printf'语法解决它...''然后,我不知道为什么,转换将它识别为文件名并返回'convert:无法打开图像'-draw'点等等'' – Voprosnik

+0

@Voprosnik避免'printf'理解'-d'作为一个选项是在它后面加上'--',所以它知道没有更多的参数被给出 - >'printf - '-draw“point%s”'$ {points [@]}' – fedorqui

-1

尝试使用膨胀,而不是亚壳是这样的:

echo -draw\ \"point\ {1\,1,2\,2,3\,3}\" 

产生这样的输出:

-draw "point 1,1" -draw "point 2,2" -draw "point 3,3" 
+0

这使得' -draw“指向1,1”一个参数,而不是两个单独的参数'-draw'和''1,1'''covert'将会期望的。 – chepner

0

你可以把你的命令行短期和清洁通过使用@文件说明符随后是代表stdin这样一个破折号通过其stdin抽MVG绘图命令为convert

for i in 1,1 4,8 87,34; do 
    echo point $i 
done | convert -size 100x100 xc:red -draw @- result.png 

enter image description here

如果您有一个名为 points的数组:
points=(1,1 4,8 87,34) 

printf "point %s\n" ${points[@]} | convert -size 100x100 xc:red -draw @- result.png