在脚本中转义引号时出现问题

在脚本中转义引号时出现问题

我正在构建一个与“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,00,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"

相关内容