列印包含單引號和其他特殊字元的字串

列印包含單引號和其他特殊字元的字串

如何使用 AIX 腳本正確撰寫此內容?我的要求是在test.txt中寫入這個指令:

clock=$(prtconf -s | awk '{print $4,$5}')

我嘗試了這個命令:

print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt

test.txt 中寫入的輸出給了我:

clock=$(prtconf -s | awk {print ,})

如果我使用" "引號:

print "clock=$(prtconf -s | awk '{print $4,$5}')"

它讓我直接:

clock=3612 MHz

我該如何解決這個問題?

答案1

最簡單的方法是'…'在字串周圍使用單引號。單引號分隔文字字串,因此您可以在它們之間放置除單引號之外的任何內容'。若要在字串中插入單引號,請使用四個字元序列'\''(單引號、反斜線、單引號、單引號)。

從技術上講,無法將單引號放入單引號文字中。然而,連續文字與單一文字一樣好。'foo'\''bar'被解析為

  1. 單引號文字foo
  2. 反斜線引用的文字字符'
  3. 單引號文字bar

這實際上意味著這'\''是一種在單引號文字中轉義單引號的方法。

請注意,kshprint指令執行反斜線擴充。新增-r選項以避免這種情況。它不會傷害你,因為你想要列印的字串中恰好沒有反斜杠,但最好使用-r,以防在維護過程中添加反斜杠。

print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

或者,您可以使用 POSIX 方法按字面意思列印字串,並在末尾新增換行符:

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

答案2

您需要繼續使用單引號,但然後在輸出中「單獨」列印您需要的單引號,或使用雙引號並轉義美元符號。

對於第二個選項:

print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt

為了第一:

print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

(然後轉義'text'單引號。)\''other text'

為了完整起見,請注意print展開反斜線字元轉義序列(這在您的情況下並不重要,因為您要列印的字串不包含任何反斜線)。為了避免這種情況,請使用print -r.

答案3

正如 @Mat 所說,有 2 個解決方案。

1] 使用單引號:這個單引號刪除了轉義字元、不同指令(基本上所有 bash 結構和 unix 指令)'的特殊意義。命令會將所有內容視為純字元並將其寫入文件$printtest.txt

2] 使用雙引號":這裡我們需要明確轉義 bash 結構。\$刪除 的特殊意義$,即之後使用的變數的值$

答案4

為什麼不直接使用一個這裡的文檔

cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END

END請注意中的引號<<'END':它們意味著以下行中的文字(直到標記END)將按字面意思使用。只要,就會進行<<END美元擴張(即$(command)或)。$variable

相關內容