在腳本中轉義引號的問題
我正在建構一個命令行以與 ‘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$args
is 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"