我正在构建一个与“mogrify”工具一起使用的命令行[部分图像魔法]。最终的命令行看起来像这样:
mogrify -stroke yellow -draw 'line 0,0 0,319' -draw 'line 125,0 125,319' -draw 'line 652,0 652,319' file.png
我在执行命令之前回显该命令。如果我将这个回显行作为新命令复制/粘贴到 shell 中,完全按照编写的内容,它就可以完美运行。
但是,它在脚本中不起作用。由于某种原因,mogrify
查找名为 、 等的文件0,0
。0,319
很明显,它将参数字符串mogrify
解释draw
为好像它们周围没有单引号一样。
给出的最终命令[即脚本中发生错误的行]是:
mogrify -stroke $C3 $args $FILE
我迭代地构造字符串$args
。最终字符串的结果是我放在这个问题顶部附近的结果。
我尝试过在构造循环中使用反斜杠转义单引号,使用双引号单引号进行双转义,交换单引号和双引号。我也尝试过$args
用双引号引起来。我什至尝试将每个参数放入一个数组中,然后${args[@]}
在最终调用中使用[$args
上面的位置]。我尝试过的没有任何效果。
[编辑 - 显示数组样式调用的更多信息]
对于数组调用,我准备数组如下:
data="99.8734 351.645 1836.05"
for p in $data; do
x=$(echo "$W * $p / $duration" | bc)
args+=(-draw "'line $x,$y1 $x,$y2'")
done
[注:$data 实际上是从外部源检索的,但出于这个问题的目的,我在这里按字面意思分配数据点。]
当我使用数组调用来调用 mogrify 时,我在脚本中发出以下命令:
mogrify -stroke $C3 "${args[@]}" $FILE
在这种情况下,既没有$C3
也$FILE
没有任何空白。
我从上面得到的错误如下所示:
mogrify: non-conforming drawing primitive definition 'line 35,0 35,320' @ error/draw.c/RenderMVGContent/4271
所以看起来数组分配现在工作正常,但是 shell 正在向mogrify
.
当我回显确切的命令行时,显示以下内容:
mogrify -stroke yellow -draw 'line 35,0 35,319' -draw 'line 125,0 125,319' -draw 'line 652,0 652,319' file.png
有趣的是,当我将数组分配更改为以下内容时,将双引号移动到整个事物而不仅仅是行定义:
args+=("-draw 'line $x,$y1 $x,$y2'")
...然后 mogrify 给了我以下错误:
mogrify: unrecognized option '-draw 'line 35,0 35,319'' @ error/mogrify.c/MogrifyImageCommand/4716
请注意,错误输出现在正确包含我在行定义周围放置的单引号,而以前没有。这让我想到也尝试用 转义单引号'\''
,但这也不起作用。反转单引号和双引号也不会[当然允许在整个事物内部进行变量扩展]。
答案1
双(或单)引号用于停止 shell 处理其中的文本。您不能将它们添加为命令本身的一部分。
不过,您可以做的是使用数组构建命令,然后在结果中包含该数组变量。这里我使用args
数组变量而不是标量(字符串),因此我们可以重复将带引号的值附加到其列表中:
C3=yellow
FILE=file.png
args=()
args+=(-draw 'line 0,0 0,319')
args+=(-draw 'line 125,0 125,319')
args+=(-draw 'line 652,0 652,319')
或者
args+=(-draw "line $x,$y1 $x,$y2")
如果您使用变量代替文字数字。请特别注意,您在更新的问题中显示的单引号不正确(这是错误的:args+=(-draw "'line $x,$y1 $x,$y2'")
因为您将在价值观被传递到mogrify
)。
最后,用双引号将 的值集合括起来args
,以便 shell 将每个元素视为带引号的值:
mogrify -stroke "$C3" "${args[@]}" "$FILE"