从数组中提供的命令行参数

时间:2016-04-26 11:39:49

标签: bash for-loop parameter-passing imagemagick-convert

我想执行一个复杂的bash命令,使用从长数组提供的数据作为参数。我想它必须以某种方式使用子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 ...;完成"不管用。 -draw "point x,y"系列参数必须位于相同的单次运行转换命令中,因为转换不会在现有图像中接受-draw参数。

4 个答案:

答案 0 :(得分:3)

首先构建一个<%@ page import="com.liferay.portlet.documentlibrary.model.DLFolder" %> <%@ page import="com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil" %> <%@ page import="com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil" %> <%@ page import="com.liferay.portlet.documentlibrary.model.DLFileEntry" %> <%@ page import="java.util.List" %> <%@ page import="com.liferay.portlet.imagegallery.service.IGImageLocalServiceUtil" %> <%@ page import="com.liferay.portlet.imagegallery.model.IGImage" %> <%@ include file="init.jsp" %> <% String igFolderId = portletPreferences.getValue("igFolderId", "0"); String cycleSpeed = portletPreferences.getValue("cycleSpeed", "1000"); String fxSpeed = portletPreferences.getValue("fxSpeed", "1000"); String type = portletPreferences.getValue("type", "fade"); String height = portletPreferences.getValue("height", "480"); String width = portletPreferences.getValue("width", "640"); List<IGImage> images = IGImageLocalServiceUtil.getImages(Long.valueOf(igFolderId)); %> <c:choose> <c:when test="<%= Long.valueOf(igFolderId) != 0%>"> <div id="<portlet:namespace />images"> <% for (int i = 0; i < images.size(); i++) { IGImage image = images.get(i); %> <img width="<%= width %>" height="<%= height %>" src="/image/image_gallery?img_id=<%=image.getLargeImageId()%>" alt="<%=image.getDescription()%>" <%= i == 0 ? "" : "style=\"display:none;\""%>/> <% } %> </div> </c:when> <c:otherwise> <span class="portlet-msg-info"> Please configure this portlet. </span> </c:otherwise> </c:choose> <script type="text/javascript"> jQuery( function() { jQuery("#<portlet:namespace />images").cycle({ fx: '<%= type %>', speed: <%= fxSpeed %>, timeout: <%= cycleSpeed %> }); } ); </script> 个参数数组。

-draw

答案 1 :(得分:0)

通过使用convert文件说明符后跟表示stdin的短划线,将MVG绘图命令通过@通过其stdin,将命令行缩短并清理。像这样:

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

答案 2 :(得分:-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&#34;传递&#34;它到convert命令。

答案 3 :(得分:-1)

尝试使用扩展而不是像这样的子shell:

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

生成此输出:

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