Operating System‎ > ‎Linux‎ > ‎Linux Shell Script‎ > ‎

Lab 9-10 Shell Script Assignment and Solution


Lab 9-10 Shell Script Requirement

Lab9-10 Script Requirement

Lab 9-10 Shell Script Solution

** Module 9 - Script in Korn Shell **

#!/bin/ksh
# Name: ABC, Lab9
# Module 9

# 1. Accept exactly 1 command line argument, or print a Usage message and exit with error code 1
if (( $# != 1 ))
then
echo "Incorrect argument - Usage: ./lab9 testDirectory"
exit 1
fi

dirName=$1
absdirName=`readlink -f "$dirName"`
#echo "Given directory path as an argument" $dirName
#echo "Absolute path of entered directory" $absdirName # readlink provides absolute path
##############################
# Function 1: 2. Call a function that checks for a valid directory. A valid directory is a user’s home directory or any of its subdirectories, so here are all the conditions to check: o it must be a directory o it must be a user’s home directory or any of the subdirectories below  - When either of these conditions is not met, print a separate error message and exit with error code 1
validDirectory( )
{
if [ ! -e "$dirName" ]
then
echo "Directory does not exist"
exit 1
fi
if [ ! -d "$dirName" ]
then
echo "Invalid Directory"
exit 1
fi

typeset validDir1="/home/student/"`whoami` # typeset  -- local variable --> local keyword in bash
typeset validDir2="/home/staff/"`whoami`
#echo "Dir1: " $validDir1 " Dir2: " $validDir2
#For this lab, a user’s home directory is in either /home/student/ or /home/staff/. The user may not always enter an absolute path (such as /home/etc), and instead enters a relative path (such as module9 or ../..). You must be able to catch the case when the user is at the home directory, but entered .. ,   which means the given directory is above the home directory and is an error. On the other hand, if the user is at the home directory and enters . (for the current directory), then it is a valid directory.
if [ `echo "$absdirName" | grep -c "$validDir1"` -gt 0 ] # make grep output quite (no message) and silent (no error display) 
then
echo -n "" #echo "Valid directory - Student"
elif [ `echo "$absdirName" | grep -c "$validDir2"` -gt 0 ]
then
echo -n "" #echo "Valid directory - Staff"
else
echo "can only search at your home directory"
exit 1
fi
}
##############################
# Function 2: Print Result
printResult( )
{
echo "Found " $bashFilesIndex " bash script files in " $dirName
trap '' INT # ignore control-c

typeset tmpcounter=0
for bashFile in ${bashFiles[@]}
do
(( tmpcounter=tmpcounter+1 ))
echo $bashFile
if (( $tmpcounter==5 ))
then
sleep 3
tmpcounter=0
fi
done
trap - INT # signal handling is reset to default   --> syntax for ksh shell is different than bash shell
}
##############################
# Main Function #
validDirectory # Function 1 Call

typeset bashFilesIndex=0
allFiles=`find "$dirName" -type f`
#echo ${allFiles[@]}
for file in ${allFiles[@]}
do
line1=`head -1 "$file"`
#echo "File: " $file "Line1: " $line1
if [[ ! -z $line1 ]]
then
if [[ $line1 == "#!/bin/bash" ]]
then
#echo "Match: " $line1
bashFiles[$bashFilesIndex]=$file
(( bashFilesIndex=$bashFilesIndex+1 ))
fi
fi
done
#echo ${bashFiles[@]}

printResult # Function 2 call to display result

##############################



** Module 10 - Script in C Shell **

#!/bin/tcsh
# Name: ABC, Lab10
# Module 10

# 1. Accept exactly 1 command line argument, or print a Usage message and exit with error code 1
if (( $# != 1 )) then
echo "Incorrect argument - Usage: ./lab10 testDirectory"
exit 1
endif

set dirName = "$1"
set absdirName = `readlink -f "$dirName"`
#echo "Given directory path as an argument" $dirName
#echo "Absolute path of entered directory" $absdirName # readlink provides absolute path

##############################
# Main Function #
# validDirectory # Function 1 Call
##############################
# Copied Function 1 into main for tcsh and modified: 2. Call a function that checks for a valid directory. A valid directory is a user’s home directory or any of its subdirectories, so here are all the conditions to check: o it must be a directory o it must be a user’s home directory or any of the subdirectories below  - When either of these conditions is not met, print a separate error message and exit with error code 1

if ( ! -e "$dirName" ) then
echo "Directory does not exist"
exit 1
endif

if ( ! -d "$dirName" ) then
echo "Invalid Directory"
exit 1
endif

set validDir1="/home/student/"`whoami` # typeset  -- local variable --> local keyword in bash
set validDir2="/home/staff/"`whoami`
#echo "Dir1: " $validDir1 " Dir2: " $validDir2
#For this lab, a user’s home directory is in either /home/student/ or /home/staff/. The user may not always enter an absolute path (such as /home/etc), and instead enters a relative path (such as module9 or ../..). You must be able to catch the case when the user is at the home directory, but entered .. ,   which means the given directory is above the home directory and is an error. On the other hand, if the user is at the home directory and enters . (for the current directory), then it is a valid directory.
if { ( echo "$absdirName" | grep -c "$validDir1" > /dev/null ) } then # make grep output quite (no message) and silent (no error display) 
echo -n "" #echo "Valid directory - Student"
else if { ( echo "$absdirName" | grep -c "$validDir2" > /dev/null ) } then
echo -n "" #echo "Valid directory - Staff"
else
echo "can only search at your home directory"
exit 1
endif

##############################

@ bashFilesIndex = 0
set allFiles = `find "$dirName" -type f`
set bashFiles = 
#echo ${allFiles[*]} # instead of @ changed to * (list) for tcsh

foreach tmpfile ($allFiles) # changed from for to foreach .. end instead of no do...done
set line1 = `head -1 "$tmpfile"`
#echo "File: " $tmpfile "Line1: " $line1
# echo $?line1 # check varible is set or not
if ( ${%line1} != 0 ) then # if ( ! -z "$line1" ) then
if ( "$line1" == "#\!/bin/bash" ) then
#echo "Match: " $line1
@ bashFilesIndex = $bashFilesIndex + 1
#set bashFiles[$bashFilesIndex]=$tmpfile
set bashFiles = ( $bashFiles $tmpfile )
endif
endif
end
#echo ${bashFiles[*]} # instead of @ changed to * (list) for tcsh

##############################
# Copied Function 2: Print Result here for tcsh script
echo "Found " $bashFilesIndex " bash script files in " $dirName
onintr - #trap '' INT # ignore control-c

@ tmpcounter = 0
foreach bashFile ($bashFiles) #for bashFile in ${bashFiles[@]}
@ tmpcounter = $tmpcounter + 1
echo $bashFile
if ( $tmpcounter == 5 ) then
sleep 3
@ tmpcounter = 0
endif
end
onintr #trap - INT # signal handling is reset to default   --> syntax for ksh shell is different than bash shell

##############################



Comments