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

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

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

RZW"a4k6[)b!^"%*X6Evf

你怎么做呢?

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

答案1

只需将其放在单引号中即可:

echo 'RZW"a4k6[)b!^"%*X6Evf' > file

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

echo 'text without single quotes'"'"'and other text without single quote'

答案2

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

cat << 'EOF' > file
RZW"a`4$k6[)b!^"'%*X6Evf
RZW"a`4$k6[)b!^"'%*X6Evf
EOF

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

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

cat > file

输入文本并在完成后点击Ctrl+D空行(Ctrl-D如果要包含非终止行,则点击两次)。

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

例如:

 printf '\0\1\2\3' > file

可以写成:

uudecode << 'EOF'
begin 644 file
$``$"`P``
`
end
EOF

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

答案3

我会使用“此处文档”。

cat >my_file <<__EOF__
RZW"a4k6[)b!^"%*X6EvF
__EOF__

当 shell 看到<<foo语法时,它会记住是什么foo并继续读取,直到它foo自己看到一行。然后它将读取的所有内容(除了foo)传递到程序的标准输入。

答案4

要生成用作命令行参数的内容,请将其放入变量中(或者可以确保它进入变量的其他内容)单词——然后是一个争论被传递给printf),然后让 bash/ksh93 完成剩下的工作。

# Reading from stdin
# pbpaste | bash -c '
printf echo\ %q\\n "$(cat)"
# ' | pbcopy
# Then paste it into your script and echo happily.
# Maybe I should use the `read' builtin instead..

相关内容