Shellscript Part - 4

Youtube

Shellscript part-4

What is function ?

Function is used to group the set of commands/logic and it will be executed only if it is called

Mainly used for reusability purpose.

Clone the shellscript git repo

ubuntu@test:~$ git clone https://github.com/vigneshsweekaran/shellscript
Cloning into 'shellscript'...
remote: Enumerating objects: 271, done.
remote: Counting objects: 100% (271/271), done.
remote: Compressing objects: 100% (200/200), done.
remote: Total 271 (delta 135), reused 189 (delta 67), pack-reused 0
Receiving objects: 100% (271/271), 31.86 KiB | 1.18 MiB/s, done.
Resolving deltas: 100% (135/135), done.
ubuntu@test:~$ cd shellscript/tutorials/part-4/
ubuntu@test:~/shellscript/tutorials/part-4$ ll
-rwxrwxr-x 1 ubuntu ubuntu  158 May 15 11:38 1-function.sh*
-rwxrwxr-x 1 ubuntu ubuntu  238 May 15 11:38 2-function-return.sh*
-rwxrwxr-x 1 ubuntu ubuntu  516 May 15 11:38 3-function-return-array.sh*
-rwxrwxr-x 1 ubuntu ubuntu  894 May 15 11:38 4-create-user.sh*

Basic function

#!/bin/sh

# Function Definition
greeting() {
   echo "Hello $1"
}

# Calling the function
greeting "DevopsPilot"

greeting "Vignesh"

greeting "Shellscript"

Here we created a function named greeting This will not be executed by itself. You have to call the function by its name, then only it will be executed

You can pass the arguments to the function, if it is expected.

In the above, we are calling the function greeting and passing the argument Vignesh Eg: greeting “vignesh”

You can call the function many number of times with different arguments based on requirement

ubuntu@test:~/shellscript/tutorials/part-4$ ./1-function.sh 
Hello DevopsPilot
Hello Vignesh
Hello Shellscript

In the above output, you have seen three times the echo command was executed with different outputs since we called the function 3 times with different arguments

How to return some data from function

#!/bin/sh

# Function Definition
addition() {
  num1=$1
  num2=$2

  output=$(( num1 + num2 ))

  return $output
}

# Calling the function
addition 20 5

# Capture the result returned by last command
result=$?

echo "The output is $result"

In some scenarios you want to return the output data from the function to the caller.

You have use the return keyword to return the data from the function Eg: return $output

$output is the data you want to return

To capture the returned data. After the function call, you have to use $? EG: result=$?

So the returned data is captured and stored to a variable

NOTE: A function can return only a number or string

ubuntu@test:~/shellscript/tutorials/part-4$ ./2-function-return.sh 
The output is 25

How to return a array from function

ubuntu@test:~/shellscript/tutorials/part-4$ cat 3-function-return-array.sh 
#!/bin/bash

output=()

# Function Definition
calculate() {
  num1=$1
  num2=$2

  output_add=$(( num1 + num2 ))
  output_sub=$(( num1 - num2 ))
  output_multiply=$(( num1 * num2 ))
  output_division=$(( num1 / num2 ))

  output=("$output_add" "$output_sub" "$output_multiply" "$output_division")
}

# Calling the function
calculate 20 5

echo "The addition result is ${output[0]}"
echo "The subtraction result is ${output[1]}"
echo "The multiplication result is ${output[2]}"
echo "The division result is ${output[3]}"

Since you can return only number or string, array cannot be returned directly from the function.

In this case, you have to declare the empty array outside the function Eg: output=()

And the update the array inside the function once the data is ready

So you can directly access the array, once the function is executed. No need to return the data from function here

Once the function calculate is executed. We can directly access the ${output[0]} to get the first data from the array

ubuntu@test:~/shellscript/tutorials/part-4$ ./3-function-return-array.sh 
The addition result is 25
The subtraction result is 15
The multiplication result is 100
The division result is 4

How to create and delete the linux users using script

#!/bin/bash

users_list=(raghav mani manoj devops)
delete_users_list=(raghav)

# Checks whether user is present or not
check_user(){
  USER=$1

  id ${USER}
  return $?
}

# To create user
create_user(){
  USER=$1
  COMMENT="Managed by script"
  useradd -c "$COMMENT" $USER --create-home
  echo "Created user $USER successfully !!!"
}

# To delete users
delete_users(){
  echo "Deleting Users ..."

  for user in ${delete_users_list[@]};
  do
    check_user $user
    user_status=$?
    
    if [[ $user_status -eq 0 ]]
    then
      userdel -r $user
    else
      echo "The user ${user} doesn't exist !!!"
    fi
  done
}

# Creating users
echo "Creating Users ..."

for user in ${users_list[@]};
do
  check_user $user
  user_status=$?

  if [[ $user_status -ne 0 ]]
  then
    create_user $user
  else
    echo "The user ${user} already exist !!!"
  fi
done

# Deleting Users
# delete_users

First we create two array’s users_list to store the list of news users to create and delete_users_list to store the list of existing users you want to delete

And we create 3 functions,

check_user –> To check whether user is already existing or not

create_user –> To create a new user

delete_users –> To delete the users listed in delete_users_list array

The execution starts at the echo "Creating Users ..." and then for user in ${users_list[@]};

For gets the first user from users_list array and stores to user variable.

Then we call the check_user with argument as user to check whether user is present or not.

The check_user function runs the id $users command to check whether user is present or not.

If the user is present $? will give 0 if not it returns non-zero number

Then we passes the result from function to who called the function.

Next to the function call, you can use $? to capture the data returned from the function.

$? is used for many purposes, when we check $? after command execution it gives the status_code of the command

If we check after the function call, it gives the function return data.

Here the function may return 0 or non-zero number and storing the data to user_status variable

If user_status is 0 the user is already present, then the if condition just prints echo "The user ${user} already exist !!!"

If user_status is non-zero number, it enters if condition and call the create_user function with argument user to create the new linux user.

The for loop continues and creates all users listed in users_list array

Next # delete_users function call line is commented, it will not call the delete_users() function

If you want to delete the users listed in delete_users_list array. Uncomment the function call line delete_users

So the delete_users() function will be called and it checks whether the user is present or not using check_user() function and deletes the user using userdel command

The for loop inside delete_users() function continues and delete all user listed in delete_users_list array

ubuntu@test:~/shellscript/tutorials/part-4$ sudo ./4-user-management.sh 
Creating Users ...
id: ‘raghav’: no such user
Created user raghav successfully !!!
id: ‘mani’: no such user
Created user mani successfully !!!
id: ‘manoj’: no such user
Created user manoj successfully !!!
id: ‘devops’: no such user
Created user devops successfully !!!