Fibonacci Counter In Pure Bash

The Fibonacci sequence is a mathematical sequence of numbers such that the result is the sum of the previous two numbers in the sequence starting at x=0 and y=1. Hence,

z = x + y

We can write a script to calculate this function in bash or shell commands.

First, I needed to visualize the idea:

1
2
x + y = z
z + y = z2

To help us figure this out we need to see what happens after the first iteration to work out how to change our variables and then send them through a loop.

1
2
3
4
5
6
7
x=0
y=1
z=0
# first time
z=$(( x + y ))
echo $z
Output~:$ 1

After the first time the sequence happens we need to add “x and y” again. On the second run z should be increased too. So how do we assign them?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# when we add x + y, then z became 1
# but now we need to to be replace y and then x for the second run.
# We can build a small tree to see what's happening

x   y   z
0 + 1 = 1
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13= 21

# the z comes from nowhere else but the result of what we are about to do
# but we now know what we need to use in the second run, third run, and so on.
# We should make x now become y
x=$y

# and then y become z! $y needs to be give its value to x right
# before we give $y a new value from $z
y=$z

Now, how do we loop it? We can use a while loop. This while loop simply checks if $x is true. Whenever $x has a value, it will run. Hence, it will run forever.

1
2
3
4
5
6
7
y=1
while true; do
  let z=x+y
  echo $z
  x=$y
  y=$z
done

Here’s the result:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
[[email protected] ~]$ y=1
[[email protected] ~]$ while true; do
>   let z=x+y
>   echo $z
>   x=$y
>   y=$z
> done
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264
806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309
7540113804746346429
-6246583658587674878
1293530146158671551
-4953053512429003327
-3659523366270331776
-8612576878699335103
6174643828739884737
-2437933049959450366
3736710778780434371
1298777728820984005
5035488507601418376
6334266236422402381
-7076989329685730859
-742723093263328478
-7819712422949059337
-8562435516212387815
2064596134548104464
-6497839381664283351
-4433243247116178887
7515661444929089378
3082418197812910491
-7848664430967551747
-4766246233154641256
5831833409587358613
1065587176432717357
6897420586020075970
7963007762452793327
-3586315725236682319
4376692037216111008
790376311979428689
5167068349195539697
5957444661174968386
-7322231063339043533
-1364786402164075147
-8687017465503118680
8394940206042357789
-292077259460760891
8102862946581596898
7810785687120836007
-2533095440007118711
5277690247113717296
2744594807106598585
8022285054220315881
-7679864212382637150
342420841837678731
-7337443370544958419
-6995022528707279688
4114278174457313509
-2880744354249966179
1233533820207347330
-1647210534042618849
-413676713835271519
-2060887247877890368
-2474563961713161887
-4535451209591052255
-7010015171304214142
6901277692814285219
-108737478489928923

Leave a Reply

Your email address will not be published. Required fields are marked *