Unix - Pages 128 - 155 Shell Scripts 1) This script will beep twice when invoked. internet% cat beep #!/bin/csh -f ################################################ # This script beeps twice at our terminal ################################################ echo -n '^G' sleep 1 echo -n '^G' 2) this script prints the lines of a file that exceds 80 characters. internet% cat longlines #!/bin/csh -f ################################################ # Print lines bigger than 80 characters # Usage: longlines < file ################################################ awk "length > 80" 3) This script showed the number of files and directories in the current directory internet% cat numfiles #!/bin/csh -f ################################################ # Count number of files and directories in current directory # Usage: numfiles ################################################ echo -n "files and directories: " ls | wc -l internet% numfiles files and directories: 31 4) This script showed the number of files and directories in the directory passed as parameter internet% cat numfiles #!/bin/csh -f ################################################ # Count number of files and directories in the directory # specified as parameter # Usage: numfiles directory ################################################ echo -n Number of files/directories in $argv[1]\. ls $argv[1] | wc -l internet% numfiles . Number of files/directories in .. 31 internet% numfiles ~ Number of files/directories in /home2/stud-30/spantaro. 14 internet% numfiles ~/cis316 Number of files/directories in /home2/stud-30/spantaro/cis316. 21 5) This script moved cursor to ~/cis316 directory and listed all the lines of the files ended in "sql" that had the word create. internet% cat searcher #!/bin/csh -f ########################################### # Search directory for pattern in all # files (argument 3 - last) # Usage: searcher directory pattern file(s) ########################################### cd $argv[1] # change directory to argument 1 grep -n "$argv[2]" $argv[3-$#argv] | more internet% searcher ~/cis316 create "*.sql" ctCustomer.sql:3:create table Customer ( ctOrderLines.sql:3:create table OrderLines ( ctOrders.sql:3:create table Orders ( ctProduct.sql:3:create table Product ( ctSequences.sql:6:create sequence ProductIDSeq increment by 1 start with 1; ctSequences.sql:7:create sequence ShippingMethodIDSeq increment by 1 start with 1; ctSequences.sql:8:create sequence ShippingAddressIDSeq increment by 1 start with 1; ctSequences.sql:9:create sequence CustomerIDSeq increment by 1 start with 1; ctSequences.sql:10:create sequence OrdersIDSeq increment by 1 start with 1; ctShippingAddress.sql:3:create table ShippingAddress ( ctShippingMethod.sql:3:create table ShippingMethod ( makeDB.sql:3:@createAll internet% internet% searcher ~/cis316 create ctCustomer.sql ctProduct.sql ctCustomer.sql:3:create table Customer ( ctProduct.sql:3:create table Product ( internet% 6) Checked and Listed lines in a C program that contained hex number. The value of $status is zero because the search was successful. internet% cat hexnum #!/bin/csh -f #################################################### # List lines in a C program that contain hex number # Usage: hexnum file #################################################### grep "0[xX][0-9a-fA-F]*" $argv[1] internet% hexnum Cfile fkjhgd 0x kjhkjdfhjkgd hsgfsjh adshgsfj 0xa internet% echo $status 0 internet% 7) Checked and Listed lines in a C program that contained hex number. The value of $status is two because the file passed as parameter does not exist. The 'test' command checks for the file and exit with 2 as $status. internet% cat hexnum #!/bin/csh -f #################################################### # List lines in a Cprogram that contain hex number # Usage: hexnum file #################################################### test -r $argv[1] || exit 2 grep "0[xX][0-9a-fA-F][0-9a-fA-F]*" $argv[1] internet% hexnum blablabla internet% echo $status 2 internet% 8) Checked and Listed lines in a C program that contained hex number. The value of $status is two because the file passed as parameter does not exist. The 'test' command checks for the file and exit with 2 as $status. before exiting it echoes a message to the user saying that file was not found. internet% cat hexnum #!/bin/csh -f #################################################### # List lines in a C program that contain hex number # Check for file name and exit in case file does # not exist. Set the status = 2 in case of error # Usage: hexnum file #################################################### test -r $argv[1] || (echo "can't read argV[1]."; exit 2) grep "0[xX][0-9a-fA-F][0-9a-fA-F]*" $argv[1] internet% hexnum somefile can't read argV[1]. grep: can't open somefile internet% echo $status 2 internet% 9) Checked and Listed lines in a C program that contained hex number. The value of $status is two because the file passed as parameter does not exist. The 'test' command checks for the file and exit with 2 as $status. before exiting it saves a message into a log file saying that the file was not found. internet% hexnum blabla >> hexlog grep: can't open blabla internet% echo $status 2 internet% cat hexlog can't read blabla. internet% 10) Checks to see if a user is logged in, and if not it invokes the mail program. internet% cat wmail #!/bin/csh -f #################################################### # csh script to send mail or converse with a user # Usage: wmail username #################################################### set w = (`who | grep $argv[1]`) if ($#w == 0) then echo "$argv[1] is not logged in...send mail" mail $argv[1] endif internet% wmail mbennani mbennani is not logged in...send mail Hi Mehdi, this is just to test my wmail shell script bye sio 11) Added feature to talk to the code above internet% cat wmail #!/bin/csh -f #################################################### # csh script to send mail or converse with a user # Usage: wmail username #################################################### set w = (`who | grep $argv[1]`) if ($#w == 0) then echo "$argv[1] is not logged in...send mail" mail $argv[1] else echo "$argv[1] logged in...let's talk" write $argv[1] endif internet% who mharriso pts/0 Jul 16 21:30 (ACA7DC6C.ipt.aol.com) spantaro pts/2 Jul 16 22:29 (12.47.49.130) internet% wmail mharriso mharriso logged in...let's talk hi Write failed (mharriso logged out?) internet% who spantaro pts/2 Jul 16 22:29 (12.47.49.130) internet% 12) When trying to check in how many terminals the user was logged in, I got the following error. internet% cat wmail #!/bin/csh -f #################################################### # csh script to send mail or converse with a user # Usage: wmail username #################################################### set w = (`who | grep $argv[1]`) if ($#w == 0) then echo "$argv[1] is not logged in...send mail" mail $argv[1] else if ($#w == 5) then echo "$argv[1] logged in...let's talk" write $argv[1] else echo "$argv[1] logged in on ports $w[2] and $w[7]" endif internet% who ktakahas pts/0 Jul 16 23:25 (63-93-100-131.oak.dial.netzero.com) spantaro pts/2 Jul 16 22:29 (12.47.49.130) internet% wmail ktakahas Subscript out of range internet% 13) Now the script searcher also checks to see if the user informed all the parameters necessary to execute the code. internet% cat searcher #!/bin/csh -f ########################################### # Search directory for pattern in all # files (argument 3 - last) # Usage: searcher directory pattern file(s) ########################################### if ($#argv < 3) then # less than 3 args? echo "Usage: searcher directory pattern file(s)" exit 1 endif cd $argv[1] # change directory to argument 1 grep -n "$argv[2]" $argv[3-$#argv] | more internet% searcher ~/cis316 Usage: searcher directory pattern file(s) internet% 14) Script longlines works with arguments or no arguments. In case of no arguments it reads from the standard input. internet% cat longlines internet% cat longlines #!/bin/csh -f ################################################## # Print lines bigger than 80 characters # Usage: longlines [file] ################################################## if ($#argv == 0) then # no arguments awk "length > 80" # read from standard output else echo $argv[1]\: awk "length > 80" $argv[1] #use filename passed in $argv[1] endif internet% cat testlonglines | longlines jfhgjfhdkgjdhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffuytiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo jhgkfdglkjfdljgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggg internet% longlines testlonglines testlonglines: jfhgjfhdkgjdhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffuytiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo jhgkfdglkjfdljgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggg internet% 15) Script numfiles now counts number of files and directories in current directory or first argument specified as parameter internet% cat numfiles #!/bin/csh -f ############################################################## # Count number of files and directories in current directory # or first argument specified as parameter # Usage: numfiles [directory] ############################################################## if ($#argv == 0) then set dir = "." else set dir = $argv[1] endif echo -n Number of files/directories in $dir is\: ls $dir | wc -l internet% numfiles Number of files/directories in . is: 37 internet% numfiles ~/cis316 Number of files/directories in /home2/stud-30/spantaro/cis316 is: 21 internet% 16) It was supposed to display hours, minutes, and seconds but I am not sure it worked properly. tval[3] does not seems to be number of seconds at all. internet% cat timer #!/bin/csh -f ########################################### # Display hours, minutes, and seconds # Usage: timer ########################################### set tval = `uptime` # call the uptime program echo "The value of tval is: " $tval @ time = $tval[3] # get the number of seconds echo "The value of time is: " $time @ hrs = $time / 3600 # calculate number of hours echo -n "$hrs hours " @ time = $time % 3600 @ mins = $time / 60 # calculate number of minutes echo -n "$mins minutes " @ secs = $time % 60 # calculate number of seconds echo -n "$secs seconds" echo "" internet% timer The value of tval is: 12:12am up 10 day(s), 13:31, 3 users, load average: 0.02, 0.03, 0.04 The value of time is: 10 0 hours 0 minutes 10 seconds internet% 17) Display hours, minutes, and seconds dropping unnecessary 0s. internet% more timer #!/bin/csh -f ########################################### # Display hours, minutes, and seconds # Usage: timer ########################################### set tval = `uptime` # call the uptime program echo "The value of tval is: " $tval @ time = $tval[3] # get the number of seconds echo "The value of time is: " $time if ($time == 0) then echo timer reset exit endif @ hrs = $time / 3600 # calculate number of hours if ($hrs != 0) then echo -n "$hrs hours " if ($hrs > 1) echo -n "s" endif @ time = $time % 3600 @ mins = $time / 60 # calculate number of minutes if ($mins != 0) then echo -n "$mins minutes " if ($mins > 1) echo -n "s" endif @ secs = $time % 60 # calculate number of seconds if ($secs != 0) then echo -n "$secs seconds" if ($secs > 1) echo -n "s" endif echo "" # print a blank line 18) Script longlines reads from standard input if no argument is passed. If an argument is passed it checks whether it is a plain file. internet% cat longlines #!/bin/csh -f ################################################## # Print lines bigger than 80 characters # Usage: longlines [file] ################################################## if ($#argv == 0) then # no arguments awk "length > 80" # read from standard output exit 0 endif if (-f $argv[1]) then # is argument a plain file? echo $argv[1]\: # yes; display name and call awk "length > 80" $argv[1] # awk with the file name else # argument not a plain file echo $0\: No file $argv[1] # display error message and exit 1 # exit with error status endif internet% internet% longlines japonese longlines: No file japonese internet% longlines xyz longlines: No file xyz internet% longlines < testlonglines jfhgjfhdkgjdhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffuytiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo jhgkfdglkjfdljgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggg internet% longlines testlonglines testlonglines: jfhgjfhdkgjdhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffuytiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo jhgkfdglkjfdljgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg gggggggg 19) Script numfiles now ensures that $dir is a directory before process it. internet% cat numfiles #!/bin/csh -f ############################################################## # Count number of files and directories in current directory # or first argument specified as parameter # Usage: numfiles [directory] ############################################################## if ($#argv == 0) then # no argument passed set dir = "." # use current directory else set dir = $argv[1] endif if (! -d $dir) then # is $dir a directory? echo $0\: $dir not a directory. # no - display error exit 1 # exit with error status endif echo -n Number of files/directories in $dir is\: ls $dir | wc -l # process directory $dir internet% internet% numfiles Number of files/directories in . is: 43 internet% numfiles ~ Number of files/directories in /home2/stud-30/spantaro is: 15 internet% numfiles japonese numfiles: japonese not a directory. internet% 20) This script uses a foreach loop to send invitations to a party. It pipes the text between quotes to command mail followed by a username. internet% cat mailInvitation #!/bin/csh -f foreach username($*) echo "Dear $username, \ You are cordially invited to my party. \ You can not miss it." | mail $username end internet% 21) Got the following error: internet% nfiles if: Expression syntax internet% cat nfiles #!/bin/csh -f ############################################################### # Script to number and format all files in argument list # Usage : nfiles file(s) # Author: Siomara pantarotto # date : July, 24, 2001 ############################################################## if ($#argv ==0) then # arguments passed? echo "Usage: $0 file(s)" # no - display error message exit 1 # and exit endif foreach file ($argv[*]) # expand argument wordlist if (! -z $file) then # file not empty? cat $file | more -h $file # yes; number and format else echo "$file empty." # no - inform the user endif end internet% |