scripting languages and c-shell. what is a scripting language ? script is a sequence of commands...
Post on 22-Dec-2015
217 views
TRANSCRIPT
Scripting Languages and C-Shell
What is a scripting language ?
• Script is a sequence of commands written as plain text and run by an interpreter (shell).
• Today – some scripting languages have evolved into lightweight programming languages.
• Used for lightweight operations such as manipulation of files and prototyping.
• Examples:
– Shell scripts– Perl – Javascript
C-Shell
• Unix systems come with a variety of shells, e.g. Bourne (sh), Bash (bash), C (csh), TC (tcsh).
• Find your shell: echo $SHELL• C shell startup files: .login, .cshrc• Has C-like syntax
Some Shell Metacharacters
• # - commnet• “ – quote multiple characters but allow substitution• $ - dereference a shell variable• & - execute in background• ‘ – quote multiple characters• * - match zero or more characters• ? – match a single character• [] – insert wild cards: [0-3,5]• ; - separate commands• ! – refer to event in the history list: !!,!4• ` - substitute a command• % - refer to a job: %3
Some useful c-shell commands• head / tail – returns first / last lines of a file• echo – print command• sort – used to sort strings in lexicographical order• cat – concatenate files and print • grep – find regular expressions in files• find – find files by criteria• wc – word count on files• diff - find differences between files• basename / dirname – extract file / directory name
from full path• touch – change file timestamp• mail – sending mail • cp/mv – copy/move files
Redirection and pipes prog redirection file
• > : redirect stdout• >> : append stdout• >& : redirect stdout and stderr• >>& : append stdout and stderr• < : redirect stdin
prog1 pipe prog2
• | : redirect stdout of prog1 to stdin of prog2• |& : same, with stdout and stderr
Some environment variables
• home – name of home directory• path – search path• prompt – shell prompt• cwd – current working directory• term – type of terminal• history – length of history recorded
How to write a c-shell script
• Edit the code file (no mandatory extension)
• Make sure the first line in the file is:#!/bin/csh –f
• Add executable permission:chmod +x filename
#!/bin/csh –f
#################hello worlds #################
echo Hello world
C-Shell Syntax
Defining/changing shell variables
• Variables local to current shell:– String: set var1[=strval1]…varN[=strvalN]– Numeric: @ var1[=numval1]…varN[=numvalN]
• Global variables:– setenv var [strval] – set and export
• $var or ${var} – access value of var
Examples:• set name = Alon #string var.• set name = $< #input from user• @ a = 0 #numeric var.• set dir = `pwd` #command substitution
Array variables
• Available for integers and strings• Indexed starting from 1!!!• Declaration: set name = (array elements)• $#name – number of elements in array• $name[i] – access the ith element• $name[i-j] – elements i to j.
Examples:• set students = (David Ron Idit)• set fib = (0 1 1 2 3)• set fib = ($fib 5) #append• set size = $#fib #size==6
Passing arguments to scripts
• $argv[1]…$argv[9] are assigned the command line arguments
• $#argv or $# - total number of arguments• $argv[*] or $* - values of all arguments• $argv[0] or $0 – name of script• shift [variable_name] – in case there are
more than 9 arguments – shifts words one position to the left in variable (argv is the default).
#!/bin/csh –f
#################simple_example #################
# string variable set course = soft1echo $course
# array
set names = ( Danny Dina Eyal Ayelet Ori Neta )echo $namesecho $#names # size of arrayecho $names[2] # the second elementecho $names[2-] # starting from the second elementecho $names[-2] # until the second elementecho $names[2-3] # elements 2,3
# numeric variables and expression evaluation
@ num = 17echo $num@ num -= 3echo $num@ num *= 14echo $num
# if we want to assign the value of a command to a variable
set chars = `wc -l ./simple_example`echo $chars
# accessing program parameters
echo The program name is : $0, the first parameter is $1 and the second is $2echo The number of parameters \(not including program name\) is $#argv
Loops
• foreach identifier (set)
. . .
end
• while (expression)
. . .
end• Expression can include the usual C operators.• break, continue – as in C.
Conditional statements
• if (expression) command
• if (expression) then
then-command-list
[else if (expression) then
then-command-list
. . .
else
else-command-list]
endif
• switch (value)case
value1:breaksw. . .default:
endsw
Testing files attributes
• if (-op file_name) then…
-r : read access-w : write access-x : execute access
-e : existence -o : ownership
-f : plain (non-dir.) file-d : directory -l : link
#!/bin/csh –f
######### sum #########
if ($#argv == 0) thenecho Usage: $0 num1 [num2 num3 ...]exit 1
endif
@ sum = 0foreach number ($argv)
@ sum += $numberend
echo The sum is : $sum
@ average = $sum / $#argv@ remainder = $sum % $#argvecho The avergae is: $average\($remainder\)
#!/bin/csh -f
############# sort_files #############
if ($#argv == 0) thenecho USAGE: $0 file_names_to_sortecho This command writes on the original files \!\!\!exit 1
endif
foreach file($argv)sort $file > $file.tmpmv $file.tmp $file
end
#!/bin/csh -f
# Biggest_file# INPUT: Directory name# OUTPUT: The file with the biggest number of characters in the given directory
if ($#argv == 0) thenecho USAGE: $0 directory_nameexit 1
endif
if (-d $1) then@ max = 0foreach file($1/*)
if (-r $file && -f $file) thenset wc_out = `wc -c $file`if ($wc_out[1] > $max) then
set biggest_file = $wc_out[2] @ max = $wc_out[1]
endifelse if (!(-r $file)) then
echo $file unreadable endifendecho The biggest file is $biggest_fileecho The number of characters is $max
elseecho $1 is not a directory
endif
#!/bin/csh -f
# Modulo3# INPUT: sequence of integer numbers separated by \n terminated by 0# OUTPUT: prints the value of each number modulo 3
set num = $<
while ($num != 0)
@ modulo = $num % 3
switch ($modulo)case 0:
echo 0breaksw
case 1:echo 1breaksw
case 2:echo 2breaksw
default:endsw
set num = $<end
Retrieving returned values• Returned values (by return, exit) are
stored in status environment variable
• The script:
#!/bin/csh -f
./progif ($status != 0) then
echo "Error occured!"endif
runs prog (from current dir) and reports
whether an error occurred.
awk/gawk
• Useful utility for file manipulation• Processes input line by line. • Example: gawk ‘{print $1}’ input
• For details see :
http://www.gnu.org/software/gawk/manual/
#!/usr/bin/gawk -f
BEGIN { stud_num = total = high_stud_num = total_high = 0}
{ if (NF != 3) {
print "error in line", FNR, ":", $0 next }++stud_numtotal += $3if ($3 > 80) {
total_high += $3 ++high_stud_num
}}
END { print "Number of students: ", stud_num print "Avergae grade is: ", total / stud_num print "Average of high grades is: ", total_high / high_stud_num}
Running with input :
Ron 033453671 91
Yael 034567832 73
Ran 040478124 100
Yoav 060381253 95
Tal 045623141 78 90
Output is :
error in line 5 : Tal 045623141 78 90
Number of students: 4
Avergae grade is: 89.75
Average of high grades is: 95.3333