谁能解释一下 Ceaser Cipher 的这段代码

谁能解释一下 Ceaser Cipher 的这段代码

IN="MJHVIZN ZPIO YJHPN"

for I in $(seq 25); do
    echo $I $IN | tr $(printf %${I}s | tr ' ' '.')\A-Z A-ZA-Z
done

谁能解释一下这段代码。我对这个嵌套语句感到困惑

echo $I $IN | tr $(printf %${I}s | tr ' ' '.')\A-Z A-ZA-Z

答案1

在 中printf,将字符串打印到固定长度字段%[number]s数字字符宽,充满空间。因此%12s会生成一个 12 个字符的字段,或者如果字符串为空,则仅生成 12 个空格,就像这里一样。因此,printf %${I}s会根据变量的I指示生成尽可能多的空格,然后将它们更改为点。

因此,如果I是,比如说4,另一个tr得到第一个参数....A-Z,第二个参数A-ZA-Z。扩展它们并将它们放在一起,我们得到

....ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

它对应于四个字符的移位,与Iwas 的值一样多。

答案2

我在其中添加了一个回显,以便我可以看到管道中的第二个命令是什么。该命令的参数是用 构造的$()

in="MJHVIZN ZPIO YJHPN"

for i in $(seq 25); do
    echo tr $(printf %${i}s | tr ' ' '.')\A-Z A-ZA-Z
done

运行后应该更有意义。

还删除了变量名称中的大写字母。不知道谁在那里教用的。有一个标准规定它们应该是小写的。

相关内容