![打印包含单引号和其他特殊字符的字符串](https://linux22.com/image/38040/%E6%89%93%E5%8D%B0%E5%8C%85%E5%90%AB%E5%8D%95%E5%BC%95%E5%8F%B7%E5%92%8C%E5%85%B6%E4%BB%96%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
如何使用 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