【问题标题】:Bash shell iterations over letters and numbers字母和数字上的 Bash shell 迭代
【发布时间】:2019-03-25 01:27:51
【问题描述】:

假设我想遍历两个字母和数字列表。
A B C Dseq 1 100。 如何迭代字母和数字,但不像嵌套的 for 循环?所以应该是A1B2C3D4 A5B6C7D8 ...

到目前为止我尝试过的方法:嵌套 for 循环和 & done 似乎没有任何帮助,因为它们会产生 A1 B1 C1 D1 A2 B2... 或并行执行的不一致结果。

而且感觉就像一个非常基本的并行循环,所以不需要详细解释或实际代码:任何提及文档链接或此类序列的常规名称的答案都将立即被接受。

【问题讨论】:

  • 您尝试过什么解决问题的方法?
  • @hek2mgl 感谢我尝试 for-loop 和 & done 的问题,但未能达到预期的结果。
  • 最好是展示你的代码
  • 不会是 Z25。只有 A、B、C、D。
  • 如果它在 A-D 上循环并且不破坏数字循环,那么这正是我所需要的。 A1B2C3D4 A5B6C7D8 ... 等等。

标签: bash shell for-loop scripting


【解决方案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 Dyes 是一个无限重复其参数的命令。 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 ... | someCommandsomeCommand &lt; &lt;(yes ...),这比管道有一些优势。后者称为process substitution。请注意,for ...; done 也只是一个命令。可以从for 循环内的任何位置读取重定向的标准输入。

【讨论】:

  • 这就是我需要的!你能描述一下这部分的本质是什么吗done &lt; &lt;(yes...
  • 很高兴听到这个消息。我将添加一个解释。请稍等。
  • 你就是男人!尽管新手发帖有种种障碍,但在这里有这样的人写得很好,简洁的答案真是太好了。再次感谢!
  • 只是好奇:在编程中有没有这种循环的常规名称?
  • 我不知道。也许在函数式编程中,您会将两个序列都视为流,循环将被 zip 或合并操作替换——一种基于其他两个流计算一个流的操作。与 bash 中最接近的是 paste 命令以及一些后续操作。
【解决方案2】:
#!/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

【讨论】:

  • 对于未来的个人来说,如果这个答案能解释它为什么有效,那就太好了。
  • @KevinO 认真的吗?我评论了每一行。什么没有解释?
  • 是的,认真的。为什么模数可以回答这个问题。明明循环注释了,但是解决问题的主要逻辑没有解释。
  • 如果有人不了解模运算符的工作原理,那我还不如假设他根本不知道如何编程。
猜你喜欢
  • 2017-03-19
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2023-01-18
  • 2021-01-16
  • 2014-08-20
相关资源
最近更新 更多