Shell-Script
如何在傳遞的變數中轉義空格等,以便在 awk 中對 cp 進行系統呼叫
這個問題有足夠多的複雜性,使簡單的轉義字元對我來說很困難。我有一個 bash 腳本,在很大程度上,它有一個嵌入式 awk 腳本,它讀取由分號分隔的文件。在此文本文件中,其中一個欄位是某些 JPEG 的目錄路徑。我想將 JPEG 複製到其他地方,但原始目錄路徑中有空格(並且可能包含其他可能造成損壞的字元串)。我不能用單引號引用有問題的目錄,因為這會停止 awk 解釋器,而雙引號會將其轉換為 awk 中的文字字元串。
我正在使用 gawk 4.1.1。這是我想要完成的一些 awk 程式碼:
imageDirectory = $1; cpJpegVariable="cp -r " imageDirectory " assets"; #screws up if imageDirectory has spaces and other naughty characters system(cpJpegVariable);
您可以使用:
awk '... cpJpegVariable="cp -r '\''" imageDirectory "'\'' assets"; ...'
(請注意,
'
對於 不需要轉義awk
,但您需要'\''
對 shell 進行轉義)。所以當awk
擴展變數時cpJpegVariable
,它看起來像:cp -r 'file_contain space' assets
這樣,您可以避免所有特殊字元的問題,除了
'
它本身。如果imageDirectory
可能包含單引號字元,您可以使用gsub()
. 例子:awk '{gsub("'\''","'\''\"'\''\"",imageDirectory)}1'
如果要將 awk 變數傳遞給system,則需要在 shell 中引用它:
function quote(str, d, m, x, y, z) { d = "\47"; m = split(str, x, d) for (y in x) z = z d x[y] d (y < m ? "\\" d : "") return z }
例子:
system(sprintf("cp -r %s assets", quote($1)))