用多个引号和关键字符(&、$、! 等)回显某些内容

Iss*_*204 5 shell-script echo quoting

假设您必须将其回显到文件中:

RZW"a4k6[)b!^"%*X6Evf
Run Code Online (Sandbox Code Playgroud)

你怎么做呢?

我要回显的实际“行”是 2048 个字符的行。

小智 6

只需将其放在单引号中:

echo 'RZW"a4k6[)b!^"%*X6Evf' > file
Run Code Online (Sandbox Code Playgroud)

但是,如果字符串中有任何单引号,则需要转义双引号 ( "'") 中的每一个并将结果“粘合”在一起,如下所示:

echo 'text without single quotes'"'"'and other text without single quote'
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 6

对于任意内容,您还可以使用:

cat << 'EOF' > file
RZW"a`4$k6[)b!^"'%*X6Evf
RZW"a`4$k6[)b!^"'%*X6Evf
EOF
Run Code Online (Sandbox Code Playgroud)

(只要该内容不包含完全由 组成的行EOF,在这种情况下,您可以使用不同的分隔符)。

要包含 NUL 字符(^@通常用Ctrl+VCtrl+Space或输入Ctrl+VCtrl+@),以上仅适用于zsh. 使用其他外壳(和zsh),您可以执行以下操作:

cat > file
Run Code Online (Sandbox Code Playgroud)

输入文本并在完成后点击Ctrl+D一个空行(Ctrl-D如果您想包含一个未终止的行,则点击两次)。

处理任意的、潜在的二进制数据的另一种方法是使用诸如uuencodeor 之类的东西base64

例如:

 printf '\0\1\2\3' > file
Run Code Online (Sandbox Code Playgroud)

可以写成:

uudecode << 'EOF'
begin 644 file
$``$"`P``
`
end
EOF
Run Code Online (Sandbox Code Playgroud)

(通过运行uuencode file < some-filewhere获得的输出some-file包含该特定内容)。