Presentation is loading. Please wait.

Presentation is loading. Please wait.

240-491 Adv. UNIX:CShell/71 Advanced UNIX v Objectives of these slides: –introduce the C Shell –concentrate on features not in the Bourne Shell (but many.

Similar presentations


Presentation on theme: "240-491 Adv. UNIX:CShell/71 Advanced UNIX v Objectives of these slides: –introduce the C Shell –concentrate on features not in the Bourne Shell (but many."— Presentation transcript:

1 240-491 Adv. UNIX:CShell/71 Advanced UNIX v Objectives of these slides: –introduce the C Shell –concentrate on features not in the Bourne Shell (but many are in Bash) 240-491 Special Topics in Comp. Eng. 1 Semester 2, 2000-2001 7. The C Shell (Chapter 11, Sobell)

2 240-491 Adv. UNIX:CShell/72 Overview 1. Background 2. History 3. Alias 4. Job Control 5. Home Directory Short Forms continued

3 240-491 Adv. UNIX:CShell/73 6. Filename Completion 7. Directory Stacks 8. Variables 9. Automated Scripts 10.Script Programming

4 240-491 Adv. UNIX:CShell/74 1. Background v Originally part of Berkeley UNIX v More tolerant of mistakes than Bourne –e.g can avoid accidental logouts, overwrites v Easier to configure –e.g. alias, history, job control v Some scripting improvements over Bourne: –better variables, arrays, expressions continued

5 240-491 Adv. UNIX:CShell/75 v Almost all the good ideas from the C Shell have been added to Bash: –e.g. history, aliases, job control, directory stacks v I use Bash for scripting and as my command interpreter.

6 240-491 Adv. UNIX:CShell/76 Entering & leaving the C Shell  Check your default shell with ps  Change shell using chsh or type csh  Exit with: exit, logout ( control-D maybe) csh is actually tcsh on most Linuxes

7 240-491 Adv. UNIX:CShell/77 2. History v A list of recently used command lines (events) that can be reused.  $ set history = 25 (record 25 events) $ set savehist = 20 (remember 20 events after logout) $ history (see history list)

8 240-491 Adv. UNIX:CShell/78 Using the history list  $ !! (execute last event)  $ ! (execute event no. ) $ !3  $ ! (execute most recent command that starts with initial-text ) $ !gcc $ !loc

9 240-491 Adv. UNIX:CShell/79 Bash History v history [ number ] –lists the last number commands! v Bash supports the same history list features: –!!, !, ! –!!, !, ! v Relevant environment variables: –HISTFILE=/home/ad/.bash_history –HISTFILESIZE=500 –HISTSIZE=500 continued

10 240-491 Adv. UNIX:CShell/710 v In Bash, you can modify the prompt to include the history number.  Inside.bashrc : PS1="\!.\u@\h$ " \! includes the history number

11 240-491 Adv. UNIX:CShell/711 3. Alias v Define new commands by using string substitution. v Format: $ alias new-command executed-command(s) v e.g. $ alias ll ls -lg $ ll

12 240-491 Adv. UNIX:CShell/712 Examples v $ alias ls ls -lg v $ alias mi mv -i v $ alias who ’who ; date’ redefining commands is okay

13 240-491 Adv. UNIX:CShell/713 Argument Substitution  \!^ the first argument of the new command  \!* all the arguments of the new command  $ alias wid ’who | fgrep \!^’  $ wid igor is the same as: $ who | fgrep igor

14 240-491 Adv. UNIX:CShell/714 Check your aliases  $ alias (list the current aliases)  $ alias hd (check hd alias)  $ unalias hd (cancel hd alias)  $ \ls (use original meaning of ls ) sysAdmin safety style

15 240-491 Adv. UNIX:CShell/715 Bash Alias  Bash alias works the same way at the command line as in csh : alias, unalias, \command  Defining an alias in.bashrc is different: alias name=value u alias ls='/bin/ls -F' u alias ll='ls -l' u alias h="history 30" continued

16 240-491 Adv. UNIX:CShell/716 v Aliases that require multiple commands or arguments are defined as functions: sgrep() { ps aux | grep $1 | grep -v grep } cs() { cd $1 ls }

17 240-491 Adv. UNIX:CShell/717 4. Job Control v Move commands between foreground and background; suspend commands. v Each background job has a PID and a job number.

18 240-491 Adv. UNIX:CShell/718 Example v $ spell glossary > glossary.out & [1] 26025 $ date & [2] 26028 Fri Jun 6 16:56:11 GMT+7 2000 [2] Done date $ gcc big.c & [2] 26041 finished already continued

19 240-491 Adv. UNIX:CShell/719 v $ jobs [1] - Runningspell glossary.out > glo [2] + Runninggcc big.c v Other status messages: –Stopped –Stopped (tty input) –Done one before last the last one

20 240-491 Adv. UNIX:CShell/720 Background to Foreground v $ fg %job-number v Example: $ fg %2

21 240-491 Adv. UNIX:CShell/721 Foreground to Background  $ control-Z (suspends job and puts it into the background)  $ bg (resumes the job)  $ bg %job-number (resumes job-number )

22 240-491 Adv. UNIX:CShell/722 Stopping  $ stop %job-number  $ kill %job-number (kills job-number )  A job stopped for tty input must be brought to the foreground (with fg ).

23 240-491 Adv. UNIX:CShell/723 State Change v The C Shell prints a message at the next prompt when the state of a job changes.  Use notify to make the shell report a change immediately: $ notify %job-number

24 240-491 Adv. UNIX:CShell/724 5. Home Directory Short Forms  ~ (your home directory)  ~name (home directory of name) e.g. ~ad v Use: $ cp idea.txt ~ $ ls ~ad/teach

25 240-491 Adv. UNIX:CShell/725 6. Filename Completion  $ set filec (‘switch on’ file completion)  $ cat trig1A $ cat trig1A.txt

26 240-491 Adv. UNIX:CShell/726 Control-D for help v $ ls h* help.hist help.text help.trig.01  $ cat h $cat help. help.hist help.text help.trig.01 $ cat help. sometimes

27 240-491 Adv. UNIX:CShell/727 ~ 7. Directory Stacks v Store a list of directories you are using on a stack. v Switch between directories by referring to the stack. adv-unix cops_104

28 240-491 Adv. UNIX:CShell/728 ~ v v $ pwd /home/ad/ $ pushd ~/teach/adv-unix ~/teach/adv-unix ~ $ pwd /home/ad/teach/adv-unix $ pushd ~/cops_104 ~/cops_104 ~/teach/adv-unix ~ $ pwd /home/ad/cops_104 adv-unix cops_104 push the directory onto the stack and do a cd

29 240-491 Adv. UNIX:CShell/729 ~ Change directories quickly v v $ pushd ~/teach/adv-unix ~/cops_104 ~ $ pwd /home/ad/teach/adv-unix/ cops_104 adv-unix push the top directory down and do a cd

30 240-491 Adv. UNIX:CShell/730 v v $ pushd ~/cops_104 ~/teach/adv-unix ~ $ pwd /home/ad/cops_104 ~ adv-unix cops_104 push the top directory down and do a cd

31 240-491 Adv. UNIX:CShell/731 ~Popd   $ popd ~/teach/adv-unix ~ $ pwd /home/ad/teach/adv-unix/ adv-unix pop the top directory and cd to the new top

32 240-491 Adv. UNIX:CShell/732 Other Stack Commands  $ dirs (lists the directories on the stack)  $ pushd +number –move the directory in position number to the top (0), and cd to that directory –the stack is numbered 0, 1, 2,... continued

33 240-491 Adv. UNIX:CShell/733  $ popd +number –pop off the directory at position number –if number is not 0 then there is no change to the present directory

34 240-491 Adv. UNIX:CShell/734 8. Variables 8.1. String Variables 8.2. Numerical Variables 8.3. Special Forms of User Variables 8.4. Shell Variables

35 240-491 Adv. UNIX:CShell/735 8.1. String Variables  $ set name = fred (include spaces in older csh 's) $ echo $name fred $ set (list set variables) $ unset name (delete name var)

36 240-491 Adv. UNIX:CShell/736 setenv (environment vars)  $ setenv name fred $ echo $name fred $ setenv $ unsetenv name  setenv makes the variable visible to any scripts called from the shell (or from the script containing the setenv ). no =

37 240-491 Adv. UNIX:CShell/737 Arrays of String Vars v $ set colours = (red green blue orange) $ echo $colours red green blue orange $ echo $colours[3] blue $ echo $colours[2-4] green blue orange continued

38 240-491 Adv. UNIX:CShell/738 v $ set shapes = (’’ ’’ ’’ ’’ ’’) $ echo $shapes $ set shapes[4] = square $ echo $shapes[4] square

39 240-491 Adv. UNIX:CShell/739 Braces  Use {...} to distinguish a variable from surrounding text.  $ set prefix = Alex $ echo $prefix is short for {$prefix}ander. Alex is short for Alexander.  Can also write $prefix{ander}

40 240-491 Adv. UNIX:CShell/740 8.2. Numeric Variables  Use the @ command for variables holding numbers.  $ @ count = 0 (or set count = 0 ) $ echo $count 0 $ @ count = ( 5 + 2 ) $ echo $count 7 $ @ result = ( $count < 5 ) $ echo $result 0 continued Remember the space after the @

41 240-491 Adv. UNIX:CShell/741  $ @ count = $count + 5 $ echo $count 12 v Could write: $ @ count += 5 v $ @ count++ $ echo $count 13

42 240-491 Adv. UNIX:CShell/742 Operators v Most of the C numerical operators: –Arithmetic:+ - * / % –Relational:> = = <= != == –Logical:&& || ! –etc.

43 240-491 Adv. UNIX:CShell/743 Arrays of Numeric Vars v $ set ages = (0 0 0 0 0) $ @ ages[2] = 15 $ @ ages[3] = ( $ages[2] + 4 ) $ echo $ages[3] 19 $ echo $ages 0 15 19 0 0

44 240-491 Adv. UNIX:CShell/744 Bourne Shell Equivalents v The Bourne Shell only has string variables.  It uses expr to switch string variables into numbers: $ number=5 (Bourne) $ number=‘expr $number + 2‘ $ @ number = 5 (C Shell) $ @ number = $number + 2

45 240-491 Adv. UNIX:CShell/745 8.3. Special Forms of User Variables  $#VAR (returns number of elements in VAR array)  $?VAR (returns 1 if VAR is declared; 0 otherwise)

46 240-491 Adv. UNIX:CShell/746 v $ set days = (mon tues wed thurs fri) $ echo $#days 5 $ echo $?days 1 $ unset days $ echo $?days 0 days is declared days is not declared

47 240-491 Adv. UNIX:CShell/747 8.4. Shell Variables v Shell variables can be initialised in three ways: –by the shell –by the environment –by the user with set or setenv continued

48 240-491 Adv. UNIX:CShell/748 v There are two types of shell variable: –shell variables that take values; –shell variables that act as switches u they have the value 0 or 1

49 240-491 Adv. UNIX:CShell/749 Shell Vars that take Values  $argv[0] or $0 command name  $argv[1] or $ 1 first argument of command  Also $ 2, $3,... –no upper limit; no need for shift  $argv[*] or $* array of all arguments  $#argv number of arguments continued

50 240-491 Adv. UNIX:CShell/750  $HOME pathname to user’s home directory  $PATH array of pathnames to commands $ setenv PATH (/usr/bin /usr/ucb /bin ~/bin)  $status exit status of last command v etc...

51 240-491 Adv. UNIX:CShell/751 Shell Vars that act as Swiches  $filec turns on file completion  $ignoreeof disables ctrl-D as logout  $noclobber stops file overwriting with >  $notify immediate notification about background job changes v etc... Use:$ set ignoreeof

52 240-491 Adv. UNIX:CShell/752 9. Automated Scripts v At login, the C Shell executes a range of scripts automatically: –/etc/csh.login, /etc/csh.cshrc –.login in your home directory –.cshrc in your home directory v At logout, it executes: –/etc/csh.logout –.logout in your home directory continued

53 240-491 Adv. UNIX:CShell/753  When a shell script is called, the shell will execute the cshrc scripts first.  The cshrc scripts are also executed whenever a new window is created in a X- Windows session.

54 240-491 Adv. UNIX:CShell/754 Examples v $ cat.login setenv TERM vt100 stty erase ‘^X’ kill ‘^U’ -lcase -tabs echo “This is who is on the machine:” who

55 240-491 Adv. UNIX:CShell/755 v $ cat.cshrc set noclobber set ignoreof set history = 100 set prompt = “! % “ set PATH = (/usr/bin /usr/ucb /bin ~/bin) alias h history alias ll ls -lg Only set is needed (not setenv ), since.cshrc is executed at the start of every script.

56 240-491 Adv. UNIX:CShell/756 v $ cat.logout echo Switch off the air-conditioner sleep 10

57 240-491 Adv. UNIX:CShell/757 10. Script Programming 10.1. Executing a C Shell Script 10.2. Branching 10.3. Looping 10.4. Recursion 10.5. Interrupt Handling

58 240-491 Adv. UNIX:CShell/758 10.1. Executing a C Shell Script  Put #!/bin/csh as the first line –may need #!/bin/csh -f to switch off the default initial execution of the cshrc scripts v Or execute: $ csh script  Or make csh your default shell.

59 240-491 Adv. UNIX:CShell/759 10.2. Branching v 10.2.1. if-then v 10.2.2. File Test Expressions v 10.2.3. Switch

60 240-491 Adv. UNIX:CShell/760 10.2.1. if-then v Formats: if (expression) then commands endif if (expression) then commands else commands endif continued

61 240-491 Adv. UNIX:CShell/761 if (expression) then commands else if (expression) then commands : else commands endif

62 240-491 Adv. UNIX:CShell/762 v $ cat if_else1 #!/bin/csh -f # Set class depending on argument value set number = $argv[1] if ($number = 0 && $number = 100 && $number = 0 && $number = 100 && $number < 200)then @ class = 2 else @ class = 3 endif echo The number $number is in class $class

63 240-491 Adv. UNIX:CShell/763 Usage  Due to the #!/bin/csh line, the script can be executed from the Bourne/Bash command line: $ if_else1 55 The number 55 is in class 1 $

64 240-491 Adv. UNIX:CShell/764 10.2.2. File Test Expressions  These occur in the expression part of if- then and other control structures. -d filefile is a directory -f filefile is a file -e filefile exists -z filefile is 0 bytes long -r filefile is readable -w file writable -x file executable

65 240-491 Adv. UNIX:CShell/765 10.2.3. Switch v Format: switch (string variable) case pattern: commands breaksw case pattern: commands breaksw : default: commands breaksw endsw

66 240-491 Adv. UNIX:CShell/766 Example v $ cat switch_1 #!/bin/csh -f # See if first argument is yes or no. # Deal with a mix of upper and lower case. # Does argv[1] exist? if ($#argv == 0) then echo “Usage: switch_1 [yes | no]” exit 1 endif : continued Usage: $ switch_1 YeS Argument 1 is yes $

67 240-491 Adv. UNIX:CShell/767 switch ($argv[1]) case [yY][eE][sS]: echo Argument 1 is yes breaksw case [nN][oO]: echo Argument 1 is no breaksw default: echo Argument 1 is neither yes or no breaksw endsw

68 240-491 Adv. UNIX:CShell/768 10.3. Looping v 10.3.1.Foreach v 10.3.2.While

69 240-491 Adv. UNIX:CShell/769 10.3.1. foreach v Format: foreach loop-index (argument-list) commands end

70 240-491 Adv. UNIX:CShell/770 Example 1 v $ cat refname #!/bin/csh -f # Usage: rename arg1 arg2 # # Changes the string arg1 to arg2 # in the filenames of every file in # the current working directory. if ($#argv != 2) then echo Usage: refname arg1 arg2 exit 1 endif : continued Usage: $ refname CPP C

71 240-491 Adv. UNIX:CShell/771 foreach i (‘ls‘) set newname = ‘echo $i | sed s/$1/$2/‘ mv $i $newname end The text in i that matches $1 is changed to $2 VERY DANGEROUS

72 240-491 Adv. UNIX:CShell/772 v $ cat foo-six #!/bin/csh -f # Assign up to 6 command line args # to the buffer array. Execute foo # with buffer as its arguments set buffer = (0 0 0 0 0 0) @ count = 1 if ($#argv > 6) then echo “Usage: foo-six [up to 6 args]” exit 1 endif : continued Example 2 Usage: $ foo-six a b c

73 240-491 Adv. UNIX:CShell/773 foreach arg ($argv[*]) set buffer[$count] = $arg @ count++ end echo There were $count arguments exec foo $buffer[*] exit 0 expands to $argv[0], $argv[1], etc. expands to $buffer[0], $buffer[1], etc. VERY DANGEROUS

74 240-491 Adv. UNIX:CShell/774 10.3.2. while v Format: while (expression) commands end

75 240-491 Adv. UNIX:CShell/775 v $cat while_1 # Sum the numbers between 1 and # the value in argv[1] @ limit = $argv[1] @ index = 1 @ sum = 0 while ($index <= $limit) @ sum += $index @ index++ end echo The sum is $sum Example Usage: $ while_1 20 The sum is 210

76 240-491 Adv. UNIX:CShell/776 10.4. Recursion  The script cppc visits every directory below the one supplied as its argument and renames any files ending with “.CPP ” to end with “.c ” –e.g. foo.CPP --> foo.c –usage: $ cppc code/  cppc could be implemented with find

77 240-491 Adv. UNIX:CShell/777 cppc #!/bin/csh -f # cppc “ replace all.CPP extensions with.c if ($#argv != 1) then echo “Usage: $0 directory” exit(1) endif foreach file ($1/*) # files in directory if (-f $file) then if ($file:e == ‘CPP’) then mv $file $file:r.c echo Modifying $file to $file:r.c endif else if (-d $file) then $0 $file# recursive call endif end VERY DANGEROUS

78 240-491 Adv. UNIX:CShell/778 Notes  Pulling apart a filename that has an extension (e.g. foo.bar ) $ set var = foo.bar $ echo var:r # name without extension foo $ echo var:e # just the extension bar

79 240-491 Adv. UNIX:CShell/779 A Standard Shape v Most recursive scripts have the following 'shape': foreach file ($1/*) # files in directory if (-f $file) then # do something to the file else if (-d $file) then $0 $file# recursive call endif end

80 240-491 Adv. UNIX:CShell/780 Title Words in Web files  The wtitle script examines each “.html ” file in the directories below the one supplied as its argument. v If outputs the title words on each Web page –e.g if it sees: My Home Page then it prints: My Home Page

81 240-491 Adv. UNIX:CShell/781 wtitle #!/bin/csh -f # wtitle: list the title words in HTML files if ($#argv != 1) then echo Usage: $0 directory exit(1) endif foreach file ($1/*) if ((-f $file) && ($file:e == “html”)) then grep -i title $file | \ awk -F\> ’{print $2}’ | \ awk -F\ ’{print $2}’ | \ awk -F\< ’{print $1}’ | \ tr ’ ’ ’\n’ | tr ’A-Z’ ’a-z’ else if (-d $file) then $0 $file# recursive call endif end

82 240-491 Adv. UNIX:CShell/782 Notes  grep -i title $file gets a title tag line: My Home Page My Home Page  awk -F\> ’{print $2}’ separates the line using ‘ > ‘ and prints the second part: My Home Page My Home Page  awk -F\< ’{print $1}’ separates the line using ‘ < ‘ and prints the first part: My Home Page

83 240-491 Adv. UNIX:CShell/783 Usage v $ wtitle caine/ michael caine caine picture caine : v $ wtitle caine/ | sort | uniq caine michael picture : sorted and duplicates removed

84 240-491 Adv. UNIX:CShell/784 10.5. Interrupt Handling v Not as good as Bourne –only interrupt is supported –the control flow is hard to understand –much improved in tcsh v Format: onintr label v The script must have a line: label:

85 240-491 Adv. UNIX:CShell/785 v $ cat onintr_1 #!/bin/csh -f onintr close while (1) echo Program is running. sleep 2 end close: echo End of Program Usage: $ onintr_1 Program is running Program is running : : End of Program ctrl-C typed


Download ppt "240-491 Adv. UNIX:CShell/71 Advanced UNIX v Objectives of these slides: –introduce the C Shell –concentrate on features not in the Bourne Shell (but many."

Similar presentations


Ads by Google