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

Phi*_*pos 10 bash shell-script text-processing

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

Q=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

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

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

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

pLu*_*umo 26

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

使用printf

$ printf %s {0..9} {A..Z}
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

-->

Q=$(printf %s {0..9} {A..Z})
Run Code Online (Sandbox Code Playgroud)

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

printf -vQ %s {0..9} {A..Z}
Q=`printf %s {0..9} {A..Z}`
Run Code Online (Sandbox Code Playgroud)

  • @l0b0:不是真的。反引号并没有消失。反引号肯定有缺点(例如可读性较差,对复杂命令的一些限制) - 但对于这种特定情况,在您试图保存每个字节的环境中,这是一个完全合理的权衡。 (11认同)
  • `printf` 可以使用 -v 选项直接打印到变量,无需子 shell:`printf -v Q %s {0..9} {A..Z}` (9认同)
  • 使用反引号可以节省 1 个字节。 (4认同)
  • @annahri 这是[坏建议](https://unix.stackexchange.com/a/126928/3645)。 (4认同)

Rom*_*nov 8

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

echo {0..9} {A..Z}|sed 's/ //g'
Run Code Online (Sandbox Code Playgroud)

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

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

echo {0..9} {A..Z}|tr -d ' '
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在打高尔夫球,请将 `tr -d " "` 替换为 `tr -d \ `(一个尾随空格)并以牺牲可读性为代价保存一个字符 (8认同)