Showing posts with label AWS. Show all posts
Showing posts with label AWS. Show all posts

Sunday, 24 February 2019

How to run Shell Script


For premium DevOps and AWS Courses: https://imojo.in/2cox7em
  1. AWS with the project 
  2. DevOps Real-Time 
  3. DevOps with the project 
  4. AWS Real-Time
  5. Linux Admin


Running shell script


To run our script, enter:

1.     $ ./script.sh
The dot slash (./) denotes the current directory. This is necessary because the current directory is usually not in $PATH.

2.     $ bash script.sh
3.     $ source script.sh
The file need not be executable but it must be a valid shell script. The file can be in current directory or in a directory in $PATH.
4.     $ . script.sh
Bash defined source as an alias to the dot command.
Note that sourcing will run the commands in the current shell process while bash executing will run the commands in a new shell process.


For loop - print odd numbers from 1 to 10


Output should look like this:
1 3 5 7 9


Shell 1
#!/bin/bash

for i in 1 3 5 7 9
do
   echo -n "$i "
done
echo



Shell 2
#!/bin/bash

for i in {1..9..2}
do
   echo -n "$i "
done
echo



Shell 3
#!/bin/bash

for ((i=1; i<10; i+=2))
do
   echo -n "$i "
done
echo


Shell 4


#!/bin/bash

for i in {1..10}
do
  out=$(( $i % 2 ))
  if [ $out -eq 1 ]
  then
    echo -n "$i "
  fi
done



Ruby
Using "print" for no-new-line, the "puts" for a new line:


i = 1
loop do
   break if i > 10
   print "#{i} " unless i % 2 == 0
   i += 2
end
puts




Bash - delete the last line of files in a sub directory
We'll use 'vi' in the script:
#!/bin/bash

for file in sub/*
  do
    if [ -f $file ]

    then
      vi -c '$d' -c 'wq' "$file"
    fi
  done


The bash script will remove the last line from all files in a 'sub' directory.




Bash - Replacing a string in multiple files
When we need to replace a string across multiple files, we can use sed and the coding is similar to the one we used in the previous section:
#!/bin/bash

for file in ./*
  do
    if [ -f $file ]
    then
      sed -i 's/2016/2017/g' "$file"
    fi
  done


Note that we may tempted to do it with a single line with the "sed" command like this:
sed -i s/2016/2017/g *


But it won't work when we meet a directory. That's why we need to check if it is a file or not.




Bash - if statement
To be more familiarized with if statement, try the following script:
#!/bin/bash

TWO=2
for (( i=1;i<=3;i++ ))
do
  if [ ${i} -lt $TWO ];
  then
    echo "${i} is less then $TWO"
  elif [ ${i} -eq $TWO ];

  then
    echo "${i} is equal to $TWO"
  else
    echo "${i} is greater than  $TWO"
  fi
done 


Output:
1 is less then 2
2 is equal to 2
3 is greater than  2


To check if a string is not null nor a space:
#!/bin/bash

str1="Not Null"
str2=" "
str3=""
message="is not Null nor a space"

if [ ! -z "$str1" -a "$str1" != " " ]; then
  echo "str1 ${message}"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
  echo "str2 ${message}"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
  echo "str3 ${message}"
fi


Output:
str1 is not Null nor a space




Here document
The syntax looks like this:
command << delimiter document delimiter



The shell interprets the << operator as an instruction to read input until it finds a line containing the specified delimiter. All the input lines up to the line containing the delimiter are then fed into the standard input of the command.
Example 1:
$ wc -l << EOF
    This is a simple lookup program
    for good (and bad) restaurants
    in Cape Town.
EOF
3
$



Example 2:
cat << EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF


The command appends "deb http://apt.kubernetes.io/ kubernetes-xenial main" string to "/etc/apt/sources.list.d/kubernetes.list" file.


Example 3:

$ sed 's/_/-/g' << EOF
    2013_4_5
    2013_4_6
EOF
    2013-4-5
    2013-4-6