devops-exercises/topics/shell/README.md
krufab c664d2e7e2
Added a shorter solution for the directory diff exercise (#344)
Signed-off-by: Fabio Kruger <10956489+krufab@users.noreply.github.com>
2023-02-02 13:00:23 +02:00

7.7 KiB
Raw Blame History

Shell Scripting

Shell Scripting Exercises

Name Topic Objective & Instructions Solution Comments
Hello World Variables Exercise Solution Basic
Basic date Variables Exercise Solution Basic
Great Day Variables Exercise Solution Basic
Factors Arithmetic Exercise Solution Basic
Argument Check Conditionals Exercise Solution Basic
Files Size For Loops Exercise Solution Basic
Count Chars Input + While Loops Exercise Solution Basic
Sum Functions Exercise Solution Basic
Number of Arguments Case Statement Exercise Solution Basic
Empty Files Misc Exercise Solution Basic
Directories Comparison Misc Exercise Solution Basic
It's alive! Misc Exercise Solution Intermediate

Shell Scripting - Self Assessment

What does this line in shell scripts means?: #!/bin/bash

#!/bin/bash is She-bang

/bin/bash is the most common shell used as default shell for user login of the linux system. The shells name is an acronym for Bourne-again shell. Bash can execute the vast majority of scripts and thus is widely used because it has more features, is well developed and better syntax.

True or False? When a certain command/line fails in a shell script, the shell script, by default, will exit and stop running

Depends on the language and settings used. If the script is a bash script then this statement is true. When a script written in Bash fails to run a certain command it will keep running and will execute all other commands mentioned after the command which failed.

Most of the time we might actually want the opposite to happen. In order to make Bash exist when a specific command fails, use 'set -e' in your script.

What do you tend to include in every script you write?

Few example:

  • Comments on how to run it and/or what it does
  • If a shell script, adding "set -e" since I want the script to exit if a certain command failed

You can have an entirely different answer. It's based only on your experience and preferences.

Today we have tools and technologies like Ansible, Puppet, Chef, ... Why would someone still use shell scripting?
  • Speed
  • Flexibility
  • The module we need doesn't exist (perhaps a weak point because most CM technologies allow to use what is known as "shell" module)
  • We are delivering the scripts to customers who don't have access to the public network and don't necessarily have Ansible installed on their systems.

Shell Scripting - Variables

How to define a variable with the value "Hello World"?

HW="Hello World

How to define a variable with the value of the current date?

DATE=$(date)

How to print the first argument passed to a script?

echo $1

Write a script to print "yay" unless an argument was passed and then print that argument
echo "${1:-yay}"

What would be the output of the following script?
#!/usr/bin/env bash
NINJA_TURTLE=Donatello
function the_best_ninja_turtle {
        local NINJA_TURTLE=Michelangelo
        echo $NINJA_TURTLE
}
NINJA_TURTLE=Raphael
the_best_ninja_turtle

Michelangelo
Explain what would be the result of each command:
  • echo $0
  • echo $?
  • echo $$
  • echo $#

What is $@?
What is difference between $@ and $*?

$@ is an array of all the arguments passed to the script $* is a single string of all the arguments passed to the script

How do you get input from the user in shell scripts?

Using the keyword read so for example read x will wait for user input and will store it in the variable x.

How to compare variables length?
if [ ${#1} -ne ${#2} ]; then
    ...

Shell Scripting - Conditionals

Explain conditionals and demonstrate how to use them
In shell scripting, how to negate a conditional?
In shell scripting, how to check if a given argument is a number?
regex='^[0-9]+$'
if [[ ${var//*.} =~ $regex ]]; then
...

Shell Scripting - Arithmetic Operations

How to perform arithmetic operations on numbers?

One way: $(( 1 + 2 )) Another way: expr 1 + 2

How to perform arithmetic operations on numbers?
How to check if a given number has 4 as a factor?

if [ $(($1 % 4)) -eq 0 ]; then

Shell Scripting - Loops

What is a loop? What types of loops are you familiar with?
Demonstrate how to use loops

Shell Scripting - Troubleshooting

How do you debug shell scripts?

Answer depends on the language you are using for writing your scripts. If Bash is used for example then:

  • Adding -x to the script I'm running in Bash
  • Old good way of adding echo statements

If Python, then using pdb is very useful.

Running the following bash script, we don't get 2 as a result, why?
x = 2
echo $x

Should be x=2

Shell Scripting - Substring

How to extract everything after the last dot in a string?

${var//*.}

How to extract everything before the last dot in a string?

${var%.*}

Shell Scripting - Misc

Generate 8 digit random number

shuf -i 9999999-99999999 -n 1

Can you give an example to some Bash best practices?
What is the ternary operator? How do you use it in bash?

A short way of using if/else. An example:

&& b="yes, equal" || b="nope"

What does the following code do and when would you use it?

diff <(ls /tmp) <(ls /var/tmp)


It is called 'process substitution'. It provides a way to pass the output of a command to another command when using a pipe | is not possible. It can be used when a command does not support STDIN or you need the output of multiple commands. https://superuser.com/a/1060002/167769
What are you using for testing shell scripts?

bats