
如何使用 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'
被解析為
- 單引號文字
foo
- 反斜線引用的文字字符
'
- 單引號文字
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 指令)'
的特殊意義。命令會將所有內容視為純字元並將其寫入文件$
print
test.txt
2] 使用雙引號"
:這裡我們需要明確轉義 bash 結構。\$
刪除 的特殊意義$
,即之後使用的變數的值$
。
答案4
為什麼不直接使用一個這裡的文檔?
cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END
END
請注意中的引號<<'END'
:它們意味著以下行中的文字(直到標記END
)將按字面意思使用。只要,就會進行<<END
美元擴張(即$(command)
或)。$variable