Итерации оболочки Bash по буквам и цифрам - PullRequest
0 голосов
/ 20 октября 2018

Скажем, я хочу перебрать два списка букв и цифр.
A B C D и seq 1 100.Как я могу перебирать буквы вместе с числами, но не так, как во вложенном цикле for?Так что это будет A1B2C3D4 A5B6C7D8 ...

То, что я пробовал до сих пор: вложенный цикл for и & done, похоже, не помогают, так как они дают либо A1 B1 C1 D1 A2 B2..., либо противоречивые результатыпараллельное выполнение.

Также это похоже на очень простой параллельный цикл, поэтому не нужно подробного объяснения или фактического кода : ЛЮБОЙ ОТВЕТ упоминание ссылки на документы или обычное название такой последовательности будетбыть немедленно принятым.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018
#!/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
0 голосов
/ 20 октября 2018

Следующий скрипт создает ожидаемый вывод с пробелом:

Скрипт

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 ...), что имеет некоторые преимущества перед конвейером.Последний называется процесс замещения .Обратите внимание, что for ...; done - это всего лишь одна команда.Перенаправленный stdin может быть прочитан из любой точки цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...