Bash script is a plain text files with the “.sh” extension. It can be executed by invoking the Bash interpreter. A typical Bash script starts with a shebang (#!/bin/bash), which indicates the directory or path to the Bash interpreter. After the shebang, one can define variables and functions, use conditionals and loops and execute built-in commands like any other programming language.
Bash scripting also known as shell scripting is a programming language for operating machines in Unix or Unix-like systems such as Linux. There are a huge number of already written scripts that automate the repetitive tasks that we call commands. Moreover, it allows user to write their own script and interact with the system resources as per needs. This article provides a few Bash script examples that aim to teach you to write Bash script from scratch.
Where to Write a Bash Script?
To write a Bash script, you can use any of the text editors, as Bash scripts are essentially text files with a .sh extension. However, to execute the script you need a Unix or Unix-like operating system where Bash interpreter is available.
How to Execute a Bash Script?
To successfully execute a Bash script, ensure that the script has the necessary execution permissions. Once the permissions are set, you can execute the script by calling it from the terminal. The command syntax for executing a bash file is chmod +x <bash file name>
.
28 Most Useful Bash Scripting Examples
The primary objective of Bash scripting examples is to provide you with a fundamental understanding of bash scripting. Without further delay, let’s jump straight into our first example.
1. Starting With Hello World
Let’s start with a Bash script that can print “hello world”. The purpose of this script is to show you how echo command works in Bash. Go through the below steps:
- At first, launch an Ubuntu Terminal.
- Open a file with Nano editor. For example
nano hello.sh
- Copy the following script and paste it into the file. Then press CTRL+O and ENTER to save the file; CTRL+X to exit.
#!/bin/bash echo “Hello World”
EXPLANATIONHere, the echo command is used to print or display messages to the console. In this script, it is used to output the string “Hello World”. - Running the file will display a message as below:
Note: The quotation marks around “Hello World” should be straight quotation marks (“) instead of curly quotation marks (“”). Deliberately used curly quotation marks are treated as part of the string itself.
2. Defining Variables in a Bash Script
One can assign values to a variable using equal sign (=) in Bash. Furthermore, print the assigned values using echo $VARIABLE_NAME. Moreover, this example will give you a clear idea of why quotations can be useful in certain situations in echo command though it’s not mandatory.
To define variables use the following bash script:
#!/bin/bash
name=Tom
age=12
echo "$name's age is $age"
The provided Bash script assigns the values “Tom” to the name variable and 12 to the age variable. It then uses the echo command to display the message “Tom’s age is 12” on the terminal.
Some key points to note from the example:
- Use the equal sign (=) to assign values to variable names.
- To refer to a variable use the dollar sign ($) e. $VARIABLE_NAME
- Variable names are case sensitive i.e. ‘A’ and ‘a’ are different.
- While updating/changing the variable values use only the variable name with the assignment operator(=) i.e. VARIABLE_NAME= NEW_VALUE.
- No need to define variable type while declaring variables.
- Enclose multiple words or string values within Single Quote (” ) or Double Qoute (“”) to consider all characters as input.
3. Environment Variables in Bash
Environment variables in Bash are dynamic named values that define the operating environment for the shell session and its child processes. There are a few environment variables that contain information about the environment in which the shell is running. These variables are special and are accessible to all scripts within the environment. Some of the most common environment variables are:
- HOME: The home directory of the current user.
- USER: The username of the current user.
- PWD: The current working directory.
- PATH: A colon-separated list of directories in which the shell looks for executable files.
- SHELL: The path to the current shell executable.
The below script shows the value of the two most important environment variables HOME and PATH:
#!/bin/bash
echo $HOME # Prints the home directory of the current user
echo $PATH # Prints the directories in which the shell searches for executable files
In the above script, $HOME
and $PATH
is used to extract the home directory and value of the PATH variable respectively. Once you execute the above script, the values of the variables HOME and PATH will be displayed, as shown in the output image.
4. Delete or Unset Variable
Users can delete or unset a variable using the unset
command in Bash scripting. Unsetting a variable makes the variable undefined or empty. Here’s an example script that shows the usage of unset
command:
#!/bin/bash
name="LinuxSimply"
echo "Name before deletion: $name"
unset name
echo "Name after deletion: $name"
The given Bash script starts by assigning the value “LinuxSimply” to the variable name. It then prints the value of name before deletion, which is “LinuxSimply”. The unset
command is used to remove the variable name from the shell environment. After unsetting the variable, it attempts to print the value of name again, resulting in an empty line since the variable no longer exists.
echo
command can’t retrieve its value as earlier.
5. Getting the Script Name
One can easily find the name of a Bash script using the basename
command. Let’s create a script to return back its name:
#!/bin/bash
script_name=$(basename "$0")
echo "The script name is: $script_name"
In the above script, basename
is used to extract the script name using the $0
variable. The resulting name is then stored in the script_name variable. Then it is displayed using the echo
command.
$BASH_SOURCE
instead of $0 to get the name of the script.6. Taking User Input in a Variable
The read command is used to take user input. Once you use -p
, the command is enabled to prompt a message to the user along with taking input. Later, you can use echo $VARIABLE_NAME
to display the user input on the screen.
To take user input in a variable, use the below bash script:
#!/bin/bash
read -p "Enter a number:" num
echo "You entered: $num"
The given script prompts the user to enter a number using the read
command with the -p
option. The user’s input is stored in the num
variable. Then, the script uses echo
to print “You entered: ” followed by the value stored in num
. Then the echo
command is used to display the number.
7. Display Output in Terminal or Saving in a File
Let’s see how to perform an arithmetic operation using variables and display the resulting output in the terminal or save it in a file. To perform any arithmetic calculation in Bash use $(())
syntax. See the script below for more clarification about its usage:
#!/bin/bash
read -p "Enter a number: " num1
read -p "Enter another number: " num2
add=$((num1 + num2))
echo "Addition of numbers: $add"
The script allows users to input two numbers and calculate their sum. When executed, it prompts the user to enter a number, which is stored in the variable num1. It then requests another number, which is stored in the variable num2. The script proceeds to add num1 and num2 together using the arithmetic expansion syntax $(())
, assigning the result to the variable add. Finally, it uses the echo
command to display the message “Addition of numbers: ” followed by the value of add.
Saving Output in a File
Here is how you can redirect the output to a file:
#!/bin/bash
read -p "Enter a number: " num1
read -p "Enter another number: " num2
add=$((num1 + num2))
echo "Addition of numbers: $add" > output.txt
The provided script allows users to input two numbers and calculate their sum. When executed, it prompts the user to enter a number, which is stored in the variable num1. It then requests another number, which is stored in the variable num2. The script proceeds to add num1 and num2 together using the arithmetic expansion syntax $(()),
assigning the result to the variable add. Instead of displaying the output in the terminal, it writes the output in the output.txt file.
cat output.txt
Once you run the command you can see “Addition of numbers :50” is written in the text file.
8. Calculation of Floating Point Using Pipe
Arithmetic calculation on floating point numbers can be done using pipe (|). It’s a mechanism to connect the output of one command as an input of another command. Here’s a practical example:
#!/bin/bash
result=$(echo "3.14 + 2.7" | bc)
echo "$result"
The expression 3.14 + 2.7 is echoed and then passed as input through the pipe to the bc
command for arithmetic evaluation. The command substitution, indicated by $(...)
, captures the output of bc
and assigns it to the result variable. Lastly, the value of the result is printed to display the arithmetic evaluation.
9. Bash If Conditionals
In Bash, the if statement is used to check conditions. The statement starts with the word if and ends with the word fi. if
can check single or multiple conditions using only one if statement. The following script shows a simple example of if
conditionals:
#!/bin/bash
# Checking if a number is positive or negative
read -p "Enter a number:" num
if [ $num -gt 0 ]; then
echo "The number is positive."
else
echo "The number is negative or zero."
fi
The condition [ $num -gt 0 ]
checks if the value of the variable num is greater than zero. If the condition is true, the code within the then block is executed, which in this case prints “The number is positive.” If the condition is false, the code within the else block is executed, which prints “The number is negative or zero.”
Note: Ensure accurate whitespace usage within the condition of the if statement to avoid errors. Pay attention to both missing and extra whitespaces.
A list of comparison operators that can be useful for evaluating conditions using if
statement:
- -eq: equal to
- -ne: not equal to
- -lt: less than
- -gt: greater than
- -le: less than or equal to
- -ge: greater than or equal to
10. “Or/And” Condition in If Statement
Sometimes users may want to check multiple conditions in a single if statement. Logical operators are quite helpful for this purpose. Some of the Logical operators of the Bash script are:
- &&: AND operator
- ||: OR operator
- !: NOT operator
To use or/and
condition within bash if
condition, go through the following script:
#!/bin/bash
read -p "Enter your age:" age
read -p "Enter marks obtained:" marks
if [ $age -gt 25 ] && [ $marks -gt 800 ]; then
echo "Congratulations! You are eligible for a scholarship."
elif [ $age -gt 25 ] || [ $marks -gt 800 ]; then
echo "Submit administrative reference for the scholarship."
elif [ $age -lt 25 ] && [ $marks -lt 800 ]; then
echo "Sorry, you are not eligible for the scholarship."
fi
The above script determines scholarship eligibility based on two variables age and marks. If the age is greater than 25 and (&&) the marks is greater than 800, it prints “Congratulations! You are eligible for a scholarship.” If the age is greater than 25 or(||) the marks is greater than 800, it prints “Submit administrative reference for the scholarship.” Else, if the age is less than 25 and the marks is less than 800, it prints “Sorry, you are not eligible for the scholarship.”
11. Checking Empty Variable
Use -z
to check whether a variable is empty or not. The below script shows how to use it:
#!/bin/bash
var=""
if [ -z "$var" ]; then
echo "The variable is empty."
else
echo "The variable is not empty."
fi
[ -z "$var"]
returns True if $var
has not any value set. Writing this inside an if block checks the return value and executes the corresponding code block. If the variable is empty, the script executes code under the if block and prints the message “The variable is empty.” Otherwise, it executes the code within the else block.
12. Bash Case Statement
Sometimes Bash case
statement can be a useful alternative to the if else
statement. It looks for patterns and performs specific actions based on the matched patterns. The case statement starts with the word case and ends with the word esac. Here’s an example of case statement in Bash script:
#!/bin/bash
read -p "Enter file extension: " extension
case $extension in
".txt"|"log")
echo "It's a text file or a log file!"
;;
".csv"|".xlsx")
echo "It's a spreadsheet file!"
;;
esac
The script prompts the user to enter a file extension and uses a case statement to determine the type of file based on the extension. Then it reads the user’s input and stores it in the extension variable. The case
statement evaluates the value of extension and checks for specific patterns. If the value matches either “.txt” or “log”, it executes the corresponding code block, displaying the message “It’s a text file or a log file!” on the terminal. Similarly, if the value matches either “.csv” or “.xlsx”, it executes the relevant code block, printing “It’s a spreadsheet file!” as the output.
case
statement and hence displays the message shown in the above image.
13. “for” Loop in Bash
Bash for loop is a fundamental construct in shell scripting for this purpose. Every programming language offers some control structure for looping over an iterable. The script below shows the use of a for loop for counting files of the directory:
#!/bin/bash
count=0
for file in *.txt
do
echo "$file"
count=$((count+1))
done
echo "Total number of files in the current directory: $count"
The variable count
is initialized to 0, representing the text file count. The for loop iterates over each file with the .txt extension using the pattern *.txt. Within the loop, the count
variable is incremented by 1 for each file encountered, and print the name of the matching file as well. After the loop completes, the total number of txt files in the current directory is displayed using the echo
command.
14. “while” Loop in Bash
The while loop is another important control structure in Bash scripting. Hopefully, you will get a clear idea about the while loop from the following script:
input=""
read -p "Enter q to quit: " input
while [ "$input" != "q" ] || [ "$input" != "Q" ]
do
echo "You entered $input. Press q to quit:"
read input done echo "Program Terminated..."
The provided code enables the user to input values until they enter either “q” or “Q” to quit the program. It begins by initializing the variable input as an empty string. Then the read
command prompts the user to enter a value and assigns it to input. The while loop evaluates whether the input is not equal to “q” or not equal to “Q”. If the user’s input is not q or Q, it prompts a message by pressing “q” to quit. The read
command captures the user’s next input, updating the value of input for the next iteration.
When the user finally enters “q” or “Q”, the loop terminates, and the message “Program Terminated…” is displayed.
15. “until” Loop in Bash
Until is a loop in bash and the primary purpose of using an until loop is to handle situations where you want to repeat an action until a desired state or condition is achieved. To use the until loop within a practical use, see the following script:
#!/bin/bash
# Check if a network service is available
until nc -z 127.0.0.1 8080; do
echo "Service is not available. Waiting for it to become accessible..."
sleep 10
done
echo "Service is now accessible."
The provided code uses an until loop to check the availability of a network service. It attempts to establish a connection to 127.0.0.1 (localhost) on port 8080 using the nc
command. If the connection fails, indicating that the service is not available, it displays a message stating so. Then it waits for 10 seconds before trying again using sleep
. The loop continues until the connection is successfully established. Once the service is accessible, the until loop terminates.
16. Select Structure in Bash
Bash provides another loop-like structure called select
. This loop offers a convenient way to create an interactive menu where user can select one or more options before quitting. Here’s a script showing the usage of select
:
#!/bin/bash
# Declare an array of options
options=("Option 1" "Option 2" "Option 3" "Quit")
# Display the menu and prompt the user for a choice
select choice in "${options[@]}"; do
case $choice in
"Option 1")
echo "You selected Option 1"
# Perform actions for Option 1
;;
"Option 2")
echo "You selected Option 2"
# Perform actions for Option 2
;;
"Option 3")
echo "You selected Option 3"
# Perform actions for Option 3
;;
"Quit")
echo "Exiting..."
break
;;
*)
echo "Invalid option. Please try again."
;;
esac
done
This Bash script demonstrates the use of a select loop to create a menu-driven interface. The array options hold the available menu options. The select
loop displays the menu options and prompts the user for a choice. Based on the selected option, the corresponding code block is executed, performing specific actions. If the user selects “Quit,” the script displays an exit message and breaks out of the loop. For any invalid choice, an error message is displayed.
17. Loop With Break or Continue
Bash offers continue
and break
statement to skip or terminate the program. This gives the flexibility to control the flow of the loops in an efficient manner. The below script demonstrates the use of these:
#!/bin/bash
read -s -p "Enter the password: " password
while true; do
if [ "$password" != "admin123" ]; then
echo "Access denied. Please enter again:"
read password
continue
else
echo "Access granted. Welcome!"
fi
break
done
The script starts by asking the user to input a password and stores it in the password variable. It then enters a while
loop that continues indefinitely until the correct password is entered. Inside the loop, an if
statement compares the entered password with “admin123”. If the passwords do not match, an “Access denied” message will be displayed, and the user will be prompted to enter the password again. The continue
statement is used to skip the rest of the current iteration of the while loop. The script hides the first input from the user using the -s
option with the read
command. Once the correct password is entered, an “Access granted. Welcome!” message is displayed, and the loop is terminated by using the break
statement.
-s
option. The user gives the second input which is also wrong. But this time it shows the input as the read
command within the loop doesn’t include the -s
option. Finally, the user gives the correct password. So the program terminates as it reaches the break
statement.
18. String Operation in Bash
The script below showcases the basic operations on strings such as concatenation, length calculation, and substring extraction in Bash:
#!/bin/bash
string1="Linux"
string2="Simply"
result="$string1$string2" # Concatenating with a without delimiter
echo "$result"
length=${#result} # Length of the string
echo $length
substring=${result:5:6}
echo $substring
The provided Bash code demonstrates string manipulation operations. It starts by defining two variables, string1
and string2
, with the values “Linux” and “Simply” respectively. The result
variable is then assigned the concatenated value of string1 and string2 without any delimiter, resulting in “LinuxSimply”. The echo
command is used to print the value of the result. Next, the length of the result
string is calculated using ${#result}
syntax, and the value is stored in the length variable.
Lastly, a substring is extracted from the result
string, starting from index 6 and having a length of 5 characters. This substring, “Simply”, is stored in the substring variable. manipulation.
19. Iterating Over Bash Array
There are mainly two types of arrays in Bash. They are indexed arrays and associative arrays. An indexed array can be easily accessed using the index of each item. In the following script, I will show you how to iterate over an indexed array. The below script shows the use of a loop to iterate over an array:
#!/bin/bash
# Declare an indexed array
myArray=("Apple" 100 "Orange" 50)
# Iterate over the array using a for loop
for item in "${myArray[@]}"; do
echo "$item"
done
An indexed array named myArray is declared and initialized with four elements. The elements consist of a mix of strings (“Apple” and “Orange”) and numbers (100 and 50) each separated by whitespace. Then for
loop is used to iterate through each element of the array. Within the loop, the value of item is displayed using the echo
command.
Note: Items of an indexed array are separated by whitespaces. However, space within the quotation is treated as part of the string.
20. Associative Array in Bash
In Bash, there is a built-in data structure called an associative array, which functions similarly to a Python Dictionary. To create an associative array, you can use the -A
option with the declare
command.
To declare an associative array, use the following bash script:
#!/bin/bash
# Declare and initialize an associative array
declare -A colors=(
["red"]="#FF0000"
["green"]="#00FF00"
["blue"]="#0000FF"
)
# Print the values using the keys
echo "Color code for red is: ${colors["red"]}"
An associative array named colors is declared and initialized using the declare
command. The array is created with three key-value pairs, where the keys are color names (“red”, “green”, “blue”) and the values are their corresponding color codes (“#FF0000”, “#00FF00”, “#0000FF”). Then the script uses the echo
command to print the value associated with the key “red” in the colors array.
${colors["red"]}
and display it with the echo command.
21. Getting Bash Array by Changing IFS Value
The IFS (Internal Field Separator) is a special variable that determines how Bash recognizes word boundaries or field separators within strings or input read by the shell. It’s used by the shell to split strings into words or fields when using constructs like loops or command substitution. By default, IFS is set to whitespace characters: space, tab, and newline. However, it can be customized to any character or sequence of characters. The below script shows how to change IFS:
#!/bin/bash
# Read the comma-separated values from input.txt into a variable
input=$(cat input.txt)
# Set the Internal Field Separator (IFS) to comma (',') to split the values
IFS=',' read -ra array <<< "$input"
# Display the full array
echo "Full Array: ${array[*]}"
This Bash script reads the comma-separated values from input.txt and stores them in the input variable. It then sets the Internal Field Separator (IFS) to a comma (‘,‘) using IFS=','
. This allows the script to split the values based on the comma delimiter and assign them to the array
variable using the read
command. Finally, the script displays the full array using ${array[*]}
.
22. Creating Bash Function
Function is a feature of Bash and other programming languages that helps in writing cleaner and more modular code by allowing you to break down complex tasks into smaller, manageable parts. The following example demonstrates the creation of a simple Bash script function:
#!/bin/bash
# Function definition
greet() {
read -p "Enter your name:" name
echo "Hello, $name! Welcome to Linuxsimply!!"
}
# Function call with an argument
greet
The code defines a function named greet in Bash scripting. When the function is called, it prompts the user to enter their name using the read
command. The entered name is stored in the name variable. Then, the function outputs a greeting message that includes the entered name using the echo
command. The message welcomes the user to “Linuxsimply“.
23. Functions With Argument
Arguments are values or variables passed to the function when it’s called. These arguments provide data to the function, allowing it to perform actions or computations based on the provided values.in functions are accessed using special variables. The first argument is represented by $1
, the second argument by $2
and so on.
You can reference these variables within the function to access the values passed as arguments during the function call. Here’s how:
#!/bin/bash
# Function to calculate factorial
calculate_factorial() {
local num=$1
local factorial=1
for ((i=1; i<=num; i++)); do
factorial=$((factorial * i))
done
echo "The factorial of $num is: $factorial"
}
# Prompt the user to enter a number
read -p "Enter a number: " number
# Call the function to calculate factorial
calculate_factorial $number
The provided Bash script calculates the factorial of a given number using a function called calculate_factorial()
. First, the script defines the function calculate_factorial() that takes an argument num
. Inside the function, a local variable factorial is initialized to 1. Then, a for loop runs from 1 to num, incrementing the loop counter i each time. Within the loop, the factorial variable is updated by multiplying its current value with i.
Once the loop completes, the function outputs the calculated factorial with a message indicating the original number. The script prompts the user to enter a number using the read
command, and the entered number is stored in the number variable. Finally, the calculate_factorial
function is called with the number variable as an argument to compute and display the factorial of the input number.
24. Get Date in Bash
The below Bash script prints the date in YY-MM-DD format:
#!/bin/bash
today=$(date +%y-%m-%d)
echo $today
The script utilizes the format %y
to retrieve year (YY), %m
for the month (MM) and %d
for the day (DD). After substituting the date
command in the variable “today“, it outputs the value of the variable using the echo
command.
25. Send Mail in Bash
Bash supports sending email using the mailx
command. The below script shows how to use mailx
to send email through Bash:
#!/bin/bash
recipient="[email protected]"
subject="Leave"
body="I would like to request you for next two days leave.\\n
Regards
Laku"
echo -E "$body" | mailx -s "$subject" "$recipient"
The provided Bash script demonstrates a simple example of sending an email using the mailx
command. The script sets the recipient’s email address, subject and body of the email. Then, it pipes the body content to the mailx
command with the specified subject and recipient address.
26. Calling Another Script
To call another script, use the bash command or add the path of the calling script in the PATH variable. The script below shows both processes:
Using bash command:
#!/bin/bash
# Call and run another script in a different process
echo "This program will give the multiplication of two numbers."
bash ./diff_process2.sh
Using PATH variable:
#!/bin/bash
read -p "Please enter a number: " number1
read -p "Please enter another number: " number2
result=$((number1 * number2))
echo "The multiplication of the numbers is: $result"
The first script initiates the execution of diff_process2.sh in a separate process using the bash command. Before executing diff_process2.sh, it displays a message informing the user that the program will calculate the product of two numbers using the echo command.
In the second script, the user is prompted to input two numbers, which are stored in the variables number1
and number2
. The script then performs the multiplication and displays the calculated multiplication result to the user.
27. Get Ip Address in Bash
Using the ifconfiq command in association with other commands can extract the IP addresses of a device. Look at the following script for a better understanding. Here’s the script to get the ip address of a computer:
#!/bin/bash
ip_address=$(ifconfig | grep 'inet ' | awk '{print $2}')
echo $ip_address
The provided Bash script retrieves and displays the IP address of a specified network interface. By default, it finds both the loopback and private IP of the device. The script uses the ifconfig
command and to gather interface information and then employs awk
to filter and extract the line containing the IP address. Finally, it echoes the interface name with the corresponding IP address.
28. Error Handling by Bash Exit Status
The set -e
command is commonly used in Bash scripting for error handling. It stops the script’s execution when it encounters a command with a non-zero exit status, indicating an error. A command returns an exit status of 0 when it executes successfully, while a non-zero exit status is returned when a command fails to run.
To handle errors using bash exit status, run the following bash script:
#!/bin/bash
set -e
echo "This command will execute successfully."
ls -l
echo "This command will fail, and the script will terminate."
nonexisting_command
echo "This command will not be reached due to the previous error."
# Continue with the script if the command succeeded
echo "Command executed successfully."
The set -e
command enables the script to exit immediately if any command returns a non-zero exit status, indicating an error. In this script, the ls -l
command is executed successfully and lists the files and directories. However, the subsequent command nonexisting_command
is not a valid command, resulting in an error. Due to set -e
is enabled, the script terminates at this point without executing any following command. Hence, it will not reach the final echo
statement.
ls -l
command but it immediately terminates when it finds nonexisting_command
which is not available in Bash.
Conclusion
To summarize, this article covers a wide range of Bash scripting examples, from basic to advanced. Some examples are short and straightforward, while others are more complex and intricate. The goal is to provide you with valuable insights into the world of Bash scripting. I hope you have enjoyed reading this article and find the examples useful in understanding Bash scripting.
People Also Ask
What is the difference between shell scripting and Bash scripting?
A shell is a program that is used for interacting with the system. Examples of popular shells include Bash, sh, csh, and ksh. On the other hand, Bash scripting refers to interacting with the machine by writing codes and commands using Bash shell only.
Is Bash script is a text file?
Yes, a Bash script is a plain text file that contains a series of commands and typically has a .sh extension, distinguishing it from regular text files that often have a .txt extension.
Why people use Bash scripting?
People use Bash scripting for automating tasks, system administration, data processing, log analysis, and many more.
Can I execute Bash script in Python?
Yes, you can execute a Bash script in Python by using the subprocess module to run the Bash script as a subprocess. This allows you to invoke and execute Bash commands or scripts within your Python code.
What are the differences between the while and until loop?
The while loop executes until a zero status is returned whereas the until loop executes until a nonzero status is returned. While loop may execute single or multiple times as long as the condition is met. On the other hand, the until loop always executes at least once.
FUNDAMENTALS A Complete Guide for Beginners