Shell-Script

如何在傳遞的變數中轉義空格等,以便在 awk 中對 cp 進行系統呼叫

  • December 20, 2018

這個問題有足夠多的複雜性,使簡單的轉義字元對我來說很困難。我有一個 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)))

來源

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