我想执行一个复杂的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参数。
答案 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
或者,如果您有一个名为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"