Как я могу сделать таблицу умножения, используя расширение bash brace? Пока у меня есть это: echo $ [{1..10} * {1..10}] - PullRequest
4 голосов
/ 17 апреля 2011

Я пытаюсь изучить bash на более глубоком уровне, и я решил создать таблицу умножения.У меня есть функциональность с оператором:

echo $[{1..10}*{1..10}]

, но это дает мне следующий вывод:

1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100

Есть ли способ отформатировать этот вывод, как показано ниже, используя только 1 оператор (я могу понять, как сделать это с помощью циклов, но это неинтересно: p)

1 2 3 4 5 6 7 8 9 10 
2 4 6 8 10 12 14 16 18 20 
3 6 9 12 15 18 21 24 27 30 
4 8 12 16 20 24 28 32 36 40 
5 10 15 20 25 30 35 40 45 50 
6 12 18 24 30 36 42 48 54 60 
7 14 21 28 35 42 49 56 63 70 
8 16 24 32 40 48 56 64 72 80 
9 18 27 36 45 54 63 72 81 90 
10 20 30 40 50 60 70 80 90 100

Можно ли вообще сделать это в одном операторе, или мне придется цикл?

Ответы [ 2 ]

11 голосов
/ 17 апреля 2011

Используйте эту строку для хорошего вывода без использования циклов:

echo $[{1..10}*{1..10}] | xargs -n10 | column -t

Вывод:

1   2   3   4   5   6   7   8   9   10
2   4   6   8   10  12  14  16  18  20
3   6   9   12  15  18  21  24  27  30
4   8   12  16  20  24  28  32  36  40
5   10  15  20  25  30  35  40  45  50
6   12  18  24  30  36  42  48  54  60
7   14  21  28  35  42  49  56  63  70
8   16  24  32  40  48  56  64  72  80
9   18  27  36  45  54  63  72  81  90
10  20  30  40  50  60  70  80  90  100

Обновление

В качестве следующего логического шага я спросил здесь , может ли эта таблица умножения иметь переменный диапазон.С этой справкой мой ответ работает с переменным ($boundary) диапазоном и остается вполне читабельным:

boundary=4; eval echo $\[{1..$boundary}*{1..$boundary}\] | xargs -n$boundary | column -t

Вывод:

1  2  3   4
2  4  6   8
3  6  9   12
4  8  12  16

Также обратите внимание, что арифметическая запись $[..] устарела и вместо нее следует использовать $((...)):

boundary=4; eval eval echo "$\(\({1..$boundary}*{1..$boundary}\)\)" | xargs -n$boundary | column -t

3 голосов
/ 17 апреля 2011

Встроенный printf повторяет свой формат столько раз, сколько необходимо для печати всех аргументов, поэтому:

printf '%d %d %d %d %d %d %d %d %d %d\n' $[{1..10}*{1..10}]

Если вы хотите избежать повторения бита %d, это сложнее.

printf "$(echo %$[{1..10}*0]d)\\n" $[{1..10}*{1..10}]

В производственном коде используйте цикл.

...