Who cares about math!!!
"Ricordatevi: l'algebra è come il porco, non si butta mai niente!"
(Maria Rosaria Celentani, Scienze MM.FF.NN)
Functions
Information can be passed to functions through arguments. An argument is just like a variable. Arguments are specified after the function name.
A function is a block of code designed to perform a particular task. A function is executed when "something" invokes it (calls it). Function parameters are usually the names listed in the function definition. Bash uses $n for parameters. Function arguments are the actual values passed to the function when it is invoked. Inside the function, the arguments behave as local variables.
for 
for each value of "x" the function will return a different value.
#!/bin/bash
function printTwoStrings {
echo $1 $2 #parameters aren't listed
#you can call them with $1 $2
#You must know how a function works before calling it.
}
printTwoStrings Hello Obistudends!
We had just replaced the "echo" function, with "printTwoStrings"
Apparently quite useless! But...
#!/bin/bash
function sum{
sum=$(( $1 + $2 ))
echo $sum
}
sum 3 4
#!/bin/bash
function sum {
sum=$(( $1 + $2 ))
echo $sum #is used to return value in standard output or to the main program
}
sum 3 4
sum 4 5
sum 7 9
# or better
read -p "write the first number " a
read -p "write the second number " b
sum $a $b
# or better
for i in {0..9}
do
sum $i 1
done
So, how we can write the function, called pow for
for 
#!/bin/bash
function pow {
res=$(( $1*$1))
echo $res
}
read -p "insert a number : " a
pow a
Best way to obtain the function "pow" is:
for 
#!/bin/bash
function pow {
res=1
for (( i=0; i<$2; i++ ))
do
res=$(( $res * $1 ))
# echo $res
done
echo $res
}
read -p "insert a number : " base
read -p "insert exp : " exp
pow $base $exp
Functions should be as atomic and reusable as possible.
Our goal is to write functions that we can use at work daily.
So it is useless to write a function just to compute 2+3 or 2^2; instead, we compute the sum of variables.
Variables, as we saw, can be integer or strings, so I'm pretty confident you
are already coming up with some useful ideas...
Arguments or standard input?
We can send information to a script via standard input (using the read command), or by passing it as arguments when running it from the shell.
./runScript Argument1 Argument2
As for the functions, we can re-call arguments, into the script, with $n
./runScript Ciao Obilab
#!/bin/bash
echo $1 $2 #this will print the 2 arguments we've sent
Let's do some tests: array iteration with function
#!/bin/bash
function printArray()
{
for (( i=0; i<$1; i++ ))
do
echo ${vet[$i]}
done
}
vet=("17" "9" "14") # let's declare a simple array of 3 elements, INT
n=3; # Number of elements of Array, as noobs do!
tot=${#vet[@]} #Number of elements of Array, as shady does!
#Print the Array
# for (( i=0; i<tot; i++ )) #we can use "n" or "tot"
# do
# echo ${vet[$i]}
# done
clear
echo now we will print the array
printArray ${#vet[@]} ${vet[@]}
echo "that's all!!"
So... are you ready for the final test? Let's figure it out!
Two other tips: I do love math, but... do not write codes as a math book. Variable, functions, must be readable, reusable with mnemonic names.
function x{
x=y/z*k-r
echo x
}
x a b c d
## or worse than worse
function x{x=y/z*k-r; echo x;}
It is the WORST method to implement a function, especially if you are working with other people, and if you will have to read your codes of 10.000 lines, after... 2 years!!!

