Red hat linux - The complete reference

Copyright © 2002 by The McGraw-Hill Companies. All rights reserved. Printed in the United States of America. Except as permitted under the Copyright Act of 1976, no part of this publication may be reproduced or distributed in any form or by any means, or stored in a database or retrieval system, without the prior written permission of the publisher, with the exception that the program listings may be entered, stored, and executed in a computer system, but they may not be reproduced for publication.

pdf918 trang | Chia sẻ: banmai | Lượt xem: 1974 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Red hat linux - The complete reference, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
rations, the arithmetic value is converted first to a string, which is then returned by the expr command. Embedded Commands You can combine commands by embedding one within the other. Embedding is commonly used for assigning the result of an expression to a variable. This involves two commands, the set command to perform the assignment and the expr command to evaluate an expression. You embed commands using brackets. An embedded command is another Tcl command whose result is used as an argument in the outer Tcl command. The embedded command is executed first, and its result is used as the argument to the outer command. The following statement assigns the result of the arithmetic operation, 25 * 2, to the variable num. expr 25 * 2 is a command embedded within the set command. First the embedded command is executed, and its result, "50", is assigned to the variable num. set num [expr 25 * 2] Variables Tcl supports numeric and string variables as well as arrays, including associative arrays. All variables hold as their contents a string. However, though the content of a variable is a string, that string can be used as an integer or real value in an arithmetic expression, provided that the string consists of numbers. Whenever such a variable is used as an operand in an arithmetic expression, its contents are first converted to an integer or real value. The operation is performed on the arithmetic values, and the result returned by expr is then converted back to a string. This means that you do not have to worry about declaring the type of variable, or even defining a variable. All variables are automatically defined when they are first used in a statement. As we have seen, variables can be assigned values using the set command. The set command takes as its argument the variable name and the value assigned. A variable's name can be any set of alphabetic or numeric characters and the underscore. Punctuation and other characters are not allowed. When you need to use the value of a variable within a statement, you need to evaluate it. Evaluating a variable substitutes its name with its value. The $ placed before a variable name performs such an evaluation. To use a variable's value as an operand in an expression, you need to evaluate the variable by preceding its name with the $. In the next example, the value 5 is assigned to the mynum variable. Then mynum is evaluated in an expression, $mynum, providing its value, 5, as an operand in that expression. set mynum 5 expr 10 * $mynum Should you want to make the value of a variable part of string, you only need to evaluate it within that string. The value of the variable becomes part of the string. In the following statement, the value of the variable myname is used as part of a string. In this case, the string will be "My name is Larisa". set myname "Larisa" set mystr "My name is $myname" Certain commands are designed to operate on variables. The append command concatenates a string to a variable. The incr command will increment an integer, and the unset command will undefine a variable. The different commands that operate on variables are listed in Table 5. Table 5: Assignments: and Variables Commands Description set Assign a value to a variable global Declare global variables incr Increment a variable by an integer value unset Delete variables upvar Reference a variable in a different scope variable Declare namespace variables Table 5: Assignments: and Variables Commands Description array Array access operations like searches expr Math expressions Arrays Array elements are defined and assigned values using the set command with the index encased in parentheses. The following example assigns the string "rain" as the second element in the weather array: set weather(2) rain You can then reference the element using its index encased in parentheses with the array name preceded with a $. puts $weather(2) rain Tcl allows the use of any word string as an index, in effect supporting associative arrays. The string used as the index is encased within parentheses next to the array name. The following statements add two elements to the city array with the index strings Napa and Alameda: set city(Napa) 34 set city(Alameda) 17 Control Structures Tcl has a set of control structures similar to those used in the Perl, Gawk, C shell, and C programming languages. Tcl has loops with which you can repeat commands and conditions that allow you to choose among specified commands. Table 6 lists the Tcl control structures. Control structures in Tcl often make use of a block of Tcl commands. A block of commands consists of Tcl commands enclosed in braces. The opening brace ({) will begin on the same line as that of the control structure that uses it. On following lines, there can be several Tcl commands, each on its own line. The block ends with a closing brace (}) on a line by itself. A block is literally an argument to a Tcl command. The block is passed to a control structure command, and the control structure will execute the commands in that block. if The if control structure allows you to select alternative actions. The if command takes two arguments, a test expression and a Tcl command or block of commands. Each is encased in its own set of braces. The test expression is used to determine if the Tcl commands will be executed. If the test expression is true, the commands are performed. If not, the commands are skipped. Below is the syntax for the if structure. You can specify alternative commands to execute if the expression is false by attaching an else block with those Tcl commands. You can nest if structures using the elseif command. Table 6: Tcl: Control Structures Control Structures Description if Conditional command, extend with else and elseif blocks switch Switch selection structure while The while loop for The for loop, like the C for loop foreach Loop through a list, or lists, of values break Forced loop exit if {test-expression} { Tcl commands } elseif {test-expression} { Tcl commands } else { Tcl commands } Note Keep in mind that the else and elseif keywords must be on the same line as the closing brace of the previous block, as in } elseif { test-expression} { . The opening brace of the next block must also be on the same line. switch The switch structure chooses among several possible alternatives. The choice is made by comparing a string value with several possible patterns. Each pattern has its own block of Tcl commands. If a match is found, the associated block is executed. The default keyword indicates a pattern that matches anything. If all of the other matches fail, the block associated with the default keyword is executed. The switch structure begins with the keyword switch, the options prefixed with -, and the string pattern to be matched, followed by a block containing all the patterns with their blocks. The syntax for the switch structure is described next: switch -options string-pattern { pattern { Tcl commands } pattern { Tcl commands } default { Tcl commands } } Options specify the pattern-matching capabilities. The following options are supported: -exact Use exact matching when comparing string to a pattern. This is the default. -glob When matching string to the patterns, use glob style matching. -regexp When matching string to the patterns, use regular expression matching (i.e., the same as implemented by the regexp command). «— Marks the end of options. The argument following this one will be treated as a string even if it starts with a -. The -regexp option lets you match any regular expression, whereas -glob lets you use the shell filename matching methods. With -glob, the shell special characters *, [], ? let you easily match on part of a string. With the -regexp option, you can match on complex alternative strings, specifying multiple instances of characters, the beginning or end of a string, and classes of characters. For example, to match on all filenames with the .c extension, you would use the following command: switch -glob *.c To match on words that end with a number, like "report17" and "report32," you could use the following command: switch -regexp report[0-9]* while The while loop repeats commands. In Tcl, the while loop begins with the while command and takes two arguments, an expression, and either a single Tcl command or a block of Tcl commands. The expression is encased in braces. A block of Tcl commands begins with an opening brace on the same line as the while command. Then, on following lines are the Tcl commands that will be repeated in the loop. The block ends with a closing brace, usually on a line by itself. The syntax for the while loop with a single statement is described here: while {expression } { Tcl commands } for The for loop performs the same tasks as the while loop. However, it has a different format. The for loop takes four arguments, the first three of which are expressions and the last of which is a block of Tcl commands. The first three arguments are expressions that incorporate the initialization, test, and increment components of a loop. These expressions are each encased in braces. The last argument, the block of Tcl commands, begins with an opening brace and then continues with Tcl commands on the following lines, ending with a closing brace: for {expression1} {expression2} {expression3} { Tcl commands; } foreach The foreach structure is designed to sequentially reference a list of values. It is very similar to the C shell's for-in structure. The foreach structure takes three arguments: a variable, a list, and a block of Tcl commands. Each value in the list is assigned to the variable in the foreach structure. Like the while structure, the foreach structure is a loop. Each time through the loop, the next value in the list is assigned to the variable. When the end of the list is reached, the loop stops. As in the while loop, the block of Tcl commands is encased in braces. The syntax for the foreach loop is described here: foreach variable ( list of values ) { tcl commands } Tcl Input and Output: gets and puts Tcl can read input from the standard input or a file using the gets command and write output to the standard output with the puts command. The following command reads a line from the standard input, usually the keyboard. The input is placed in the variable line. gets line The puts command outputs a string to the standard output or to a file. It takes as its argument the string to be output. puts $line. gets reads a line into the variable specified as its argument. You can then use this variable to manipulate whatever has been read. For example, you can use line in a puts command to display what was input. myread #!/usr/bin/tclsh gets line puts "This is what I entered: $line" $ myread larisa and aleina This is what I entered: larisa and aleina You can use the puts command to write data to any file or to the standard output. File handle names are placed after the puts command and before any data such as strings or variables. If no filename is specified, then puts outputs to the standard output. To output formatted values, you can use the results of a format command as the argument of a puts command. format performs a string conversion operation on a set of values, formatting them according to conversion specifiers in a format string. puts [format "%s" $myname] If you want to output different kinds of values in a puts operation, you can use the format command to first transform them into a single string. The puts command will only output a single string. In the following example, the contents of the $firstname and $age variables are output as a single string by first using the format command with two string specifiers, "%s %d", to make them one string. %d will transform a numeric value into its corresponding character values. puts [format "%s %d" $firstname $age] For string values, you can just make them part of the single string by placing them within double quotes. In this example, firstname and lastname are made part of the same string: puts "$firstname $lastname" Tcl File Handles You use the open command to create a file handle for a file or pipe (see Table 7 for a list of Tcl file commands). The open command takes two arguments, the filename and the file mode, and returns a file handle that can then be used to access the file. The filename argument can be the name of the file or a variable that holds the name of the file. The file mode is the permissions you are opening the file with. This can be r for read-only, w for write-only, and a for append only. To obtain both read and write permission for overwriting and updating a file, you attach a + to the file mode. r+ gives you read and write permission. The syntax for open follows: open ( filename-string, file-mode ); Table 7: Tcl: File Access and Input/Output Commands File Access Commands Description file Obtain file information open Open a file close Close a file eof Check for end of file fcopy Copy from one file to another flush Flush output from a file's internal buffers glob Match filenames using glob pattern characters read Read blocks of characters from a file seek Set the seek offset of a file tell Return the current offset of a file socket Open a TCP/IP network connection Input/Output Commands format Format a string with conversion specifiers, like sprintf in C scan Read and convert elements in a string using conversion specifiers, like scanf in C gets Read a line of input puts Write a string to output You would usually use the open command in a set command so that you can assign the file handle returned by open to a variable. You can then use that file handle in that variable in other file commands to access the file. In the next example, the user opens the file reports with a file mode for reading, r, and assigns the returned file handle to the myfile variable. set myfile [open "reports" r] Often, the filename will be held in a variable. You then use the $ with the variable name to reference the filename. In this example, the filename reports is held in the variable filen: set myfile [open $filen r] Once you have finished with the file, you close it with the close command. close takes as its argument the file handle of the file you want to close. close $myfile With the gets and puts commands, you can use a file handle to read and write from a specific file. gets takes two arguments: a file handle and a variable. It will read a line from the file referenced by the file handle and place it as a string in the variable. If no file handle is specified, then gets reads from the standard input. The following command reads a line from a file using the file handle in the myfile variable. The line is read into the line variable. gets $myfile line The puts command also takes two arguments: a file handle and a string. It will write the string to the file referenced by the file handle. If no file handle is specified, then puts will write to the standard output. In the following example, puts writes the string held in the line variable to the file referenced by the file handle held in myfile. Notice that there is a $ before line in the puts command, but not in the previous gets command. puts operates on a string, whereas gets operates on a variable. puts $myfile $line myreport #!/usr/bin/tclsh set reps [open "reports" r ] while ( gets $reps line) { puts $line; } close reps You can use the file command to check certain features of files, such as whether they exist or if they are executable. You can also check for directories. The file command takes several options, depending on the action you want to take. The exist option checks whether a file exists, and the size option tells you its size. The isdirectory option determines whether the file is a directory, and isfile checks to see whether it is a file. With the executable, readable, and writable options, you can detect whether a file is executable, can be read, or can be written to. The dirname option displays the full pathname of the file, and the extension and root name options show the extension or root name of the file, respectively. The atime, mtime, and owned options display the last access time and the modification time, and whether it is owned by the user. file exits reps file isfile reps file size reps file executable myreport Often filenames will be used as arguments to Tcl programs. In this case, you can use the argv list to obtain the filenames. The argv command lists all arguments entered on the command line when the Tcl script was invoked. You use the lindex command to extract a particular argument from the argv list. Many programs use filenames as their arguments. Many also specify options. Remember that the lindex command indexes a list from 0. So the first argument in the argv list would be obtained by the following (be sure to precede argv with the $): lindex $argv 0 You can, if you wish, reference an argument in the argv list within the open command. Here, the lindex operation is enclosed in braces, in place of the filename. The lindex command will return the filename from the argv list. set shandle [ open {lindex $argv 1} r ] Tk The Tk application extends Tcl with commands for creating and managing graphic objects such as windows, icons, buttons, and text fields. Tk commands create graphic objects using the X Window System. It is an easier way to program X Window objects than using the X11 Toolkit directly. With Tk, you can easily create sophisticated window-based user interfaces for your programs. The Tk language is organized according to different types of graphic objects such as windows, buttons, menus, and scroll bars. Such objects are referred to as widgets. Each type of widget has its own command with which you can create a widget. For example, you can create a button with the button command or a window with the window command. A type of widget is considered a class, and the command to create such a widget is called a class command. The command will create a particular instance of that class, a particular widget of that type. button is the class command for creating a button. Graphical objects such as buttons and frames are also often referred to as widgets. Table 8 lists the different widgets available in Tk. Table 8: Standard: TK Widgets Widget Description button A button canvas A window for drawing objects checkbutton A check button entry An input box frame A frame is a simple widget. Its primary purpose is to act as a spacer or container for complex window layouts image Create image objects for displaying pictures label A label listbox A list box with a selectable list of items menu A menu bar menubutton A menu button to access the menu message Create and manipulate message widgets radiobutton A radio button scrollbar A scroll bar text An editable text box scale A scale Note Several currently available Tcl/Tk GUI builders are Free Visual Tcl, SpecTcl, VisualGIPSY, and XF. These are freely available, and you can download them from their Web sites or from the Tcl Developer Xchange The wish Shell and Scripts Tk operates under the X Window System. Within the X Window System, Tk uses its own shell, the wish shell, to execute Tk commands. To run Tk programs, you first start up your X- Window System and then start up the wish shell with the command wish. This will open up a window in which you can then run Tk commands. You execute Tk commands within the wish shell interactively, entering commands and executing them one by one, or you can place the commands in a script file and execute them all at once. Usually, Tk commands are placed in a script that is then run with the invocation of the wish command. Like Tcl scripts, Tk scripts usually have the extension .tcl. For example, a Tk script called mydir.tcl would be read and executed by the following command entered in an Xterm window: $ wish mydir.tcl To create a standalone script that operates more like a command, you need to invoke the wish command within the script. Ordinarily the wish command will open an interactive Tk shell window whenever executed. To avoid this, you should invoke wish with the -f option. #!/usr/bin/wish -f Note When creating a standalone script, be sure to change its permissions with the chmod command to allow execution. You can then just enter the name of the script to run the program. $ chmod 755 mydir1 $ ./mydir1 Tk Widgets Tk programs consist of class commands that create various graphic widgets. The class command takes as its arguments the name you want to give the particular widget followed by configuration options with their values (see Table 9). Tk commands have a format similar to Tcl. You enter a Tk class command on a line, beginning with the name of the command followed by its arguments. Tk commands are more complicated than Tcl commands. Graphic interface commands require a significant amount of information about a widget to set it up. For example, a button requires a name, the text it will display, and the action it will take. Table 9: Tk: Commands Event Operations Description Bind Associate Tcl scripts with X events Bindtags Bind commands to tags Selection Object or text selected by mouse Geometry Managers Pack Pack widgets next to each other Place Place widgets in positions in frame Grid Place widgets in a grid of rows and columns Window Operations Destroy Close a TK window Toplevel Select the top-level window Wm Set window features Uplevel Move up to previous window level Many Tk commands can take various options indicating different features of a widget. Table 10 lists several options commonly used for Tk widgets. In the following example, a button is created using the button command. The button command takes as its first argument the name of the button widget. Then, different options define various features. The -text option is followed by a string that will be the text displayed by the button. The -command option is followed by the command that the button executes when it is clicked. This button command will display a button with the text "Click Me". When you click it, the Tk shell will exit. button .mybutton -text "Click Me" -command exit Table 10: Tk: Commonly Used Standard Options Button Description -activebackground Specifies background color to use when drawing active elements -activeborderwidth Width of the 3-D border drawn around active elements -activeforeground Foreground color to use when drawing active elements -anchor How information is displayed in the widget; must be one of the values n, ne, e, se, s, sw, w, nw, or center -background The normal background color to use when displaying the widget -font The font to use when drawing text inside the widget -foreground The normal foreground color to use when displaying the widget -geometry Specifies the desired geometry for the widget's window -image Specifies an image to display in the widget -insertbackground Color to use as background in the area covered by the insertion cursor -insertborderwidth Width of the 3-D border to draw around the insertion cursor -insertofftime Number of milliseconds the insertion cursor should remain "off" in each blink cycle -relief Specifies the 3-D effect desired for the widget -selectbackground Specifies the background color to use when displaying selected items -text String to be displayed inside the widget Button Options -command Specifies a Tcl command to associate with the button -selectimage Image to display when the check button is selected -height Height for the button -state Specifies one of three states for the radio button: normal, active, or disabled -variable Global variable to set to indicate whether or not this button is selected -width Width for the button To set up a working interface, you need to define all the widgets you need to perform a given task. Some widgets are designed to manage other widgets; for instance, scroll bars are designed to manage windows. Other widgets, such as text input fields, may interact with a Tcl program. A menu choice may take the action of running part of a Tcl program. Widgets are organized hierarchically. For example, to set up a window to input data, you may need a frame, within which may be text field widgets as well as buttons. Widget names reflect this hierarchy. The widget contained within another widget is prefixed with that widget's name. If the name of the frame is report and you want to call the text input field monday, the text input field will have the name report.monday. A period separates each level in the hierarchy. A button that you want to call ok that is within the report frame would be named report.ok. Once you have created your widgets, their geometry has to be defined. The geometry determines the size of each widget in relation to the others, and where they are placed in the window. Tk has three geometry managers, pack, place, and grid. The pack command is used in these examples. When you have defined your widgets, you issue a geometry manager command on them to determine their size and shape on the screen. Note Your widgets cannot be displayed until their geometry is determined. The following determines the geometry of the .mybutton widget using the pack command: pack .mybutton The mydir1 program is a simple Tcl/Tk program to display a list of file and directory names in a Tk listbox widget with an attached scroll bar. Figure 1 shows this list box. With a listbox widget, you can display a list of items that you can then easily scroll through. Using the mouse, you can select a particular item. If a scroll bar is attached, you can scroll through the displayed items if there are more than can fit in the designated size of the list box. First the scroll bar is defined using the scrollbar command, giving it the name .scroll and binding it with the command .list yview. This instructs the scroll bar to be attached to the list box on a y- axis, vertical. Figure 1: The mydir1 Tk list box scrollbar .scroll -command ".list yview" Then, the list box is defined with the listbox command, giving it the name .list and a y-axis scroll capability provided by the .scroll widget. The list box will appear sunken with the specified width and height. listbox .list -yscroll ".scroll set" -relief sunken \ -width 15 -height 15 -setgrid yes The two widgets are then created with the pack command and positioned in the window. They are placed on the left side of the window and will always expand to fill the window. The anchor is on the west side of the window, w. The list box, .list, is placed first, followed by the scroll bar, .scroll. pack .list .scroll -side left -fill both -expand yes -anchor w A Tcl if test then follows that checks if the user entered an argument when the program was invoked. The if test checks to see if there is a first element in the argv list where any arguments are held. If there are no arguments, the current directory is used, as represented by the period. This chosen directory is assigned to the dir variable. A Tcl foreach operation is then used to fill the list box. The shell ls command, as executed with the exec command, obtains the list of files and directories. Each is then placed in the list box with the Tk insert operation for the .list widget. The insert command takes a position and a value. Here, the value is a filename held in $i that is placed at the end of the list. .list insert end $i The CTRL-C character is then bound to the exit command to allow you to easily close the window. A listing of the mydir1 program follows. mydir1 #!/usr/bin/wish -f # Create a scroll bar and listbox scrollbar .scroll -command ".list yview" listbox .list -yscroll ".scroll set" -relief sunken -width 15 -height 15 -setgrid yes pack .list .scroll -side left -fill both -expand yes -anchor w # If user enters a directory argument use that, otherwise use current directory. if {$argc > 0} then { set dir [lindex $argv 0] } else { set dir "." } # Fill the listbox (.list) with the list of files and directories obtained from ls cd $dir foreach i [exec ls -a ] { if [file isfile $i] { .list insert end $i } } # Set up bindings for the file manager. Control-C closes the window. bind all {destroy .} To run the mydir1 program, first make it executable using the chmod command to set the executable permissions, as shown here: chmod 755 mydir1 Then, within a terminal window on your desktop or window manager, just enter the mydir1 command at the prompt. You may have to precede it with a ./ to indicate the current directory. ./mydir1 A window will open with a list box displaying a list of files in your current working directory (see Figure 1). Use the scroll bar to display any filenames not shown. Click the window Close box to close the program. Events and Bindings A Tk program is event driven. Upon running, it waits for an event such as a mouse event or a keyboard event. A mouse event can be a mouse click or a double-click, or even a mouse down or up. A keyboard event can be a CTRL key or meta key, or even the ENTER key at the end of input data. When the program detects a particular event, it takes an action. The action may be another graphical operation such as displaying another menu, or it may be a Tcl, Perl, or shell program. Bindings are the key operational component of a Tk program. Bindings detect the events that drive a Tk program. You can think of a Tk program as an infinite loop that continually scans for the occurrence of specified events (bindings). When it detects such an event, such as a mouse click or control key, it executes the actions bound to that event. These actions can be any Tcl/Tk command or series of commands. Usually, they call functions that can perform complex operations. When finished, the program resumes its scanning, looking for other bound events. This scanning continues indefinitely until it is forcibly broken by an exit or destroy command, as is done with the CTRL-C binding. You can think of bindings as multiple entry points where different parts of the program begin. It is not really the same structure as a traditional hierarchical sequential program. You should think of a binding as starting its own sequence of commands, its own program. This means that to trace the flow of control for a Tk program, you start with the bindings. Each binding has its own path, its own flow of control. Actions are explicitly bound to given events using the bind command. The bind command takes as its arguments the name of a widget or class, the event to bind, and the action to bind to that event. Whenever the event takes place within that widget, the specified action is executed. bind .myframe {.myframe delete insert } You use the bind command to connect events in a Tk widget with the Tcl command you want executed. In a sense, you are dividing your Tcl program into segments, each of which is connected to an event in a Tk widget. When an event takes place in a Tk widget, its associated set of Tcl commands is executed. Other Tk commands, as well as Tcl commands, can be associated with an event bound to a Tk widget. This means that you can nest widgets and their events. The Tcl commands executed by one Tk event may, in turn, include other Tk commands and widgets with events bound to yet other Tcl commands. Expect Expect has several commands that you can use to automatically interact with any Unix program or utility that prompts you for responses. For example, the login procedure for different systems using FTP or telnet can be automatically programmed with Expect commands. Expect is designed to work with any interactive program. It waits for a response from a program and will then send the response specified in its script. You can drop out of the script with a simple command and interact with the program directly. Three basic Expect commands are the send, expect, and interact commands. The expect command will wait to receive a string or value from the application you are interacting with. The send command will send a string to that application. The interact command places you into direct interaction with the application, ending the Expect/Tcl script. In the following script, Expect is used to perform an anonymous login with FTP. The spawn command starts up the FTP program. The Internet address of the FTP site is assumed to be an argument to this script, and as such will be held in the argv list. In place of $argv, you could put the name of a particular FTP site. The myftp.expect script that follows will set up an ftp connection automatically. myftp.expect #!/usr/bin/expect spawn ftp send "open $argv\r" expect "Name" send "anonymous\r" expect "word:" send "richlp@turtle.mytrek.com\r" interact To run Expect commands, you have to first enter the Expect shell. In the previous myftp.expect script, the Expect shell is invoked with the command #!/usr/bin/expect. Be sure to add execute permission with chmod 755 myftp.expect: $myftp ftp.calderasystems.com The expect command can take two arguments: the pattern to expect and an action to take if the pattern is matched. expect can also take as its argument a block of pattern/action arguments. In this case, expect can match on alternative patterns, executing the action only for the pattern it receives. For example, the ftp command may return a "connection refused" string instead of a "name" string. In that case, you would want to issue this message and exit the Expect script. If you want more than one action taken for a pattern, you can encase them in braces, separated by semicolons. Another useful Expect command is timeout. You can set the timeout command to a number of seconds, then have Expect check for the timeout. To set the number of seconds for a timeout, you use set to assign it to the timeout variable (the default is 10 seconds). To have the expect command detect a timeout, you use the word timeout as the expect command's pattern. With the timeout, you can add an action to take. An example of an Expect script follows: set timeout 20 end "open $argv\r" expect { timeout {puts "Connection timed out\n"; exit } "Connection refused" {puts "Failed to connect\n"; exit} "Unknown host" {puts "$argv is unknown\n"; exit} "Name" } Expect can run with any kind of program that requires interaction. All you need to do is to determine the sequence of prompts and responses you want. Gawk Gawk is a programming language designed to let Linux users create their own shell filters. A filter operates within a Linux shell such as BASH or TCSH. It reads information from an input source such as a file or the standard input, modifies or analyzes that information, and then outputs the results. Results can be a modified version of the input or an analysis. For example, the sort filter reads a file and then outputs a sorted version of it, generating output that can be sorted alphabetically or numerically. The wc filter reads a file and then calculates the number of words and lines in it, outputting just that information. The grep filter will search a file for a particular pattern, outputting the lines the pattern is found on. With Gawk, you can design and create your own filters, in effect creating your own Linux commands. You can instruct Gawk to simply display lines of input text much like cat, or to search for patterns in a file like grep, or even count words in a file like wc. In each case, you could add your own customized filtering capabilities. You could display only part of each line, or search for a pattern in a specific field, or count only words that are capitalized. This flexibility lets you use Gawk to generate reports, detecting patterns and performing calculations on the data. You can use Gawk directly on the shell command line, or you can place Gawk within a shell file that you can then execute. The name of the shell file can be thought of as a new filter that you have created. In effect, with Gawk, you can define your own filters. In this sense there are two ways of thinking about Gawk. Gawk is itself a filter that you can invoke on the command line like any other filter, and Gawk is a programmable filter that you can use to create your own filters. This section will examine both aspects of Gawk. First we will examine Gawk as a filter, with all its different features. Then, we will see how you can use Gawk to define your own filters. The Gawk utility has all the flexibility and complexity of a programming language. Gawk has a set of operators that allow it to make decisions and calculations. You can also declare variables and use them in control structures to control how lines are to be processed. Many of the programming features are taken from the C programming language and share the same syntax. All of this makes for a very powerful programming tool. Gawk is the GNU version of the Unix Awk utility. Awk was originally created as a standard utility for the Unix operating system. One of its creators is Brian Kernighan, who developed the Unix operations system. An enhanced version of Awk called Nawk was developed later to include file handling. With Nawk, you can access several files in the same program. Gawk is a further enhancement, including the added features of Nawk as well as the standard capabilities of Awk. Gawk has a full set of arithmetic operators. You can perform multiplication, division, addition, subtraction, and modulo calculations. The arithmetic operators are the same as those used in the C programming language and Perl. Gawk also supports both scalar and associative arrays. Gawk has control structures similar to those in the C programming language, as well as pattern matching and string functions similar to those in Perl and Tcl/Tk. You can find out more about Gawk at www.gnu.org/software/gawk. The gawk Command The gawk command takes as its arguments a Gawk instruction and a list of filenames. The Gawk instruction is encased in single quotes and is read as one argument. The Gawk instruction itself consists of two segments: a pattern and an action. The action is enclosed in brackets. The term "pattern" can be misleading. It is perhaps clearer to think of the pattern segment as a condition. The pattern segment can be either a pattern search or a test condition of the type found in programming languages. The Gawk utility has a full set of operators with which to construct complex conditions. You can think of a pattern search as just one other kind of condition for retrieving records. Instead of simply matching patterns as in the case of grep, the user specifies a condition. Records that meet that condition are then retrieved. The actions in the action segment are then applied to the record. The next example shows the syntax of a Gawk instruction, which you can think of as condition {action}: pattern {action} The Gawk utility operates on either files or the standard input. You can list filenames on the command line after the instruction. If there are no filenames listed, input is taken from the standard input. The example below shows the structure of the entire Gawk instruction. The invocation of Gawk consists of the gawk keyword followed by a Gawk instruction and filenames. As with the sed commands, the instruction should be placed within single quotes to avoid interpretation by the shell. Since the condition and action are not separate arguments for Gawk, you need to enclose them both in one set of quotes. The next example shows the syntax of a gawk command: $ gawk 'pattern action { }' filenames You can think of the pattern in a Gawk instruction as referencing a line. The Gawk action is then performed on that line. The next two examples below print all lines with the pattern "Penguin". The pattern segment is a pattern search. A pattern search is denoted by a pattern enclosed in slashes. All records with this pattern are retrieved. The action segment in the first example contains the print command. The print command outputs the line to the standard output. books Tempest Shakespeare 15.75 Penguin Christmas Dickens 3.50 Academic Iliad Homer 10.25 Random Raven Poe 2.50 Penguin $ gawk '/Penguin/{print}' books Tempest Shakespeare 15.75 Penguin Raven Poe 2.50 Penguin Tip Both the action and pattern have defaults that allow you to leave either of them out. The print action is the default action. If an action is not specified, the line is printed. The default pattern is the selection of every line in the text. If the pattern is not specified, the action is applied to all lines. In the second example, there is no action segment. The default action is then used, the print action. $ gawk '/Penguin/' books Tempest Shakespeare 15.75 Penguin Raven Poe 2.50 Penguin Pattern Searches and Special Characters Gawk can retrieve lines using a pattern search that contains special characters. The pattern is designated with a beginning and ending slash, and placed in the pattern segment of the Gawk instruction. /pattern/ {action} The pattern search is performed on all the lines in the file. If the pattern is found, the action is performed on the line. In this respect, Gawk performs very much like an editing operation. Like sed, a line is treated as a line of text and the pattern is searched for throughout the line. In the next example, Gawk searches for any line with the pattern "Poe". When a match is found, the line is output. $ gawk '/Poe/{print}' books Raven Poe 2.50 Penguin You can use the same special characters for Gawk that are used for regular expressions in the sed filter and the Ed editor. The first example below searches for a pattern at the beginning of the line. The special character ^ references the beginning of a line. The second example searches for a pattern at the end of a line using the special character $: $ gawk '/^Christmas/{print}' books Christmas Dickens 3.50 Academic $ gawk '/Random$/{print}' books Iliad Homer 10.25 Random As in Ed and sed, you can use special characters to specify variations on a pattern. The period matches any character, the asterisk matches repeated characters, and the brackets match a class of characters: ., *, and []. In the first example below, the period is used to match any pattern in which a single character is followed by the characters "en": $ gawk '/.en/{print}' books Tempest Shakespeare 15.75 Penguin Christmas Dickens 3.50 Academic Raven Poe 2.50 Penguin The next example uses the brackets and asterisk special characters to specify a sequence of numbers. The set of possible numbers is represented by the brackets enclosing the range of numeric characters [0–9]. The asterisk then specifies any repeated sequence of numbers. The context for such a sequence consists of the characters ".50". Any number ending with .50 will be matched. Notice that the period is quoted with a backslash to treat it as the period character, not as a special character. $ gawk '/[0-9]*\.50/ {print}' books Christmas Dickens 3.50 Academic Raven Poe 2.50 Penguin Gawk also uses the extended special characters: +, ?, and |. The + and ? are variations on the * special character. The + matches one or more repeated instances of a character. The ? matches zero or one instance of a character. The | provides alternative patterns to be searched. In the next example, the user searches for a line containing either the pattern "Penguin" or the pattern "Academic": $ gawk '/Penguin|Academic/ {print}' books Tempest Shakespeare 15.75 Penguin Christmas Dickens 3.50 Academic Raven Poe 2.50 Penguin Variables Gawk provides for the definition of variables and arrays. It also supports the standard kind of arithmetic and assignment operators found in most programming languages such as C. Relational operators are also supported. In Gawk, there are three types of variables: field variables, special Gawk variables, and user- defined variables. Gawk automatically defines both the field and special variables. The user can define his or her own variables. You can also define arithmetic and string constants. Arithmetic constants consist of numeric characters, and string constants consist of any characters enclosed within double quotes. Field variables are designed to reference fields in a line. A field is any set of characters separated by a field delimiter. The default delimiter is a space or tab. As with other database filters, Gawk numbers fields from 1. This is similar to the number used for arguments in shell scripts. Gawk defines a field variable for each field in the file. A field variable consists of a dollar sign followed by the number of the field. $2 references the second field. The variable $0 is a special field variable that contains the entire line. Tip A variable may be used in either the pattern or action segment of the Gawk instruction. If more than one variable is listed, they are separated by commas. Notice that the dollar sign is used differently in Gawk than in the shell. In the next example, the second and fourth fields of the books file are printed out. The $2 and $4 reference the second and fourth fields. books Tempest Shakespeare 15.75 Penguin Christmas Dickens 3.50 Academic Iliad Homer 10.25 Random Raven Poe 2.50 Penguin $ gawk '{print $2, $4}' books Shakespeare Penguin Dickens Academic Homer Random Poe Penguin In the next example, the user outputs the line with the pattern "Dickens" twice—first reversing the order of the fields and then with the fields in order. The $0 is used to output all the fields in order, the entire line. $ gawk '/Dickens/ {print $4, $3, $2, $1; print $0}' books Academic 3.50 Dickens Christmas Christmas Dickens 3.50 Academic Gawk defines a set of special variables that provide information about the line being processed. The variable NR contains the number of the current line (or record). The variable NF contains the number of fields in the current line. There are other special variables that hold the field and record delimiters. There is even one, FILENAME, that holds the name of the input file. The Gawk special variables are listed in Table 11. Table 11: Gawk: Special Variables Variables Description NR Record number of current record NF Number of fields in current record $0 The entire current record $n The fields in the current record, numbered from 1—for example, $1 FS Input field delimiter; default delimiter is space or tab FILENAME Name of current input file Both special variables and user-defined variables do not have a dollar sign placed before them. To use such variables, you only need to specify their name. The next example combines both the special variable NR with the field variables $2 and $4 to print out the line number of the line followed by the contents of fields two and four. The NR variable holds the line number of the line being processed. $ gawk '{print NR, $2, $4}' books 1 Shakespeare Penguin 2 Dickens Academic 3 Homer Random 4 Poe Penguin You can also define your own variables, giving them any name you want. Variables can be named using any alphabetic or numeric characters as well as underscores. The name must begin with an alphabetic character. A variable is defined when you first use it. The type of variable is determined by the way it is used. If you use it to hold numeric values, the variable is considered arithmetic. If you use it to hold characters, the variable is considered a string. You need to be consistent in the way in which you use a variable. String variables should not be used in arithmetic calculations and vice versa. You assign a value to a variable using the assignment operator, =. The left-hand side of an assignment operation is always a variable and the right-hand side is the value assigned to it. A value can be the contents of a variable such as a field, special, or other user variable. It can also be a constant. In the next example, the user assigns the contents of the second field to the variable myfield: $ gawk '{myfield = $2; print myfield}' books Shakespeare Dickens Homer Poe By default, Gawk separates fields by spaces or tabs. However, if you want to use a specific delimiter, you need to specify it. The -F option allows Gawk to detect a specific delimiter. The -F option actually sets a Gawk special variable called FS, which stands for field separator. With the -F option, you can use any character you want for your delimiter.

Các file đính kèm theo tài liệu này:

  • pdfRed Hat Linux The Complete Reference Second Edition.pdf
Tài liệu liên quan