Difference between revisions of "Chapter 5 answers"
Jump to navigation
Jump to search
m (Text replacement - "</source>" to "</syntaxhighlight>") |
|||
(3 intermediate revisions by 2 users not shown) | |||
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. | ||
− | < | + | <syntaxhighlight lang="bash" ></syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
file=$1 | file=$1 | ||
v=0 | v=0 | ||
Line 44: | Line 44: | ||
echo "Characters : $(cat $file | wc -c)" | echo "Characters : $(cat $file | wc -c)" | ||
echo "Blank lines : $(grep -c '^$' $file)" | echo "Blank lines : $(grep -c '^$' $file)" | ||
− | echo "Lines : $(cat $file|wc -l )"</ | + | echo "Lines : $(cat $file|wc -l )"</syntaxhighlight> |
---- | ---- | ||
* 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'. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
file=$1 | file=$1 | ||
a=0 | a=0 | ||
Line 74: | Line 74: | ||
done < $file | done < $file | ||
− | echo "articles : $a"</ | + | echo "articles : $a"</syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
file=$1 | file=$1 | ||
counter=0 | counter=0 | ||
Line 106: | Line 106: | ||
fi | fi | ||
− | done < $file</ | + | done < $file</syntaxhighlight> |
---- | ---- | ||
* 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%. | ||
− | < | + | <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 124: | Line 124: | ||
mail -s "Alert: Almost out of disk space $usep" $ADMIN | mail -s "Alert: Almost out of disk space $usep" $ADMIN | ||
fi | fi | ||
− | done</ | + | done</syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
echo -n "Enter number : " | echo -n "Enter number : " | ||
read n | read n | ||
Line 155: | Line 155: | ||
else | else | ||
echo "Number is NOT palindrome" | echo "Number is NOT palindrome" | ||
− | fi</ | + | fi</syntaxhighlight> |
---- | ---- | ||
* 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). | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
#store the no | #store the no | ||
Line 181: | Line 181: | ||
done | done | ||
− | echo "Sum of digits = $sum"</ | + | echo "Sum of digits = $sum"</syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
#store the no | #store the no | ||
Line 207: | Line 207: | ||
done | done | ||
− | echo "Reverse of number = $rev"</ | + | echo "Reverse of number = $rev"</syntaxhighlight> |
---- | ---- | ||
− | * Write the shell program which produces a report from the output of ls -l in the following format | + | * Write the shell program which produces a report from the output of ls -l in the following format: |
<pre>file1 | <pre>file1 | ||
file2 | file2 | ||
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> | ||
− | < | + | <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 268: | Line 268: | ||
rm /tmp/dir.tmp | rm /tmp/dir.tmp | ||
rm /tmp/tmp.tmp | rm /tmp/tmp.tmp | ||
− | </ | + | </syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
START=$HOME | START=$HOME | ||
Line 294: | Line 294: | ||
do | do | ||
[ "$d" != "." -a "$d" != ".." ] && echo "$d dirctory has $(ls -l $d | wc -l) files" | [ "$d" != "." -a "$d" != ".." ] && echo "$d dirctory has $(ls -l $d | wc -l) files" | ||
− | done</ | + | done</syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
SRC="$1" | SRC="$1" | ||
Line 335: | Line 335: | ||
fi | fi | ||
fi | fi | ||
− | done</ | + | done</syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <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 376: | Line 376: | ||
mail -s "Account with no password found and locked" "$ADMINEMAIL" < $TMPFILE | mail -s "Account with no password found and locked" "$ADMINEMAIL" < $TMPFILE | ||
# rm -f $TMPFILE | # rm -f $TMPFILE | ||
− | fi</ | + | fi</syntaxhighlight> |
---- | ---- | ||
* 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. | ||
− | < | + | <syntaxhighlight lang="bash" >#!/bin/bash |
+ | # 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</syntaxhighlight> | ||
---- | ---- |
Latest revision as of 22:50, 29 March 2016
← Chapter 5 Challenges • Home • Chapter 6: Shell Redirection →
- Decide whether the following sentence is true or false:
- False
- False
- False
- False
- True
- True
- True
- Write a menu driven script using the select statement to print calories for food items such as pizza, burger, Salad, Pasta etc.
- Write a shell script that, given a file name as the argument will count vowels, blank spaces, characters, number of line and symbols.
#!/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" == "a" || "$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 )"
- Write a shell script that, given a file name as the argument will count English language articles such As 'A', 'An' and 'The'.
#!/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 == "a" || $word == "an" || $word == "the" ]] && ((a++))
done
done < $file
echo "articles : $a"
- 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.
#!/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
- 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%.
#!/bin/bash
ADMIN="me@somewher.com"
# 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
- 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.
#!/bin/bash
echo -n "Enter number : "
read n
# store single digit
sd=0
# store number in reverse order
rev=""
# 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
- Write a shell program to read a number *such as 123) and find the sum of digits (1+2+3=6).
#!/bin/bash
#store the no
num=$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"
- Write a shell program to read a number and display reverse the number. For example, 123 should be printed as as 321.
#!/bin/bash
#store the no
num=$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"
- 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
#!/bin/bash
#copying the out of ls -l command to a file
ls -l > /tmp/tmp.tmp
#initilizing values
sum=0
dir=0
file=0
link=0
#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"
#removing the temporary files
rm /tmp/file.tmp
rm /tmp/dir.tmp
rm /tmp/tmp.tmp
- Write a shell script that will count the number of files in each of your sub-directories using the for loop.
#!/bin/bash
START=$HOME
# change your directory to command line if passed
# otherwise use home directory
[ $# -eq 1 ] && START=$1
if [ ! -d $START ]
then
echo "$START not a directory!"
exit 1
fi
# use find command to get all subdirs name in DIRS variable
DIRS=$(find "$START" -type d)
# 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
- 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.
#!/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
#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
- Write a shell script to search for no password entries in /etc/passwd and lock all accounts.
#!/bin/bash
# Shell script for search for no password entries and lock all accounts
# Set your email
ADMINEMAIL="admin@somewhere.com"
### Do not change anything below ###
#LOG File
LOG="/root/nopassword.lock.log"
STATUS=0
TMPFILE="/tmp/null.mail.$$"
echo "-------------------------------------------------------" >>$LOG
echo "Host: $(hostname), Run date: $(date)" >> $LOG
echo "-------------------------------------------------------" >>$LOG
# get all user names
USERS="$(cut -d: -f 1 /etc/passwd)"
# 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
# rm -f $TMPFILE
fi
- Write a shell program to read two numbers and display all the odd numbers between those two numbers.
#!/bin/bash
# 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
← Chapter 5 Challenges • Home • Chapter 6: Shell Redirection →