如何在 Linux shell 中打印“@”?

如何在 Linux shell 中打印“@”?

我遇到一个问题,远程服务器的控制台键盘布局与我的物理键盘不同。

我需要复制一封信@才能粘贴到浏览器论坛中。

服务器位于 VPN 中,无法进行外部访问,因此简单地通过谷歌搜索“at 符号”是行不通的。

有什么技巧可以@在控制台中打印出来以便我可以复制并粘贴它吗?是否有一个众所周知的文件可以简单地执行 acat@在其中显示 a ? A自述文件或类似的。

答案1

使用 bash shell:

echo $'\x40'

使用 POSIX shell:

printf '\100'

答案2

您可以使用man ascii显示 ASCII 字符集并从该输出中剪切粘贴。

(如果您ascii安装了 Plan 9 中的程序或其他东西,您可以明确指定您需要第 7 节中的手册页:man 7 ascii,但这通常是不必要的。)

答案3

如果你有 Perl,你可以获得所有可打印的 ASCII 字符,而对特殊字符的需求最少,如下所示(也可以使用双引号):

shell$ perl -l -e 'print map chr, 32..126'
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

甚至更简单(只有字母和点):

shell$ perl
print chr for 32..126
^D
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~shell$

答案4

这是一些之前没有提到过的方法:

printf  '\x40'
printf  '\u40'
echo -e '\u40'
echo   $'\u40'
echo 40 | xxd -p -r
perl -le 'print chr 64'
python <<<'print chr(64)'
python3 -c 'print(chr(64))'
php -r 'echo chr(64);'

[1]40值为 ASCII 字符的十六进制值@。或64十进制(稍后使用)。即以十六进制 ( ) 值表示\x40或读取。命令 printf 将其转换为该值的字节,并且控制台打印一个.\x40@

而这也是统一码相同字符的代码点值@。碰巧的是,Unicode 代码点和 ASCII 字符值在 127(十六进制7F或八进制)以内完全相同(根据设计)177

\x40然而, (或\100) 和 之间存在差异\u40。后者将始终生成 UNICODE 代码点,无论运行代码的操作系统或计算机设置什么区域设置、语言或条件。 whileprintf '\100'会输出一个空格。而且,按照设计,UNICODE 中的代码点已被指定为静态值。预计未来它们不会改变。简而言之,a\u40应该@在基于 EBCDIC 的系统上生成偶数(例如)。对于 ASCII 值来说,这似乎是一个很小的增益,但对于更高的代码点字符来说,这是一个真正的优势,因为无论使用哪种语言环境或语言,\u2225都应该始终生成parallel( )。

2000 年,GNU printf(独立实用程序)首次添加了对它的支持\uxxxx。然后是 2003 年 zsh 的 print/printf/echo/$'...' 以及后来的一些其他 shell。 $'\uxxxx' 语法甚至计划包含在 POSIX 中。您需要独立 printf: 中的 4 位数字printf '\u0040'。在 bash 中,允许使用 1 到 4 位数字的 ksh93 和 zsh。 A\Uxxxxxxxx最多需要使用 8 个十六进制数字。

[1]最初的想法来自 Stéphane Chazelas 的评论(现已删除)

相关内容