How to create a multiplication table using the bash brace extension? So far I have this: echo $ [{1..10} * {1..10}]

I am trying to learn bash at a deeper level, and I decided to make a multiplication table. I have functionality with an expression:

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

but this gives me the following result:

 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 

Is there a way to format this output as follows using only 1 operator (I can figure out how to do this with loops, but it's not fun: 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 

Is it possible to do this in one of the statements, or will I have to cyclically?

+4
source share
2 answers

Use this line for good output without using loops:

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

Output:

 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 

Update

As a logical next step, I asked here if this multiplication table can have a range of variables. Using this help , my answer works with a range of variables ( $boundary ) and remains readable:

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

Output:

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

Also note that the arithmetic notation $[..] deprecated and $((...)) should be used instead:

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

+11
source

The built-in printf repeats its format as many times as necessary to print all the arguments, therefore:

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

If you want to avoid repeating the %d bit, this is more complicated.

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

Use a loop in production code.

+3
source

All Articles