在变量中准备命令行参数

时间:2015-06-25 10:25:46

标签: bash

我需要使用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替换变量的方式有关。

2 个答案:

答案 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 outeval是危险的,并且会执行任意代码,例如,如果您的文件名包含shell元字符。我建议你使用下面的his approach,它更优雅,更安全。