Как я могу сделать таблицу умножения, используя расширение bash brace? Пока у меня есть это: echo $[{1..10}*{1..10}]
Я пытаюсь изучить 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 ответа
Используйте эту строку для хорошего вывода без использования циклов:
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
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}]
В производственном коде используйте цикл.