使用 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 生成变量的紧凑方法

使用 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 生成变量的紧凑方法

脚本出于某种目的bash使用变量Q(超出了本问题的范围):

Q=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

由于这个脚本是在每个字节都很重要的环境中使用的,所以这是浪费。但有些解决方法就像

Q=0$(seq -s "" 9)$(echo {A..Z}|tr -d " ")

(对于C语言环境)更糟。我是不是太盲目了,看不到紧凑地生成如此简单序列的明显技巧?

答案1

对于任何能够进行大括号扩展的 shell:

使用printf

$ printf %s {0..9} {A..Z}
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

-->

Q=$(printf %s {0..9} {A..Z})

反引号而不是$()节省一个字节。特别是对于 Bash,printf -v var将 printf 写入变量很好,但不比反引号短。

printf -vQ %s {0..9} {A..Z}
Q=`printf %s {0..9} {A..Z}`

答案2

我知道的最简单的方法是使用bash方法:

echo {0..9} {A..Z}|sed 's/ //g'

sed用于删除符号之间的空格。括号之间的空格很重要,否则您将看到从 0 到 9 和 A 到 Z 的所有组合0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z1A1B1C...

建议您可以像这样缩短命令:

echo {0..9} {A..Z}|tr -d ' '

答案3

框架挑战:

任何可以做到这一点的方法最多都会比仅仅编写已经编写的内容更加消耗资源,而且更有效的方法也不太可移植(迫使您编写“Bash 脚本”而不是“shell 脚本”)。

一般来说,无论哪种语言,常量表的最佳形式是文字常量表,而不是在运行时以编程方式生成的东西。如果它足够大,硬编码就很容易出错,请在编写程序时或在程序的“构建时间”期间以编程方式生成它,并将输出作为文字常量包含在实际程序中。

答案4

再次,,但如果您确实必须这样做,则可以在不需要特殊 shell 功能的情况下很好地概括的模式是:

printf %b $(printf \\x%.2x $(seq 48 57) $(seq 65 90))

seq如果您不想依赖该实用程序,可以将该实用程序编写为 shell 函数。

相关内容