Difference between revisions of "Chapter 5 answers"

From Linux Shell Scripting Tutorial - A Beginner's handbook
Jump to navigation Jump to search
m (Text replacement - "<source lang="bash">" to "<syntaxhighlight lang="bash" >")
Line 15: Line 15:
  
 
* Write a menu driven script using the select statement to print calories for food items such as pizza, burger, Salad, Pasta etc.
 
* Write a menu driven script using the select statement to print calories for food items such as pizza, burger, Salad, Pasta etc.
<source lang="bash"></source>
+
<syntaxhighlight lang="bash" ></source>
  
 
----
 
----
  
 
* Write a shell script that, given a file name as the argument will count vowels, blank spaces, characters, number of line and symbols.
 
* Write a shell script that, given a file name as the argument will count vowels, blank spaces, characters, number of line and symbols.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
file=$1
 
file=$1
 
v=0
 
v=0
Line 48: Line 48:
  
 
* Write a shell script that, given a file name as the argument will count English language articles such As 'A', 'An' and 'The'.
 
* Write a shell script that, given a file name as the argument will count English language articles such As 'A', 'An' and 'The'.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
file=$1
 
file=$1
 
a=0
 
a=0
Line 79: Line 79:
  
 
* Write a shell script that, given a file name as the argument will write the even numbered line to a file with name evenfile and odd numbered lines in a text file called oddfile.
 
* Write a shell script that, given a file name as the argument will write the even numbered line to a file with name evenfile and odd numbered lines in a text file called oddfile.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
file=$1
 
file=$1
 
counter=0
 
counter=0
Line 111: Line 111:
  
 
* Write a shell script to monitor Linux server disk space using a while loop. Send an email alert when percentage of used disk space is >= 90%.
 
* Write a shell script to monitor Linux server disk space using a while loop. Send an email alert when percentage of used disk space is >= 90%.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
ADMIN="me@somewher.com"
 
ADMIN="me@somewher.com"
 
# set alert level 90% is default
 
# set alert level 90% is default
Line 129: Line 129:
  
 
* Write a shell script to determine if an input number is a palindrome or not. A palindromic number is a number where the digits, with decimal representation usually assumed, are the same read backwards, for example, 58285.
 
* Write a shell script to determine if an input number is a palindrome or not. A palindromic number is a number where the digits, with decimal representation usually assumed, are the same read backwards, for example, 58285.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
echo -n "Enter number : "
 
echo -n "Enter number : "
 
read n
 
read n
Line 160: Line 160:
  
 
* Write a shell program to read a number *such as 123) and find the sum of digits (1+2+3=6).
 
* Write a shell program to read a number *such as 123) and find the sum of digits (1+2+3=6).
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
  
 
#store the no
 
#store the no
Line 186: Line 186:
  
 
* Write a shell program to read a number and display reverse the number. For example, 123 should be printed as as 321.
 
* Write a shell program to read a number and display reverse the number. For example, 123 should be printed as as 321.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
  
 
#store the no
 
#store the no
Line 219: Line 219:
 
Total symbolic links : 0
 
Total symbolic links : 0
 
Total size of regular files : 2940</pre>
 
Total size of regular files : 2940</pre>
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
  
 
#copying the out of ls -l command to a file
 
#copying the out of ls -l command to a file
Line 273: Line 273:
  
 
* Write a  shell script that will count the number of files in each of your sub-directories using the for loop.
 
* Write a  shell script that will count the number of files in each of your sub-directories using the for loop.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
  
 
START=$HOME
 
START=$HOME
Line 299: Line 299:
  
 
* Write a shell script that accepts two directory names as arguments and deletes those files in the first directory which are similarly named in the second directory.
 
* Write a shell script that accepts two directory names as arguments and deletes those files in the first directory which are similarly named in the second directory.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
  
 
SRC="$1"
 
SRC="$1"
Line 340: Line 340:
  
 
* Write a shell script to search for no password entries in /etc/passwd  and lock all accounts.
 
* Write a shell script to search for no password entries in /etc/passwd  and lock all accounts.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
# Shell script for search for no password entries and lock all accounts
 
# Shell script for search for no password entries and lock all accounts
 
# Set your email
 
# Set your email
Line 381: Line 381:
  
 
* Write a shell program to read two numbers and display all the odd numbers between those two numbers.
 
* Write a shell program to read two numbers and display all the odd numbers between those two numbers.
<source lang="bash">#!/bin/bash
+
<syntaxhighlight lang="bash" >#!/bin/bash
 
# Shell program to read two numbers and display all the odd
 
# Shell program to read two numbers and display all the odd
  

Revision as of 22:49, 29 March 2016

← Chapter 5 ChallengesHomeChapter 6: Shell Redirection →

  • Decide whether the following sentence is true or false:
  1. False
  2. False
  3. False
  4. False
  5. True
  6. True
  7. True

  • Write a menu driven script using the select statement to print calories for food items such as pizza, burger, Salad, Pasta etc.

<syntaxhighlight lang="bash" ></source>


  • Write a shell script that, given a file name as the argument will count vowels, blank spaces, characters, number of line and symbols.

<syntaxhighlight lang="bash" >#!/bin/bash file=$1 v=0

if [ $# -ne 1 ] then echo "$0 fileName" exit 1 fi if [ ! -f $file ] then echo "$file not a file" exit 2 fi

while read -n 1 c do

 l=$(echo $c | tr [:upper:] [:lower:])
 | "$l" == "e" || "$l" == "i" || "$l" == "o" || "$l" == "u"  && (( v++ ))

done < $file

echo "Vowels : $v" echo "Characters : $(cat $file | wc -c)" echo "Blank lines : $(grep -c '^$' $file)" echo "Lines : $(cat $file|wc -l )"</source>


  • Write a shell script that, given a file name as the argument will count English language articles such As 'A', 'An' and 'The'.

<syntaxhighlight lang="bash" >#!/bin/bash file=$1 a=0

if [ $# -ne 1 ] then echo "$0 fileName" exit 1 fi if [ ! -f $file ] then echo "$file not a file" exit 2 fi

while read line do

 l=$(echo $line | tr [:upper:] [:lower:])

for word in $l do | $word == "an" || $word == "the" && ((a++)) done

done < $file

echo "articles : $a"</source>


  • Write a shell script that, given a file name as the argument will write the even numbered line to a file with name evenfile and odd numbered lines in a text file called oddfile.

<syntaxhighlight lang="bash" >#!/bin/bash file=$1 counter=0

if [ $# -ne 1 ] then echo "$0 fileName" exit 1 fi if [ ! -f $file ] then echo "$file not a file" exit 2 fi

while read line do ((counter++)) EvenNo=$(( counter%2 ))

if [ $EvenNo -eq 0 ] then echo $line >> evenfile else echo $line >> oddfile fi

done < $file</source>


  • Write a shell script to monitor Linux server disk space using a while loop. Send an email alert when percentage of used disk space is >= 90%.

<syntaxhighlight lang="bash" >#!/bin/bash ADMIN="me@somewher.com"

  1. set alert level 90% is default

ALERT=90 df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output; do

 #echo $output
 usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1  )
 partition=$(echo $output | awk '{ print $2 }' )
 if [ $usep -ge $ALERT ]; then
   echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
    mail -s "Alert: Almost out of disk space $usep" $ADMIN
 fi

done</source>


  • Write a shell script to determine if an input number is a palindrome or not. A palindromic number is a number where the digits, with decimal representation usually assumed, are the same read backwards, for example, 58285.

<syntaxhighlight lang="bash" >#!/bin/bash echo -n "Enter number : " read n

  1. store single digit

sd=0

  1. store number in reverse order

rev=""

  1. store original number

on=$n

while [ $n -gt 0 ] do

   sd=$(( $n % 10 )) # get Remainder
   n=$(( $n / 10 ))  # get next digit
   # store previous number and current digit in reverse
   rev=$( echo ${rev}${sd} )

done

if [ $on -eq $rev ]; then

 echo "Number is palindrome"

else

 echo "Number is NOT palindrome"

fi</source>


  • Write a shell program to read a number *such as 123) and find the sum of digits (1+2+3=6).

<syntaxhighlight lang="bash" >#!/bin/bash

  1. store the no

num=$1

  1. store the value of sum

sum=0

if [ $# -ne 1 ] then echo "$0 number" exit 1 fi

while [ $num -gt 0 ] do digit=$(( num%10 )) num=$(( num/10 )) sum=$(( digit+sum )) done

echo "Sum of digits = $sum"</source>


  • Write a shell program to read a number and display reverse the number. For example, 123 should be printed as as 321.

<syntaxhighlight lang="bash" >#!/bin/bash

  1. store the no

num=$1

  1. store the reverse number

rev=0

if [ $# -ne 1 ] then echo "$0 number" exit 1 fi

while [ $num -gt 0 ] do digit=$(( num%10 )) num=$(( num/10 )) rev=$(( digit + rev*10 )) done

echo "Reverse of number = $rev"</source>


  • Write the shell program which produces a report from the output of ls -l in the following format:
file1
file2
[DIR] test/
Total regular files : 7
Total directories : 4
Total symbolic links : 0
Total size of regular files : 2940

<syntaxhighlight lang="bash" >#!/bin/bash

  1. copying the out of ls -l command to a file

ls -l > /tmp/tmp.tmp

  1. initilizing values

sum=0 dir=0 file=0 link=0

  1. reading the file

while read line do #getting the first character of each line to check the type of file read -n 1 c <<< $line

#checking if the file is a directory or not if [ $c == "d" ] then ((dir++)) echo "[DIR] ${line}/" | cut -d" " --fields="1 9" >> /tmp/dir.tmp

elif [ $c == "-" ] #true if the file is a regular file then ((file++)) echo $line | cut -d" " -f8 >> /tmp/file.tmp

elif [ $c == "l" ] #true if the file is a symbolic link then ((link++)) fi

size=$( echo $line | cut -d" " -f5 ) #getting the size of the file sum=$(( sum+size )) #adding the size of all the files done < /tmp/tmp.tmp

cat /tmp/file.tmp #output the name of all the files cat /tmp/dir.tmp #output the name of all the directory

echo "Total regular files = $file" echo "Total directories = $dir" echo "Total symbolic links = $link" echo "Total size of regular file = $size"

  1. removing the temporary files

rm /tmp/file.tmp rm /tmp/dir.tmp rm /tmp/tmp.tmp </source>


  • Write a shell script that will count the number of files in each of your sub-directories using the for loop.

<syntaxhighlight lang="bash" >#!/bin/bash

START=$HOME

  1. change your directory to command line if passed
  2. otherwise use home directory

[ $# -eq 1 ] && START=$1

if [ ! -d $START ] then echo "$START not a directory!" exit 1 fi

  1. use find command to get all subdirs name in DIRS variable

DIRS=$(find "$START" -type d)

  1. loop thought each dir to get the number of files in each of subdir

for d in $DIRS do

  [ "$d" != "." -a "$d" != ".." ] &&  echo "$d dirctory has $(ls -l $d | wc -l) files" 

done</source>


  • Write a shell script that accepts two directory names as arguments and deletes those files in the first directory which are similarly named in the second directory.

<syntaxhighlight lang="bash" >#!/bin/bash

SRC="$1" DST="$2" if [ $# -ne 2 ] then

       echo "$(basename $0) dir1 dir2"
       exit 1

fi

if [ ! -d $SRC ] then

       echo "Directory $SRC does not exists!"
       exit 2

fi

if [ ! -d $DST ] then

       echo "Directory $DST does not exists!"
       exit 2

fi

for f in $DST/* do

  1. echo Processing $f
       if [ -f $f ]
       then
               tFile="$SRC/$(basename $f)"
               if [ -f $tFile ]
               then
                       echo -n "Deleting $tFile..."
                       /bin/rm $tFile
                       [ $? -eq 0 ] && echo "done" || echo "failed"

               fi
       fi

done</source>


  • Write a shell script to search for no password entries in /etc/passwd and lock all accounts.

<syntaxhighlight lang="bash" >#!/bin/bash

  1. Shell script for search for no password entries and lock all accounts
  2. Set your email

ADMINEMAIL="admin@somewhere.com"

      1. Do not change anything below ###
  1. LOG File

LOG="/root/nopassword.lock.log" STATUS=0 TMPFILE="/tmp/null.mail.$$"

echo "-------------------------------------------------------" >>$LOG echo "Host: $(hostname), Run date: $(date)" >> $LOG echo "-------------------------------------------------------" >>$LOG

  1. get all user names

USERS="$(cut -d: -f 1 /etc/passwd)"

  1. display message

echo "Searching for null password..." for u in $USERS do

 # find out if password is set or not (null password)
  passwd -S $u | grep -Ew "NP" >/dev/null
  if [ $? -eq 0 ]; then # if so
    echo "$u" >> $LOG
    passwd -l $u #lock account
    STATUS=1  #update status so that we can send an email
  fi

done echo "========================================================" >>$LOG if [ $STATUS -eq 1 ]; then

  echo "Please see $LOG file and all account with no password are locked!" >$TMPFILE
  echo "-- $(basename $0) script" >>$TMPFILE
  mail -s "Account with no password found and locked" "$ADMINEMAIL" < $TMPFILE
  1. rm -f $TMPFILE

fi</source>


  • Write a shell program to read two numbers and display all the odd numbers between those two numbers.

<syntaxhighlight lang="bash" >#!/bin/bash

  1. Shell program to read two numbers and display all the odd

echo -n "Enter first number : " read n1

echo -n "Enter second number : " read n2

if [ $n2 -gt $n1 ]; then

 for(( i=$n1; i<=$n2; i++ ))
 do
   # see if it is odd or even number
   test=$(( $i % 2 ))
   if [ $test -ne 0 ];
   then
     echo $i
   fi
 done

else

 echo "$n2 must be greater than $n1, try again..."

fi</source>


← Chapter 5 ChallengesHomeChapter 6: Shell Redirection →