我需要使用ImageMagick生成一些图像。出于这个原因,我在实际调用convert -size 160x160 xc:skyblue \
-fill 'rgb(200, 176, 104)' \
$draw_operations \
$0.png
之前准备了变量中的绘制操作,这看起来像这个
-draw 'point 30,50' \
-draw 'point 31,50'
$ draw_operations 包含这些行
convert
此non-conforming drawing primitive definition `point` ...
unable to open image `'30,50'' ...
...
的来电始终会产生
unrecognized option `-draw 'point 30,50' '
如果我使用带双引号的 $ draw_operations (这是必需的,如果它包含多行)错误是
-draw 'point 30,50'
最后,如果我只是按原样放置 public class CheckSessionOutAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
if (ctx.Session != null)
{
if (ctx.Session.IsNewSession)
{
string sessionCookie = ctx.Request.Headers["Cookie"];
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
{
if (ctx.Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
HttpContext.Current.Session.Clear();
RedirectResult redirectingto = new RedirectResult("~/Account/Timeout");
filterContext.Result = redirectingto;
}
else
{
string loginUrl = FormsAuthentication.LoginUrl;
RedirectResult redirectto = new RedirectResult(loginUrl);
filterContext.Result = redirectto;
}
}
}
}
base.OnActionExecuting(filterContext);
}
,则没有错误。所以它与ImageMagick无关,而是与bash替换变量的方式有关。
答案 0 :(得分:4)
见BashFAQ 50: I'm trying to put a command in a variable, but the complex cases always fail!。问题是shell在扩展变量之前解析引号和转义,因此将引号放在变量的值中是行不通的 - 当引号“在那里”时,它们为时已晚做任何好事。
在这种情况下,我认为最好的解决方案是将参数存储在数组中,然后使用"${array[@]}"
(包括双引号)将它们添加到命令中。像这样:
draw_operations=(-draw 'point 30,50' -draw 'point 31,50')
# Note that this creates an array with 4 elements, "-draw", "point 30,50", "-draw", and "point 31,50"
convert -size 160x160 xc:skyblue \
-fill 'rgb(200, 176, 104)' \
"${draw_operations[@]}" \
"$0.png"
您还可以逐步构建数组,如下所示:
draw_operations=() # Start with an empty array
draw_operations+=(-draw 'point 30,50') # Add two elements
draw_operations+=(-draw 'point 31,50') # Add two more elements
...
答案 1 :(得分:2)
请改用eval
。这应该解释空格并正确引用:
#!/bin/bash
draw_operations="-draw 'point 30,50' \
-draw 'point 31,50'"
eval "convert -size 160x160 xc:skyblue \
-fill 'rgb(200, 176, 104)' \
"$draw_operations" \
"$0".png"
顺便说一句,一个有用的调试技巧是在脚本的开头添加set -x
。这将显示执行的命令和方式。
请注意,作为评论中的@GordonDavisson points out,eval
是危险的,并且会执行任意代码,例如,如果您的文件名包含shell元字符。我建议你使用下面的his approach,它更优雅,更安全。