Shell 编程

43
Shell 编编 编编

description

Shell 编程. 陈伟. Index. The shell of Linux Bourne Shell Programming find.and.regular.expression text manipulation. The shell of Linux. Bourne shell (sh), C shell (csh), Korn shell (ksh), TC shell (tcsh), Bourne Again shell (bash). - PowerPoint PPT Presentation

Transcript of Shell 编程

Page 1: Shell   编程

Shell 编程

陈伟

Page 2: Shell   编程

Index

• The shell of Linux• Bourne Shell Programming• find.and.regular.expression• text manipulation

2Shell 编程

Page 3: Shell   编程

The shell of Linux

• Bourne shell (sh), • C shell (csh), • Korn shell (ksh), • TC shell (tcsh), • Bourne Again shell (bash)

3Shell 编程

Page 4: Shell   编程

Difference between programming and scripting languages

– Programming languages are generally a lot more powerful and a lot faster than scripting languages. Programming languages generally start from source code and are compiled into an executable. This executable is not easily ported into different operating systems.

– A scripting language also starts from source code, but is not compiled into an executable. Rather, an interpreter reads the instructions in the source file and executes each instruction. Interpreted programs are generally slower than compiled programs. The main advantage is that you can easily port the source file to any operating system.

4Shell 编程

Page 5: Shell   编程

The first bash program

• We must know how to use a text editor. There are two major text editors in Linux: – vi, emacs (or xemacs).

• So fire up a text editor; for example:– $ vi &

and type the following inside it:– #!/bin/bashecho “Hello World”

• The first line tells Linux to use the bash interpreter to run this script. We call it hello.sh. Then, make the script executable:– $ chmod 700 hello.sh – $ ls –l-rwx------ hello.sh

5Shell 编程

Page 6: Shell   编程

The first bash program

• To execute the program:– $ hello.sh

-bash: hello.sh: command not found

The home directory (where the command hello.sh is located)

is not in the variable PATH– echo $PATH

:bin:/usr/bin:…

We must specify the path of hello.sh– $/home/srinaldi/Scripts/hello.sh– $./hello.sh

6Shell 编程

Page 7: Shell   编程

The second bash program

• We write a program that copies all files into a directory, and then deletes the directory along with its contents. This can be done with the following commands:– $ mkdir trash

$ cp * trash$ rm -rf trash

$ mkdir trash• Instead of having to type all that interactively on the shell, write a shell

program instead:– $ cat trash

#!/bin/bash# this script deletes some files

cp * trashrm -rf trashmkdir trash

echo “Deleted all files!”7Shell 编程

Page 8: Shell   编程

• #!/bin/bash # if1.shecho -n “Enter a number 1 < x < 10: "read numif [ “$num” -lt 10 ]; then

if [ “$num” -gt 1 ]; then echo “$num*$num=$(($num*$num))”else echo “Wrong insertion !”fi

elseecho “Wrong insertion !”

fi

Page 9: Shell   编程

• Bourne Shell Programming

Shell 编程 74

Page 10: Shell   编程

Bourne Shell Programming

• Certainly the most popular shell is “bash”. Bash is the shell that will appear in the GNU operating system. Bash is an sh-compatible shell that incorporates useful features from the Korn shell (ksh) and C shell (csh).

• bash is not only an excellent command line shell, but a scripting language in itself. Shell scripting allows us to use the shell's abilities and to automate a lot of tasks that would otherwise require a lot of commands.

75Shell 编程

Page 11: Shell   编程

Borne Shell

Background Early Unix shell that was written by Steve

Bourne of AT&T Bell Lab. Basic shell provided with many commercial

versions of UNIX Many system shell scripts are written to run

under Bourne Shell A long and successful history

Shell 编程 76

Page 12: Shell   编程

Bourne Shell Programming

• Control structures– if … then– for … in– while – until– case– break and continue

Shell 编程 77

Page 13: Shell   编程

if … then

• Structure if test-command then commands fi

Example:

if test “$word1” = “$word2” then echo “Match” fi

78Shell 编程

Page 14: Shell   编程

test

• Command test is a built-in command • Syntax

test expression [ expression ]

– The test command evaluate an expression – Returns a condition code indicating that the expression

is either true (0) or false (not 0)

• Argument– Expression contains one or more criteria

• Logical AND operator to separate two criteria: -a • Logical OR operator to separate two criteria: -o• Negate any criterion: !• Group criteria with parentheses

– Separate each element with a SPACE79Shell 编程

Page 15: Shell   编程

Test Criteria

• Test Operator for integers: int1 relop int2

Relop Description

-gt Greater than

-ge Greater than or equal to

-eq Equal to

-ne Not euqal to

-le Less than or equal to

-lt Less than

80Shell 编程

Page 16: Shell   编程

Exercise

• Create a shell script to check there is at least one parameter– Something like this:

… if test $# -eq 0 then echo “ you must supply at least one

arguments” exit 1 fi…

81Shell 编程

Page 17: Shell   编程

Test Criteria

• The test built-in options for filesOption Test Performed on file

-d filename Exists and is a directory file

-f filename Exists and is a regular file

-r filename Exists and it readable

-s filename Exists and has a length greater than 0

-u filename Exists and has setuid bit set

-w filename Exists and it writable

-x filename Exists and it is executable

… … … …

82Shell 编程

Page 18: Shell   编程

Exercise

• Check weather or not the parameter is a non-zero readable file name– Continue with the previous script and

add something likeif [ -r “$filename” –a –s “$filename” ] then

… …fi

83Shell 编程

Page 19: Shell   编程

Test Criteria

• String testingCriteria meaning

String True if string is not the null string

-n string True if string has a length greater than zero

-z string True if string has a length of zero

String1 = string2

True if string1 is equal to string2

String1 != string2

True if string1 is not equal to string2

84Shell 编程

Page 20: Shell   编程

Exercise

• Check users confirmation– Frist, read user input

echo -n “Please confirm: [Yes | No] “read user_input

– Then, compare it with standard answer ‘yes’if [ “$user_input” = Yes ]then echo “Thanks for your confirmation!”Fi

85Shell 编程

Page 21: Shell   编程

if…then…else

• Structure if test-command then commands else commands fi

– You can use semicolon (;) ends a command the same way a NEWLINE does.

if [ … ]; then… …

fi

if [ 5 = 5 ]; then echo "equal"; fi86Shell 编程

Page 22: Shell   编程

if…then…elif• Structure

if test-command then commands elif test-command then commands . . . else commands fi

87Shell 编程

Page 23: Shell   编程

Debugging Shell Scripts

• Display each command before it runs the command– Set the –x option for the current shell

• $set –x

– Use the –x to invoke the script• $sh –x command arguments

– Add the set command at the top of the script• set –x

• Then each command that the script executes is preceded by a plus sign (+)– Distinguish the output of trace from any output that the

script produces

• Turn off the debug with set +x

88Shell 编程

Page 24: Shell   编程

for… in• Structure

for loop-index in argument_list do

commands done

Example: for file in * do if [ -d “$file” ]; then echo $file fi done

89Shell 编程

Page 25: Shell   编程

for

• Structure for loop-index do

commands done

– Automatically takes on the value of each of command line arguments, one at a time. Which implies for arg in “$@”

90Shell 编程

Page 26: Shell   编程

while

• Structure while test_command do

commands done

Example: while [ “$number” –lt 10 ] do … … number=`expr $number + 1` done

91Shell 编程

Page 27: Shell   编程

until

• Structure until test_command do

commands done

Example: secretname=jenny name=noname until [ “$name” = “$secretname” ] do echo “ Your guess: \c” read name done

92Shell 编程

Page 28: Shell   编程

break and continue

• Interrupt for, while or until loop• The break statement

– transfer control to the statement AFTER the done statement

– terminate execution of the loop• The continue statement

– Transfer control to the statement TO the done statement

– Skip the test statements for the current iteration

– Continues execution of the loop

93Shell 编程

Page 29: Shell   编程

Example: for index in 1 2 3 4 5 6 7 8 9 10 do if [ $index –le 3 ]; then echo continue continue fi echo $index if [ $index –ge 8 ]; then echo “break” break fi done

94Shell 编程

Page 30: Shell   编程

case

• Structure case test_string in pattern-1 )

commands_1 ;; pattern-2 ) commands_2 ;; … …esac

• default case: catch all pattern * )

95Shell 编程

Page 31: Shell   编程

case

• Special characters used in patternsPattern Matches

* Matches any string of characters.

? Matches any single character.

[…] Defines a character class. A hyphen specifies a range of characters

| Separates alternative choices that satisfy a particular branch of the case structure

96Shell 编程

Page 32: Shell   编程

Example #!/bin/sh echo “\n Command MENU\n” echo “ a. Current data and time” echo “ b. Users currently logged in” echo “ c. Name of the working directory\n” echo “Enter a,b, or c: \c” read answer echo case “$answer” in a) date ;; b) who ;; c) pwd ;; *) echo “There is no selection: $answer” ;;esac

97Shell 编程

Page 33: Shell   编程

Built-in: exec

• Execute a command: – Syntax: exec command argument– Run a command without creating a new process

• Quick start• Run a command in the environment of the original

process• Exec does not return control to the original program• Exec can be the used only with the last command

that you want to run in a script• Example, run the following command in your current

shell, what will happen?$exec who

100Shell 编程

Page 34: Shell   编程

Built-in: exec• Redirect standard output, input or error of a shell script

from within the script• exec < infile• exec > outfile 2> errfile

– Example:sh-2.05b$ more redirect.shexec > /dev/ttyecho "this is a test of redirection"

sh-2.05b$ ./redirect.sh 1 > /dev/null 2 >& 1this is a test of redirection

101Shell 编程

Page 35: Shell   编程

Catch a signal: builtin trap

• Built-in trap – Syntax: trap ‘commands’ signal-numbers– Shell executes the commands when it catches one of the

signals– Then resumes executing the script where it left off.

• Just capture the signal, not doing anything with it trap ‘ ‘ signal_number

– Often used to clean up temp files– Signals

• SIGHUP 1 disconnect line• SIGINT 2 control-c• SIGKILL 9 kill with -9• SIGTERM 15 default kill• SIGSTP 24 control-z• …

102Shell 编程

Page 36: Shell   编程

Example

[ruihong@dafinn ~/cs3451]$ more inter#!/bin/shtrap 'echo PROGRAM INTERRUPTED' 2while truedo echo "programming running." sleep 1done

103Shell 编程

Page 37: Shell   编程

A partial list of built-in

• bg, fg, jobs job control

• break, continue change the loop• cd, pwd working directory• echo, read display/read• eval scan and evaluate the command• exec execute a program• exit exit from current shell• export, unset export/ remove a val or fun• test compare arguments

104Shell 编程

Page 38: Shell   编程

A partial list of builtin

• kill sends a signal to a process or job• set sets flag or argument• shift promotes each command line argument• times displays total times for the current shell

and • trap traps a signal• type show whether unix command, build-in, function• umask file creation mask• wait waits for a process to terminate.• ulimit print the value of one or more resource

limits

105Shell 编程

Page 39: Shell   编程

functions

• A shell function is similar to a shell script– It stores a series of commands for execution at a later

time.– The shell stores functions in the memory– Shell executes a shell function in the same shell that

called it.

• Where to define– In .profile– In your script– Or in command line

• Remove a function– Use unset built-in

106Shell 编程

Page 40: Shell   编程

functions

• Syntaxfunction_name()

{ commands }• Example:

sh-2.05b$ whoson()> {> date> echo "users currently logged on"> who> }sh-2.05b$ whosonTue Feb 1 23:28:44 EST 2005users currently logged onruihong :0 Jan 31 08:46ruihong pts/1 Jan 31 08:54 (:0.0)ruihong pts/2 Jan 31 09:02 (:0.0)

107Shell 编程

Page 41: Shell   编程

Examplesh-2.05b$ more .profilesetenv(){ if [ $# -eq 2 ] then eval $1=$2 export $1 else echo "usage: setenv NAME VALUE" 1>&2 fi}sh-2.05b$. .profilesh-2.05b$ setenv T_LIBRARY /usr/local/tsh-2.05b$ echo $T_LIBRARY/usr/local/t

108Shell 编程

Page 42: Shell   编程

Exercise

• Let’s look at some system scripts – /etc/init.d/syslog– /etc/init.d/crond

109Shell 编程

Page 43: Shell   编程

Summary

• Shell is a programming language• Programs written in this language

are called shell scripts.– Variable– Built-in – Control structure– Function– Call utilities outside of shell

• find, grep, awk110Shell 编程