打印包含单引号和其他特殊字符的字符串

打印包含单引号和其他特殊字符的字符串

如何使用 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

相关内容