Bash

在腳本中轉義引號的問題

  • December 13, 2019

我正在建構一個命令行以與 ‘mogrify’ 工具 [imagemagick 的一部分]一起使用。最終的命令行看起來像這樣:

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參數字元串,就好像它們周圍沒有單引號一樣。

給出的最終命令

$$ i.e., the line in the script where the error occurs $$是 :

mogrify -stroke $C3 $args $FILE

$args我迭代地構造字元串。最終字元串的結果是我放在這個問題頂部附近的內容。

我嘗試在構造循環中使用反斜杠轉義單引號,使用雙引號單引號進行雙引號轉義,交換單引號和雙引號。我也試過$args用雙引號括起來。我什至嘗試將每個參數放入一個數組中,然後${args[@]}在最終呼叫中使用 [where $argsis above]。我嘗試過的沒有任何效果。

$$ EDIT - showing further information for the array-style invocation $$

對於數組呼叫,我準備數組如下:

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

$$ nota : the $data are actually retrieved from an external source, but for purposes of this question i am assigning the data points literally here. $$ 當我使用數組呼叫呼叫 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

請注意,錯誤輸出現在正確地包含了我在行定義周圍加上的單引號,而以前沒有。這給了我嘗試用 轉義單引號的想法'\'',但這也不起作用。反轉單引號和雙引號也不行

$$ of course allowing for variable expansion inside the whole thing $$.

雙(或單)引號用於停止 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’s 值的集合,以便 shell 將每個元素視為引用值:

mogrify -stroke "$C3" "${args[@]}" "$FILE"

引用自:https://unix.stackexchange.com/questions/556880