说我想遍历两个字母和数字列表。
A B C D
和seq 1 100
。
如何遍历字母和数字,但不能像嵌套的for循环中那样遍历?就是A1B2C3D4 A5B6C7D8 ...
到目前为止,我一直在尝试:嵌套的for循环和& done
似乎没有任何帮助,因为它们会产生A1 B1 C1 D1 A2 B2...
或并行执行不一致的结果。
这也感觉像是一个非常基本的并行循环,因此不需要详细的说明或实际代码:任何提及文档链接或此类序列的常规名称的答案都会被接受。< / p>
答案 0 :(得分:1)
以下脚本以空格开头生成您的预期输出:
脚本
for i in {1..100}; do
IFS= read c
printf %s "$c$i"
done < <(yes $' A\nB\nC\n\D')
输出
A1B2C3D4 A5B6C7D8 A9B10C11D12 A13B14C15D16 A17B18C19D20 A21B22C23D24 A25B26C27D28 A29B30C31D32 A33B34C35D36 A37B38C39D40 A41B42C43D44 A45B46C47D48 A49B50C51D52 A53B54C55D56 A57B58C59D60 A61B62C63D64 A65B66C67D68 A69B70C71D72 A73B74C75D76 A77B78C79D80 A81B82C83D84 A85B86C87D88 A89B90C91D92 A93B94C95D96 A97B98C99D100
说明
要读取序列1 2 3 ... 100
的全长,我们需要一次又一次地重复序列A B C D
。 yes
是一个无限制地重复其参数的命令。 yes x
版画
x
x
x
...
为了让yes
在每一行中打印不同的内容,我们使用了一个技巧。 $' A\nB\nC\nD'
是包含换行符的字符串($''
是所谓的bash ansi-c引号)。 yes $' A\nB\nC\nD'
将打印
A
B
C
D
A
B
...
我们希望稍后再使用文本,而不是打印到控制台。为此,我们可以编写yes ... | someCommand
或someCommand < <(yes ...)
,它们比管道有一些优势。后者称为process substitution。请注意,for ...; done
只是一个命令。可以从for
循环内的任何位置读取重定向的stdin。
答案 1 :(得分:0)
#!/bin/bash
# ASCII code for A
A=65
# Loop from 1 to 100
for ii in $( seq 1 100 )
do
# Compute ASCII code with using modulo
code=$(( (ii-1) % 4 + A ))
# Print letter
printf "\x$(printf %x $code)"
# Print number
echo $ii
done