More Scripting Techniques Scripting Process Example Script

Similar documents
Shell Scripting. Todd Kelley CST8207 Todd Kelley 1

A shell can be used in one of two ways:

Shell Programming (bash)

More Scripting Todd Kelley CST8207 Todd Kelley 1

bash Tests and Looping Administrative Shell Scripting COMP2101 Fall 2017

COMP 4/6262: Programming UNIX

Shells and Shell Programming

Linux Shell Scripting. Linux System Administration COMP2018 Summer 2017

bash Tests and Looping Administrative Shell Scripting COMP2101 Fall 2017

Shells and Shell Programming

Bourne Shell Reference

Unix as a Platform Exercises + Solutions. Course Code: OS 01 UNXPLAT

A Big Step. Shell Scripts, I/O Redirection, Ownership and Permission Concepts, and Binary Numbers

9.2 Linux Essentials Exam Objectives

Scripting. Shell Scripts, I/O Redirection, Ownership and Permission Concepts, and Binary Numbers

COMP2100/2500 Lecture 17: Shell Programming II

Shell scripting and system variables. HORT Lecture 5 Instructor: Kranthi Varala

Assignment clarifications

CSE 374 Programming Concepts & Tools. Brandon Myers Winter 2015 Lecture 4 Shell Variables, More Shell Scripts (Thanks to Hal Perkins)

sottotitolo A.A. 2016/17 Federico Reghenzani, Alessandro Barenghi

Topic 2: More Shell Skills. Sub-Topic 1: Quoting. Sub-Topic 2: Shell Variables. Difference Between Single & Double Quotes

Shells & Shell Programming (Part B)

Sub-Topic 1: Quoting. Topic 2: More Shell Skills. Sub-Topic 2: Shell Variables. Referring to Shell Variables: More

Shell programming. Introduction to Operating Systems

Linux shell programming for Raspberry Pi Users - 2

Linux shell scripting Getting started *

More Scripting and Regular Expressions. Todd Kelley CST8207 Todd Kelley 1

Topic 2: More Shell Skills

Today. Review. Unix as an OS case study Intro to Shell Scripting. What is an Operating System? What are its goals? How do we evaluate it?

Essentials for Scientific Computing: Bash Shell Scripting Day 3

More Scripting Todd Kelley CST8207 Todd Kelley 1

Last Time. on the website

EECS2301. Example. Testing 3/22/2017. Linux/Unix Part 3. for SCRIPT in /path/to/scripts/dir/* do if [ -f $SCRIPT -a -x $SCRIPT ] then $SCRIPT fi done

While Statement Examples. While Statement (35.15) Until Statement (35.15) Until Statement Example

UNIX Shell Programming

UNIX shell scripting

Shells. A shell is a command line interpreter that is the interface between the user and the OS. The shell:

Bash Check If Command Line Parameter Exists

bash, part 3 Chris GauthierDickey

Topic 2: More Shell Skills

Processes and Shells

UNIX System Programming Lecture 3: BASH Programming

Unix as a Platform Exercises. Course Code: OS-01-UNXPLAT

Shell Programming. Introduction to Linux. Peter Ruprecht Research CU Boulder

Review of Fundamentals

bash Args, Signals, Functions Administrative Shell Scripting COMP2101 Fall 2017

Simple Shell Scripting for Scientists

Unix Scripts and Job Scheduling. Overview. Running a Shell Script

bash Execution Control COMP2101 Winter 2019

Shell Start-up and Configuration Files

Scripting. More Shell Scripts. Adapted from Practical Unix and Programming Hunter College

OPERATING SYSTEMS LAB LAB # 6. I/O Redirection and Shell Programming. Shell Programming( I/O Redirection and if-else Statement)

Vi & Shell Scripting

My Favorite bash Tips and Tricks

Output with printf Input. from a file from a command arguments from the command read

Review of Fundamentals. Todd Kelley CST8207 Todd Kelley 1

Useful Unix Commands Cheat Sheet

Bashed One Too Many Times. Features of the Bash Shell St. Louis Unix Users Group Jeff Muse, Jan 14, 2009

Conditional Control Structures. Dr.T.Logeswari

Review of Fundamentals. Todd Kelley CST8207 Todd Kelley 1

More Raspian. An editor Configuration files Shell scripts Shell variables System admin

CSE 374: Programming Concepts and Tools. Eric Mullen Spring 2017 Lecture 4: More Shell Scripts

Environment Variables

Answers to AWK problems. Shell-Programming. Future: Using loops to automate tasks. Download and Install: Python (Windows only.) R

CMPS 12A Introduction to Programming Lab Assignment 7

bash Scripting Introduction COMP2101 Winter 2019

Introduction to UNIX Shell Exercises

Advanced Unix Programming Module 03 Raju Alluri spurthi.com

Command Interpreters. command-line (e.g. Unix shell) On Unix/Linux, bash has become defacto standard shell.

Bash scripting Tutorial. Hello World Bash Shell Script. Super User Programming & Scripting 22 March 2013

The Unix Shell & Shell Scripts

Bash shell programming Part II Control statements

Regular Expressions. Todd Kelley CST8207 Todd Kelley 1

BASH and command line utilities Variables Conditional Commands Loop Commands BASH scripts

CSC 2500: Unix Lab Fall 2016

EECS 2031E. Software Tools Prof. Mokhtar Aboelaze

Shell Scripting. With Applications to HPC. Edmund Sumbar Copyright 2007 University of Alberta. All rights reserved

CSCI 2132: Software Development. Norbert Zeh. Faculty of Computer Science Dalhousie University. Shell Scripting. Winter 2019

CSCI 211 UNIX Lab. Shell Programming. Dr. Jiang Li. Jiang Li, Ph.D. Department of Computer Science

Computer Systems and Architecture

Bash Programming. Student Workbook

Welcome to the Bash Workshop!

Assignment 3, Due October 4

I/O and Shell Scripting

CS 25200: Systems Programming. Lecture 10: Shell Scripting in Bash

Lecture 4. Log into Linux Reminder: Homework 1 due today, 4:30pm Homework 2 out, due next Tuesday Project 1 out, due next Thursday Questions?

CSC209H Lecture 1. Dan Zingaro. January 7, 2015

C Shell Tutorial. Section 1

Simple Shell Scripting for Scientists

Chapter 5 The Bourne Shell

Lab 4: Bash Scripting

22-Sep CSCI 2132 Software Development Lecture 8: Shells, Processes, and Job Control. Faculty of Computer Science, Dalhousie University

Using bash. Administrative Shell Scripting COMP2101 Fall 2017

Understanding bash. Prof. Chris GauthierDickey COMP 2400, Fall 2008

Linux Command Line Interface. December 27, 2017

Bash command shell language interpreter

CS Unix Tools & Scripting

Title:[ Variables Comparison Operators If Else Statements ]

EECS 470 Lab 5. Linux Shell Scripting. Friday, 1 st February, 2018

Windshield. Language Reference Manual. Columbia University COMS W4115 Programming Languages and Translators Spring Prof. Stephen A.

Transcription:

More Scripting Techniques Scripting Process Example Script 1

arguments to scripts positional parameters input using read exit status test program, also known as [ if statements error messages 2

case statement while loops until loops for loops why write scripts in the first place? lists set and shift integer arithmetic scripting process in general 3

Another decision structure Use when a decision is based upon multiple inputs Syntax: case word in Pattern1) statements;; Pattern2) statements;; esac The word is a variable that matches one of the patterns Can use * to match all patterns,? to match a single character or [ ] for a range.

read case esac p "Do you want to see all files?" $yesno in y Y) echo "Displaying all files " ls a ;; n N) echo "Displaying ls ;; *) echo "Invalid response!" ;; yesno all file except hidden "

case statement Example2 childprice=5 #age 0 to 12 adultprice=10 #age 13 to 59 seniorprice=6 #age 60 to 99 read -p "Enter case $age in your age: " age [1-9] [1][0-2]) echo " price is child's price of " $childprice ;; [1][3-9] [2-5][0-9]) echo " price is adult price of " $adultprice ;; [6-9][0-9]) echo " price is senior price of " $seniorprice ;; *) echo "Invalid input" ;; esac

while condition; do # this code runs over and over # until command has # non-zero exit status done 7

while read -p "enter a word: " word; do echo "You entered: $word" done 8

stop=n while [ $stop!= y ] do who ls read p Do you want to stop? (y/n) stop done echo Stopping

The until syntax in the shell: until condition do statements done If condition is false Do statements execute. If condition is true loop terminates.

stop=n until [ $stop = y ] do who ls read p Do you want to stop? (y/n) stop done echo Stopping

The for statement syntax in bash shell takes two forms: Word list form: for variable [in list] do statements Done if [in list] is omitted, the positional parameters are used Arithmetic expression form: for ((variable=starting-value; variable operator value; change value)) do statements done

for f in hello how are you today; do echo "Operating on $f" done 13

for ((num=1; num <= 10; num++)) do ((power=$num ** 2)) echo $num to the second power is $power done

1. use when an alias gets too complex, impossible aliases cannot use arguments in their replacement text 2. make new, specialized commands look at /bin/gunzip and /bin/zcat 3. automate long and/or complex tasks example, actually part of the boot system: /etc/rc.d/rc backup scripts, bulk user creation, other sysadmin tasks as we'll see, scripts are the contents of the "regularly scheduled tasks" directories: /etc/cron.{hourly,daily,monthly}/ 15

In the general form of the control statements(examples: if, for, while) in the bash man page we will see the notion of a list for name [ in word... ] ; do list ; done if list1; then list2; fi From the man page for bash: A list is a sequence of one or more pipelines separated by one of the operators ;, &, &&, or, and optionally terminated by one of ;, &, or <newline>. 16

Hey, we already know what most of those mean: ls al more # there's that operator means redirect output of one command into another ls al > foo & # there's that & operator & means run the command in the background proceed immediately with any command after the & ls al ; head myfile # there's the ; operator ; means run one command after another wait for the first command to finish in the foreground, then when it's finished, proceed with any command after the ; 17

The new ones are command1 && command2 command1 command2 18

&& means AND This means stop at the first command that has non-zero exit status command1 && command2 is the same as if command1; then command2; fi example, suppose we want to run process.sh on a file, and then remove it: process.sh /root/testfile && rm f /root/testfile if any thing goes wrong with process.sh (non-zero exit status), the file is NOT removed if the process.sh /root/testfile command goes well (has zero exit status), THEN the file will be removed 19

means OR This means stop at the first command that returns a zero exit status command1 command2 is the same as if command1; then : ; else command2 fi : is a command that does nothing! example, suppose we are writing a script that needs to process a file, and if that doesn't go well, then the script should terminate abnormally: process /root/testfile exit 1 if anything goes wrong with process, the script exits 20

Suppose you might qualify for a scholarship: Those who qualify are: born on the moon, and something if we weren't born on the moon, we don't need to know what the <something> is; we already know we don't qualify Algonquin student and something in this case, because we are an Algonquin student, we do need to know what something is to know whether we qualify or in other words born on the moon && something Algonquin student && something 21

As soon as we encounter "true", we can stop You qualify for a $1000 rebate under the following conditions: born on the moon, or?? Algonquin student, or?? In the first case, we need to know what the exit status of the?? is, we need to run the?? command In the second case, we can stop before running the?? command 22

&& and are used with commands that tend to get things done to graduate, you complete first year && complete second year complete first year is a "command" that gets things done: you learn the first-year material if you fail first year, you don't attempt second year -a and o are used in test, and don't do things, just affect the exit status of test you are a rich Canadian if you are Canadian a you are rich checking whether or not you're Canadian doesn't get things done but it does establish a truth value 23

In our script we can manipulate the positional parameters set command to set them shift command to process them in turn 24

We can set the positional parameters with set oneword secondword -e etc This will set $1 to oneword $2 to secondword $3 to -e $4 to etc Set does take options (see bash manpage) and that first tells set there are no more options (-e in this case is not an option) 25

shift moves all the arguments to the left shift n moves all the arguments to the left by n shift $# is decreased by 1 the pre-shift $1 is lost $1 becomes what was in $2 $2 becomes what was in $3 $3 becomes what was in $4 etc 26

The expr command is a common and traditional way to evaluate arithmetic expressions The arguments to the expr command constitute the arithmetic expression 27

examples of using expr command: a=`expr 3 + 4` # a gets set to 7 a=`expr 3 4` # a gets set to -1 a=`expr 3 * 4` # a gets set to 12 a=`expr 13 / 5` # integer division: 2 a=`expr 13 % 5` # remainder: 3 increment the integer in variable a a=`expr $a + 1` # a gets set to a+1 28

let is not the preferred way to do arithmetic in this course let arg [arg...] each arg is an arithmetic expression to evaluate see ARITHMETIC EVALUATION of bash man page shell variables are allowed with or without $ arithmetic expressions can involve assignment of values to variables, where "=" is the basic assignment operator examples: let a=1 echo $a let a=a+1 echo $a 29

let seems great, why not use it? because it's not as portable as the alternatives "portable" means you can run your script unmodified on other systems, maybe running /bin/dash instead of /bin/bash, and it will work just as well expr is "standard" and works everywhere $((arith)) is what you would use if you don't want to use expr (and it's faster than expr) x=0 x=$(( x + 1 )) x=$(( $x + 1 )) 30

What's the difference between ((expression)) and $((expression)) $((expression)) is an expansion like a variable expansion, where $((expression)) is replaced by the results of the evaluated expression ((expression)) is a compound command equivalent to let expression 31

You can put $((expression)) where you can put variable expansion like $myvar: a=0 while [ "$a" lt 10 ]; do echo username: "user$((a+1))" a=$((a+1)) done 32

You can use ((expression)) wherever you would use a command: ((a=0)) # set a to 0 ((a=a+1)) # increment a to 1 a=((a+1)) # syntax error a="((a+1))" # set a to literal string "((a+1))" a="ls" # set a to literal string "ls" In these last two, there is what looks like a command, ls and ((a+1)), but no command is run 33

Analyze and understand the problem Write pseudocode to document and understand the problem Start with a small number of lines in the script, and get that working properly Add a small amount to the script, and get it working properly again repeat previous step until script is complete run final tests 34

Example from Sobell, A Practical Guide to Linux, Commands, Editors, and Shell Programming, 2 nd Ed, Chapter 10 lnks script: Given a filename, find hard links to that file. Search for hard links under a certain directory if one is given; otherwise, search for hard links in the current working directory and its subdirectories. 35

Generally, for any problem, we need to deal with the following three phases 1. Input 2. Processing 3. Output 36

Input is the information/data that a script needs before it can do its job What is the information? name of a file name of a directory How does our script get its information? the description says "given a filename", and "directory if one is given" this would imply that those items would be command line arguments if the description said "ask for", then the script would prompt for the information after its running 37

What's the data that will be processed? What work will our script do? the script will look for hard links in the file system therefore, the data is the contents of the file system our script will look for hard links in the file system our script will "read in" this data by running commands that access the file system (ls, find, etc) 38

OK, we now understand the problem take a file name and an optional directory location as arguments on the command line, and use Linux commands to find hard links at that the specified directory (or the current directory if none was specified) in the file system Simple, let's just tell the computer to do that! 39

Our scripts are like little robots that will do exactly what we tell them to do. Imagine you move into a new neighborhood and you tell your domestic robot to go to the corner store and bring back a turkey sandwich and a coke The robot comes back with a pound of butter and a can of crab juice You aren't happy, but whose fault is it? the store had ham, but no turkey, and pepsi, but no coke again, whose fault is it that you aren't happy? 40

If they don't have coke, then get pepsi, and if they don't have pepsi, then nothing, etc, etc When we write our scripts, we end up happiest when we specify absolutely every single detail of every possible circumstance We need to make a conscious effort to predict all possible ways things can go wrong It's a common script beginner's mistake to think only about everything going right The major work is dealing properly with what goes wrong 41

What if no directory name is given on command line? use the current directory (hey, this is easy!) What if no file name is given on the command line? print an error message (but then what?) What if the given file name is a directory and not a regular file? print an error message and exit What if too many names are given? What if no hard links are found? What if there are no hard links to the file? What if the directory is unreadable? Doesn't exist? The more "what ifs" our script can handle, the better... 42

Speaking of "what if"s... A Test Plan is a document that describes a process for verifying that the script does the right thing every time no matter what In simple cases it can be a list of tests, which would have this form: test name short description of what's being tested command (and/or instructions) for running the test expected result and/or output from running the test the actual result (filled in when a test plan is executed) 43

As we have seen, the process of understanding the problem and generating a test plan both involve "what if" analysis, and therefore can proceed at the same time The plan for testing the final result begins to form early (maybe even before the problem is fully understood!) 44

Start small and get that working, and then add to it Let's start with just the "input" phase: #!/bin/sh u PATH=/bin:/usr/bin ; export PATH umask 022 # identify links to a file # Usage: $0 file [directory] if [ $# -eq 0 o $# -gt 2 ]; then echo 1>&2 "$0: Expecting one or two arguments, found $# ($*)" echo 1>&2 "Usage $0 file [directory]" exit 1 fi Continue on real Linux system... 45

After finishing the Input stage, we have our file name and directory under which to search How do we find the hard links? Think about hard links... If we know the inode of the file, then all hard links to the same file will have the same inode We can get the inode of the file using ls We can look for files with the same inode using find 46

Getting the inode number into a variable named inode so we can refer to it as $inode Consider the output of ls i Assuming the filename is in $file, Each of the following will do the trick remember backticks, `command` is command substitution, same as $(command) inode=`ls -i "$file" awk '{print $1}'` OR set - `ls i "$file"` inode=$1 OR inode=$(ls i "$file" cut d' ' f1) 47

Now that we have the inode, how do we find other files with that inode? This literally has the find command written all over it! (man find) find "$directory" inum "$inode" -print 48

How does our script deliver its results? Should the names be put in a special file somewhere? It depends. In keeping with the Unix filter/pipeline philosophy, lets have our script print the names on the standard output Hey, find is already printing the names on its standard output Recall that the standard output of the script is the same as the standard output of the commands inside the script 49

Notice that errors and other messages should be printed on standard error The "goods" (the actual filenames we were looking for) are printed on standard output That's how we like it, because now we can redirect standard output to a file, or run it through grep or any other utility, and we won't have those messages mixed in All of those messages will go to standard error, which we can also redirect elsewhere if we want 50

Indenting: look at how the if statements are indented: if list; then ls l # indented 4 spaces fi The same would be true of other control statements: while list; do #indent 4 spaces done 51

Variables in our scripts have lower case names Environment variables are indicated by their UPPER CASE names: SHELL, VISUAL, etc It's usually best to put variable expansions inside double quotes, to protect any special characters that might be inside the variable: echo "$somevar" if somevar contained the * character, the double quotes stop the shell from globbing it 52

The following all mean different things: run the myvar command with two arguments, = and value: myvar = value set the myvar variable to have value "", then run the value command with that variable setting in effect myvar= value run the myvar command with one argument, namely =value: myvar =value set the variable myvar to have value value myvar=value 53

-v option for bash/sh sh v myscript shell will print each line as its read loop statements are printed once -x option for bash/sh sh x myscript shell will display $PS4 prompt and the expanded command before executing it each loop iteration is shown individually 54

test plan creation involves identifying the "Boundary Conditions" The "typical case" or "normal case" is a necessary test, and all such cases are considered equivalent (test one and you've tested them all) Boundary cases are all interesting: present or missing too small, just big enough, typical, almost too big, too big MINIMUM,... -1,0,1,... MAXIMUM 55

Suppose you're looking for 8.3 filenames, where the "main part" is up to 8 characters, and the extension is exactly 3 characters main part of filename boundaries 0, 1, 8, 9 characters typical case (only one needed) 2,3,4,5,6,7 extension boundaries 0,3,4 typical case (same as the boundary) 3 56