Bash Script Modularization: Exercises, Solutions & Explanation
1.
Greeting Function:
Write a Bash script that defines a function called greet which takes a name as an argument and prints a greeting message using that name.
Code:
#!/bin/bash
# Define the greet function
greet() {
local name=$1
echo "Hello, $name! Welcome!"
}
# Call the greet function with a name
greet "Kalevi"
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh Hello, Kalevi! Welcome!
Explanation:
In the exercise above,
- Define a function called "greet()" using the greet() { ... } syntax.
- Inside the function:
- Declare a local variable 'name' to store the argument passed to the function.
- Use "echo" to print a greeting message containing the provided name.
2.
Arithmetic Functions:
Write a Bash script that defines separate functions for addition, subtraction, multiplication, and division. These functions should take two numbers as arguments and print the result of the corresponding operation.
Code:
#!/bin/bash
# Function for addition
add() {
local num1=$1
local num2=$2
local sum=$((num1 + num2))
echo "The sum of $num1 and $num2 is: $sum"
}
# Function for subtraction
subtract() {
local num1=$1
local num2=$2
local difference=$((num1 - num2))
echo "The difference between $num1 and $num2 is: $difference"
}
# Function for multiplication
multiply() {
local num1=$1
local num2=$2
local product=$((num1 * num2))
echo "The product of $num1 and $num2 is: $product"
}
# Function for division
divide() {
local num1=$1
local num2=$2
if [ $num2 -eq 0 ]; then
echo "Error: Division by zero"
exit 1
fi
local result=$(bc <<< "scale=2; $num1 / $num2")
echo "The division of $num1 by $num2 is: $result"
}
# Test the functions
add 20 5
subtract 20 5
multiply 20 5
divide 20 5
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh The sum of 20 and 5 is: 25 The difference between 20 and 5 is: 15 The product of 20 and 5 is: 100 The division of 20 by 5 is: 4.00
Explanation:
In the exercise above,
- Define four functions: "add", "subtract", "multiply", and "divide".
- Each function takes two numbers as arguments and performs the corresponding operation.
- For addition, subtraction, and multiplication, we simply perform the operation using arithmetic expansion ($((...))) and print the result.
- For division, use "bc" command-line calculator to perform floating-point division with two decimal places (scale=2). We also handle division by zero error.
- Finally test each function by calling them with example numbers.
3.
Factorial Function:
Write a Bash script that defines a function called factorial which calculates and prints the factorial of a given number.
Code:
#!/bin/bash
# Define the factorial function
factorial() {
local num=$1
local result=1
# Check if num is negative
if [ $num -lt 0 ]; then
echo "Error: Factorial is not defined for negative numbers"
exit 1
fi
# Calculate factorial
for ((i = 1; i <= num; i++)); do
result=$((result * i))
done
echo "The factorial of $num is: $result"
}
# Test the factorial function with a number
factorial 4
factorial 10
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh The factorial of 4 is: 24 The factorial of 10 is: 3628800
Explanation:
In the exercise above,
- Define a function called "factorial" using the factorial() { ... } syntax.
- Inside the function:
- Declare a local variable 'num' to store the argument passed to the function.
- Declare another local variable 'result' and initialize it to 1.
- Check if 'num' is negative. If it is, we print an error message and exit the script.
- Next calculate the factorial of 'num' using a loop and store the result in the 'result' variable.
4.
Maximum and Minimum Functions:
Write a Bash script that defines functions called maximum and minimum which take two numbers as arguments and print the maximum and minimum of the two, respectively.
Code:
#!/bin/bash
# Function to find maximum of two numbers
maximum() {
local num1=$1
local num2=$2
if [ $num1 -gt $num2 ]; then
echo "The maximum of $num1 and $num2 is: $num1"
else
echo "The maximum of $num1 and $num2 is: $num2"
fi
}
# Function to find minimum of two numbers
minimum() {
local num1=$1
local num2=$2
if [ $num1 -lt $num2 ]; then
echo "The minimum of $num1 and $num2 is: $num1"
else
echo "The minimum of $num1 and $num2 is: $num2"
fi
}
# Test the maximum and minimum functions
maximum 101 201
minimum 12 17
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh The maximum of 101 and 201 is: 201 The minimum of 12 and 17 is: 12
Explanation:
In the exercise above,
- Define two functions: "maximum()" and "minimum()".
- Each function takes two numbers as arguments and compares them.
- For "maximum()", if the first number is greater than the second, it prints the first number as the maximum; otherwise, it prints the second number as the maximum.
- For "minimum()", if the first number is less than the second, it prints the first number as the minimum; otherwise, it prints the second number as the minimum.
5.
Power Function:
Write a Bash script that defines a function called power which takes two numbers as arguments and prints the result of raising the first number to the power of the second number.
Code:
#!/bin/bash
# Define the power function
power() {
local base=$1
local exponent=$2
local result=$((base ** exponent))
echo "The result of $base raised to the power of $exponent is: $result"
}
# Test the power function with two numbers
power 3 4
power 10 3
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh The result of 3 raised to the power of 4 is: 81 The result of 10 raised to the power of 3 is: 1000
Explanation:
In the exercise above,
- Define a function called "power()" using the power() { ... } syntax.
- Inside the function:
- Declare local variables 'base' and 'exponent' to store the arguments passed to the function.
- Calculate the result of raising 'base' to the power of 'exponent' using the ** operator.
- Finally, use "echo" to print a message showing the result.
6.
Prime Check Function:
Write a Bash script that defines a function called is_prime which checks if a given number is prime or not and prints the result.
Code:
#!/bin/bash
# Define the is_prime function
is_prime() {
local num=$1
local is_prime=true
if [ $num -lt 2 ]; then
is_prime=false
else
for ((i = 2; i <= num / 2; i++)); do
if [ $((num % i)) -eq 0 ]; then
is_prime=false
break
fi
done
fi
if $is_prime; then
echo "$num is prime"
else
echo "$num is not prime"
fi
}
# Test the is_prime function with a number
is_prime 19
is_prime 22
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh 19 is prime 22 is not prime
Explanation:
In the exercise above,
- Define a function called "is_prime()" using the is_prime() { ... } syntax.
- Inside the function:
- Declare local variables 'num' and 'is_prime'.
- First check if the number is less than 2. If it is, then it's not prime.
- Otherwise, loop from 2 to half of the number. If the number is divisible by any number other than 1 and itself, it's not prime.
- Based on the above checks, we set the 'is_prime' variable to true or false.
- Print whether the number is prime or not based on the value of 'is_prime'.
7.
File Operations Functions:
Write a Bash script that defines functions for basic file operations like creating a file, deleting a file, and checking if a file exists.
Code:
#!/bin/bash
# Function to create a file
create_file() {
local filename=$1
touch "$filename"
echo "File '$filename' created."
}
# Function to delete a file
delete_file() {
local filename=$1
if [ -f "$filename" ]; then
rm "$filename"
echo "File '$filename' deleted."
else
echo "File '$filename' does not exist."
fi
}
# Function to check if a file exists
file_exists() {
local filename=$1
if [ -f "$filename" ]; then
echo "File '$filename' exists."
else
echo "File '$filename' does not exist."
fi
}
# Test the file operations functions
create_file "doc_file.txt"
file_exists "doc_file.txt"
delete_file "doc_file.txt"
file_exists "doc_file.txt"
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh File 'doc_file.txt' created. File 'doc_file.txt' exists. File 'doc_file.txt' deleted. File 'doc_file.txt' does not exist.
Explanation:
In the exercise above,
- Define three functions: "create_file()", "delete_file()", and "file_exists()".
- create_file function creates a file with the specified name using the "touch" command.
- delete_file function deletes a file if it exists using the "rm" command, and prints a message accordingly.
- file_exists function checks if a file exists using the -f test operator and prints a message accordingly.
- Test these functions by creating a file, checking if it exists, deleting it, and checking again.
8.
String Manipulation Functions:
Write a Bash script that defines functions for common string manipulations such as string length, substring extraction, and string concatenation.
Code:
#!/bin/bash
# Function to get the length of a string
string_length() {
local str=$1
echo "Length of '$str' is: ${#str}"
}
# Function to extract a substring from a string
substring_extraction() {
local str=$1
local start=$2
local length=$3
local substring=${str:start:length}
echo "Substring from position $start with length $length in '$str' is: $substring"
}
# Function to concatenate two strings
string_concatenation() {
local str1=$1
local str2=$2
local concatenated="$str1$str2"
echo "Concatenated string of '$str1' and '$str2' is: $concatenated"
}
# Test the string manipulation functions
string_length "Hello, world!"
substring_extraction "Hello, world!" 6 4
string_concatenation "Bash, " "Scripting!"
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh ./test1.sh: line 2: n: command not found Length of 'Hello, world!' is: 13 Substring from position 6 with length 4 in 'Hello, world!' is: wor Concatenated string of 'Bash, ' and 'Scripting!' is: Bash, Scripting!
Explanation:
In the exercise above,
- Define three functions: "string_length()", "substring_extraction()", and "string_concatenation()".
- string_length function calculates the length of the given string using "${#str}" syntax.
- substring_extraction function extracts a substring from the given string using the "${str:start:length}" syntax.
- string_concatenation function concatenates two strings using simple string concatenation.
9.
Directory Operations Functions:
Write a Bash script that defines functions for working with directories, such as creating a directory, listing files in a directory, and checking if a directory exists.
Code:
#!/bin/bash
# Function to create a directory
create_directory() {
local dirname=$1
mkdir -p "$dirname"
echo "Directory '$dirname' created."
}
# Function to list files in a directory
list_files() {
local dirname=$1
if [ -d "$dirname" ]; then
echo "Files in directory '$dirname':"
ls "$dirname"
else
echo "Directory '$dirname' does not exist."
fi
}
# Function to check if a directory exists
directory_exists() {
local dirname=$1
if [ -d "$dirname" ]; then
echo "Directory '$dirname' exists."
else
echo "Directory '$dirname' does not exist."
fi
}
# Test the directory functions
create_directory "workarea_dir"
directory_exists "workarea_dir"
list_files "workarea_dir"
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh Directory 'workarea_dir' created. Directory 'workarea_dir' exists. Files in directory 'workarea_dir':
Explanation:
In the exercise above,
- Define three functions: "create_directory()", "list_files()", and "directory_exists()".
- create_directory function creates a directory with the specified name using the mkdir command.
- list_files function lists files in a directory if it exists, using the "ls" command.
- directory_exists function checks if a directory exists using the -d test operator.
- Finally, test these functions by creating a directory, checking if it exists, and listing files in it.
10.
Temperature Conversion Functions:
Write a Bash script that defines functions to convert temperatures between Celsius and Fahrenheit, and vice versa.
Code:
#!/bin/bash
# Function to convert Celsius to Fahrenheit
celsius_to_fahrenheit() {
local celsius=$1
local fahrenheit=$(echo "scale=2; ($celsius * 9/5) + 32" | bc)
echo "$celsius°C is equal to $fahrenheit°F"
}
# Function to convert Fahrenheit to Celsius
fahrenheit_to_celsius() {
local fahrenheit=$1
local celsius=$(echo "scale=2; ($fahrenheit - 32) * 5/9" | bc)
echo "$fahrenheit°F is equal to $celsius°C"
}
# Test the temperature conversion functions
celsius_to_fahrenheit 20
fahrenheit_to_celsius 68
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh 20°C is equal to 68.00°F 68°F is equal to 20.00°C
Explanation:
In the exercise above,
- Define two functions: "celsius_to_fahrenheit()" and "fahrenheit_to_celsius()".
- celsius_to_fahrenheit function converts Celsius temperature to Fahrenheit using the formula: (°Cx9/5)+32(°Cx5/9)+32.
- fahrenheit_to_celsius function converts Fahrenheit temperature to Celsius using the formula: (°F-32)x5/9(°F-32)x9/5.
- Use the "bc" command-line calculator with the 'scale' set to 2 to perform floating-point calculations.
Bash Editor:
More to Come !
Do not submit any solution of the above exercises at here, if you want to contribute go to the appropriate exercise page.
It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.
https://www.w3resource.com/bash-script-exercises/modularizing-scripts.php
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics