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
它对应于四个字符的移位,与I
was 的值一样多。
答案2
我在其中添加了一个回显,以便我可以看到管道中的第二个命令是什么。该命令的参数是用 构造的$()
。
in="MJHVIZN ZPIO YJHPN"
for i in $(seq 25); do
echo tr $(printf %${i}s | tr ' ' '.')\A-Z A-ZA-Z
done
运行后应该更有意义。
还删除了变量名称中的大写字母。不知道谁在那里教用的。有一个标准规定它们应该是小写的。