Introduction to Shell Programming



Similar documents
Unix Scripts and Job Scheduling

Tutorial 0A Programming on the command line

Hands-On UNIX Exercise:

Command Line - Part 1

Command Line Crash Course For Unix

Shell Scripts (1) For example: #!/bin/sh If they do not, the user's current shell will be used. Any Unix command can go in a shell script

CS Unix Tools & Scripting Lecture 9 Shell Scripting

CS2720 Practical Software Development

Linux command line. An introduction to the Linux command line for genomics. Susan Fairley

grep, awk and sed three VERY useful command-line utilities Matt Probert, Uni of York grep = global regular expression print

Systems Programming & Scripting

Unix Shell Scripts. Contents. 1 Introduction. Norman Matloff. July 30, Introduction 1. 2 Invoking Shell Scripts 2

HP-UX Essentials and Shell Programming Course Summary

Cygwin command line windows. Get that Linux feeling - on Windows

Syntax: cd <Path> Or cd $<Custom/Standard Top Name>_TOP (In CAPS)

A Crash Course on UNIX

Lab 1: Introduction to C, ASCII ART and the Linux Command Line Environment

Basic C Shell. helpdesk@stat.rice.edu. 11th August 2003

Lecture 4. Regular Expressions grep and sed intro

Open Source Computational Fluid Dynamics

A UNIX/Linux in a nutshell

UNIX, Shell Scripting and Perl Introduction

Introduction to Shell Scripting

Bash shell programming Part II Control statements

SFTP SHELL SCRIPT USER GUIDE

Advanced Bash Scripting. Joshua Malone

Thirty Useful Unix Commands

Birmingham Environment for Academic Research. Introduction to Linux Quick Reference Guide. Research Computing Team V1.0

Lecture 4: Writing shell scripts

An Introduction to the Linux Command Shell For Beginners

ICS 351: Today's plan

Tutorial Guide to the IS Unix Service

AN INTRODUCTION TO UNIX

Unix Sampler. PEOPLE whoami id who

USEFUL UNIX COMMANDS

Fred Hantelmann LINUX. Start-up Guide. A self-contained introduction. With 57 Figures. Springer

University of Toronto

Hadoop Shell Commands

Hadoop Shell Commands

Useless Use of * Slide 1. Useless Use of * Jan Schaumann jschauma@netmeister.org PGP: 136D 027F DC B42 47D6 7C5B 64AF AF22 6A4C

An A-Z Index of the Apple OS X command line (TERMINAL) The tcsh command shell of Darwin (the open source core of OSX)

UNIX Tutorial for Beginners

HDFS File System Shell Guide

Lecture 22 The Shell and Shell Scripting

File System Shell Guide

A Tiny Queuing System for Blast Servers

Extreme computing lab exercises Session one

CLC Server Command Line Tools USER MANUAL

Linux Overview. Local facilities. Linux commands. The vi (gvim) editor

Automating admin tasks using shell scripts and cron Vijay Kumar Adhikari.

Unix Guide. Logo Reproduction. School of Computing & Information Systems. Colours red and black on white backgroun

Introduction to Grid Engine

1001ICT Introduction To Programming Lecture Notes

The Linux Operating System and Linux-Related Issues

RECOVER ( 8 ) Maintenance Procedures RECOVER ( 8 )

netflow-indexer Documentation

Linux Shell Script To Monitor Ftp Server Connection

Lab 1: Introduction to the network lab

Extreme computing lab exercises Session one

Higher National Unit Specification. General information for centres. Multi User Operating Systems. Unit code: DH3A 34

Introduction to the UNIX Operating System and Open Windows Desktop Environment

BASH Scripting. A bash script may consist of nothing but a series of command lines, e.g. The following helloworld.sh script simply does an echo.

TIBCO Fulfillment Provisioning Session Layer for FTP Installation

Chapter 2 Text Processing with the Command Line Interface

Secure Shell Demon setup under Windows XP / Windows Server 2003

Answers to Even- Numbered Exercises

INASP: Effective Network Management Workshops

Beginners Shell Scripting for Batch Jobs

Introduction to Mac OS X

PHP Debugging. Draft: March 19, Christopher Vickery

Agenda. Using HPC Wales 2

PuTTY/Cygwin Tutorial. By Ben Meister Written for CS 23, Winter 2007

Unix the Bare Minimum

pure::variants Transformer for Software Configuration Management Manual

SEO - Access Logs After Excel Fails...

University of Hull Department of Computer Science. Wrestling with Python Week 01 Playing with Python

Lab 1 Beginning C Program

Cisco Networking Academy Program Curriculum Scope & Sequence. Fundamentals of UNIX version 2.0 (July, 2002)

Excel Templates. & Quote/Invoice Maker for ACT! Another efficient and affordable ACT! Add-On by V

Open Source, Incremental Backup for Windows, Step By Step. Tom Scott BarCampLondon2, 17/2/07

Unix Shell Scripting Tutorial Ashley J.S Mills

Setting Up the Site Licenses

Lecture 18 Regular Expressions

Introduction to Running Hadoop on the High Performance Clusters at the Center for Computational Research

STEP 4 : GETTING LIGHTTPD TO WORK ON YOUR SEAGATE GOFLEX SATELLITE

CPSC 2800 Linux Hands-on Lab #7 on Linux Utilities. Project 7-1

1.1 AppleScript Basics

HOW TO USE THIS DOCUMENT READ OBEY

awk A UNIX tool to manipulate and generate formatted data

NLP Programming Tutorial 0 - Programming Basics

AmbrosiaMQ-MuleSource ESB Integration

Defeating Firewalls : Sneaking Into Office Computers From Home

Linux Syslog Messages in IBM Director

How Do I Recover infiniti Remotes and Line Cards?

Higher National Unit Specification. General information for centres. Unit title: Multi User Operating Systems. Unit code: D76G 34

sqlcmd -S.\SQLEXPRESS -Q "select name from sys.databases"

Training Day : Linux

SSH Connections MACs the MAC XTerm application can be used to create an ssh connection, no utility is needed.

SETTING UP RASPBERRY PI FOR TOPPY FTP ACCESS. (Draft 5)

Hadoop Hands-On Exercises

Transcription:

Introduction to Shell Programming what is shell programming? about cygwin review of basic UNIX TM pipelines of commands about shell scripts some new commands variables parameters and shift command substitution cut if-then-else-fi for-in-do-done sed a final example gotchas exercises references conducted by Mike Kupferschmid Scientific Programming Consultant VCC 322, x6558, kupfem@rpi.edu

What is Shell Programming? putting UNIX TM commands in a file almost always special-purpose code often one-time code seldom used where speed is important often used to manipulate files

About cygwin a good but not perfect emulation of unix included in standard RPI laptop image to download (long) go to www.cygwin.com if you want real unix get Linux (site licensed) it is possible to dual-boot Linux with Windows ask at the Help Desk watch for an ACM installfest starting cygwin start All Programs Cygwin XTerm opens unix window with command prompt $ RCShome is a link to your RCS home directory to print a file from cygwin open the file with notepad filename use the notepad print function to cut and paste you need a 3-button mouse cygwin names executables a.exe

Review of Basic UNIX TM familiar commands often useful in shell scripts cat concatenate files cp copy a file date print the date and time grep scan for a string head show first lines of a file tail show last lines of a file mv move or rename a file rm -f remove files (silently) wc count lines, words, characters wc output format varies between systems path names of files and directories schedule /home/37/jones/schedule wild cards in filenames * matches zero or more characters? matches exactly 1 character redirection > redirects std-out to a file >> appends std-out to a file < redirects std-in from a file relative absolute

Pipelines of Commands send std-out of one command to std-in of another look e shows spelling words that begin with e look e more displays the words one page at a time often use echo to feed a pipeline echo "count me" wc prints 1 2 9 echo * wc -w counts files in current directory

About Shell Scripts type shell program text in a file using an editor: #! /bin/sh # this is a comment body of program to continue a line append \ this is the rest of the continued line chmod +x scriptfile make the file executable not needed in cygwin scriptfile sh -v scriptfile sh -x scriptfile execute the program print input lines as read print commands as executed shell programs often use temporary files in /tmp and send unwanted outputs to /dev/null

Some New Commands Useful in Shell Programs basename cmp -s cut expr mail sed -e sleep tr true, false whoami head -1 extract file name from path name compare files (silently) extract selected parts of a line evaluate an expression send email (not in cygwin) stream editor suspend execution for given time translate characters provide truth values print current username read a line from the keyboard

Some Example Scripts In the following examples, the text of the shell script is shown on top, and the result of executing it interactively is shown below. The text of each example script is in a file available for downloading, so that you can try the scripts withouthavingtotypethemin.thenameof each file is given in a comment in each script. These examples show the scripts being executed in the directory /home/mike/classes/shell. When you run a script in your own directory, some of the names appearing in the output will be different.

#!/bin/sh # hi echo "Hello, world!" unix[1] hi Hello, world! unix[2]

#!/bin/sh # himike name=mike echo "Hello, $name!" unix[3] himike Hello, Mike! unix[4]

#!/bin/sh # rem rm junk echo "The return code from rm was $?" unix[5] touch junk unix[6] rem The return code from rm was 0 unix[7] rem rm: junk: No such file or directory The return code from rm was 2

#!/bin/sh # quiet rm junk 2> /dev/null echo "The return code from rm was $?" unix[8] touch junk unix[9] quiet The return code from rm was 0 unix[10] quiet The return code from rm was 2

#!/bin/sh # pars echo "There are $# parameters." echo "The parameters are $@" echo "The script name is $0" echo "The first parameter is $1" echo "The second parameter is $2" unix[11] pars apple orange There are 2 parameters. The parameters are apple orange The script name is./pars The first parameter is apple The second parameter is orange unix[12]

#!/bin/sh # shifter echo $1 shift echo $1 shift echo $1 shift echo $1

unix[13] shifter one two three four five one two three four unix[14] shifter one two three one two three unix[15] shifter one two one two shift: shift count must be <= $# unix[16]

#!/bin/sh # sorter rm -f /tmp/sorted sort $1 > /tmp/sorted cp /tmp/sorted $1 rm -f /tmp/sorted

unix[17] more names Jeff Alan Nancy Yossl Scott Harriet Chris unix[18] sorter names unix[19] more names Alan Chris Harriet Jeff Nancy Scott Yossl unix[20]

#!/bin/sh # hiyou name= whoami echo "Hello, $name!" unix[21] hiyou Hello, kupfem! unix[22]

#!/bin/sh # hiyou2 echo "Hello, whoami!" unix[23] hiyou2 Hello, kupfem! unix[24]

#!/bin/sh # countem echo "File \"$1\" contains \ exactly wc $1 cut -c6-7 lines." unix[25] countem text File "text" contains exactly 21 lines. unix[26]

cut reads std-in, extracts selected fields, writes std-out cut -c1,4,7 characters 1, 4, and 7 cut -c1-3,8 characters 1 thru 3, and 8 cut -c-5,10 characters 1 thru 5, and 10 cut -c3- characters 3 thru last cut -f1,4,7 tab-separated fields 1, 4, and 7 cut -d" " -f1 blank-separated field 1 echo a.b.c cut -d"." -f2 yields b

#!/bin/sh # compile if [ "$SRCDIR" = "" ] then echo "using default source directory" SRCDIR=$HOME/src else echo "using source directory $SRCDIR" fi g77 $SRCDIR/$1 exit $?

unix[27] export SRCDIR= pwd unix[28] compile hello.f using source directory /home/mike/classes/shell unix[29] echo $? 0 unix[30] a.out hello unix[31] export SRCDIR="" unix[32] compile hello.f using default source directory g77: /home/mike/src/hello.f: No such file or directory unix[33] echo $? 1 unix[34]

#!/bin/sh # finder grep $1 text > /dev/null if [ $? -eq 0 ] then echo "found" fi unix[35] finder ancient found unix[36] finder modern unix[37]

#!/bin/sh # compares echo "true yields 0, false yields 1" x="005" [ "$x" = "005" ] echo "Are strings 005 and 005 equal? $?" [ "$x" = "5" ] echo "Are strings 005 and 5 equal? $?" [ $x -eq 005 ] echo "Are integers 005 and 005 equal? $?" [ $x -eq 5 ] echo "Are integers 005 and 5 equal? $?"

unix[38] compares true yields 0, false yields 1 Are strings 005 and 005 equal? 0 Are strings 005 and 5 equal? 1 Are integers 005 and 005 equal? 0 Are integers 005 and 5 equal? 0 unix[39]

#!/bin/sh # empty if [ -s $1 ] then echo "The file $1 has contents." else echo "The file $1 is absent or empty." exit 1 fi unix[40] empty text The file text has contents. unix[41] empty xxxx The file xxxx is absent or empty. unix[42] echo $? 1 unix[43]

#!/bin/sh # adder sum=0 for x in $@ do sum= expr $sum + $x done echo "The sum is $sum." unix[44] adder 1 2 3 4 5 The sum is 15. unix[45]

#!/bin/sh # fixfor for fyle in *.for do new= echo $fyle sed -e"s/\.for$/\.f/" mv $fyle $new done unix[46] ls *.for a.for b.for pgm.for xyz.w.for unix[47] fixfor unix[48] ls *.f a.f b.f pgm.f xyz.w.f

#!/bin/sh # suffix for fyle in *.$1 do new= echo $fyle sed -e"s/\.$1$/\.$2/" mv $fyle $new done unix[49] ls *.f a.f b.f pgm.f xyz.w.f unix[50] suffix f for unix[51] ls *.for a.for b.for pgm.for xyz.w.for unix[52]

sed reads std-in, edits line(s), writes std-out sed -e"s/old/new/" sed -e"s/old/new/g" replace first old by new replace each old by new old can be a regular expression ^ matches the beginning of the line $ matches the end of the line. matches any single character.* matches zero or more characters [tt] matches t or T escape these and other special characters with \ unix[53] echo banana sed -e"s/a$/\.x/" banan.x unix[54] more fruit xapple xpear xplum xcherry unix[55] sed -e"s/^x/ /" < fruit apple pear plum cherry

A Final Example #! /bin/sh # list names of all files containing given words if [ $# -eq 0 ] then echo "findtext word1 word2 word3..." echo "lists names of files containing all given words" exit 1 fi for fyle in * do bad=0 for word in $* do grep $word $fyle > /dev/null 2> /dev/null if [ $? -ne 0 ] then bad=1 break fi done if [ $bad -eq 0 ] then echo $fyle fi done

Gotchas Never use test as the name of a variable or a shell script file. When using = as an assignment operator, do not put blanks around it. When using = as a comparison operator, you must put blanks around it. When using if [ ] put spaces around the brackets (except after ] when it is the last character on the line).

Exercises somehintsaregiveninthefiles exer1, exer2, exer2.aix, and exer3. 1. Write a script that counts files. (a) First make it count the files in the current directory. (b) Now modify your script to accept a parameter that is the name of a directory, and count the files in that directory. Try this version on the current directory (.) and on the /afs/rpi.edu/campus/doc directory. (c) Further modify your script so that if it is invoked without a parameter it prints out an explanation of how to use it. 2. If the ls command is given the name of a single extant file it merely prints that filename back out. (a) Write a script myls that behaves like ls except that when a single filename parameter is supplied it produces the output that ls -l would give for the file. (b) Revise your script so that when a single filename parameter is given the output produced is the filename followed by the date and time of its most recent change and then the size of the file in bytes. 3. Ascriptisyes is required that sets its exit code to 0 if its parameter is some variation of y or yes, and to 1 otherwise. (a) Assume the only acceptable parameter values meaning yes are y, yes, Y, and YES, and solve the problem using only shell programming features we have discussed. (b) Simplify and generalize your script by using tr a-z A-Z, whichreads from std-in, translates to upper case, and writes to std-out. 4. Write a script that adds up the sizes reported by ls for the files in the current directory. The script should print out only the total number of bytes used.

References UNIX TM Shell Programming, Revised Edition, by Stephen G. Kochan and Patrick H. Wood, Hayden Books, 1990, ISBN 0-672-48448-X. The UNIX TM Programming Environment, by Brian W. Kernighan and Rob Pike, Prentice Hall, 1984, ISBN 0-13-937681-X. sed & awk, by Dale Dougherty, O Reilly & Associates, 1991, ISBN 0-937175-59-5. Mastering Regular Expressions, by Jeffrey E. F. Friedl, O Reilly & Associates, 1997, ISBN 1-56592-257-3.