home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / riscbsd / 1_1_contri / usd / 04_csh / csh_3 < prev    next >
Encoding:
Text File  |  1986-05-23  |  15.1 KB  |  624 lines

  1. .\" Copyright (c) 1980 Regents of the University of California.
  2. .\" All rights reserved.  The Berkeley software License Agreement
  3. .\" specifies the terms and conditions for redistribution.
  4. .\"
  5. .\"    @(#)csh.3    6.1 (Berkeley) 5/23/86
  6. .\"
  7. .nr H1 2
  8. .NH
  9. Shell control structures and command scripts
  10. .NH 2
  11. Introduction
  12. .PP
  13. It is possible to place commands in files and to cause shells to be
  14. invoked to read and execute commands from these files,
  15. which are called
  16. .I "shell scripts."
  17. We here detail those features of the shell useful to the writers of such
  18. scripts.
  19. .NH 2
  20. Make
  21. .PP
  22. It is important to first note what shell scripts are
  23. .I not
  24. useful for.
  25. There is a program called
  26. .I make
  27. which is very useful for maintaining a group of related files
  28. or performing sets of operations on related files.
  29. For instance a large program consisting of one or more files
  30. can have its dependencies described in a
  31. .I makefile
  32. which contains definitions of the commands used to create these
  33. different files when changes occur.
  34. Definitions of the means for printing listings, cleaning up the directory
  35. in which the files reside, and installing the resultant programs
  36. are easily, and most appropriately placed in this
  37. .I makefile.
  38. This format is superior and preferable to maintaining a group of shell
  39. procedures to maintain these files.
  40. .PP
  41. Similarly when working on a document a
  42. .I makefile
  43. may be created which defines how different versions of the document
  44. are to be created and which options of
  45. .I nroff
  46. or
  47. .I troff
  48. are appropriate.
  49. .NH 2
  50. Invocation and the argv variable
  51. .PP
  52. A
  53. .I csh
  54. command script may be interpreted by saying
  55. .DS
  56. % csh script ...
  57. .DE
  58. where
  59. .I script
  60. is the name of the file containing a group of
  61. .I csh
  62. commands and
  63. `\&...' is replaced by a sequence of arguments.
  64. The shell places these arguments in the variable
  65. .I argv
  66. and then begins to read commands from the script.
  67. These parameters are then available through the same mechanisms
  68. which are used to reference any other shell variables.
  69. .PP
  70. If you make the file
  71. `script'
  72. executable by doing
  73. .DS
  74. chmod 755 script
  75. .DE
  76. and place a shell comment at the beginning of the shell script
  77. (i.e. begin the file with a `#' character)
  78. then a `/bin/csh' will automatically be invoked to execute `script' when
  79. you type
  80. .DS
  81. script
  82. .DE
  83. If the file does not begin with a `#' then the standard shell
  84. `/bin/sh' will be used to execute it.
  85. This allows you to convert your older shell scripts to use
  86. .I csh
  87. at your convenience.
  88. .NH 2
  89. Variable substitution
  90. .PP
  91. After each input line is broken into words and history substitutions
  92. are done on it, the input line is parsed into distinct commands.
  93. Before each command is executed a mechanism know as
  94. .I "variable substitution"
  95. is done on these words.
  96. Keyed by the character `$' this substitution replaces the names
  97. of variables by their values.
  98. Thus
  99. .DS
  100. echo $argv
  101. .DE
  102. when placed in a command script would cause the current value of the
  103. variable
  104. .I argv
  105. to be echoed to the output of the shell script.
  106. It is an error for
  107. .I argv
  108. to be unset at this point.
  109. .PP
  110. A number of notations are provided for accessing components and attributes
  111. of variables.
  112. The notation
  113. .DS
  114. $?name
  115. .DE
  116. expands to `1' if name is
  117. .I set
  118. or to `0'
  119. if name is not
  120. .I set.
  121. It is the fundamental mechanism used for checking whether particular
  122. variables have been assigned values.
  123. All other forms of reference to undefined variables cause errors.
  124. .PP
  125. The notation
  126. .DS
  127. $#name
  128. .DE
  129. expands to the number of elements in the variable
  130. .I name.
  131. Thus
  132. .DS
  133. % set argv=(a b c)
  134. % echo $?argv
  135. 1
  136. % echo $#argv
  137. 3
  138. % unset argv
  139. % echo $?argv
  140. 0
  141. % echo $argv
  142. Undefined variable: argv.
  143. %
  144. .DE
  145. .PP
  146. It is also possible to access the components of a variable
  147. which has several values.
  148. Thus
  149. .DS
  150. $argv[1]
  151. .DE
  152. gives the first component of
  153. .I argv
  154. or in the example above `a'.
  155. Similarly
  156. .DS
  157. $argv[$#argv]
  158. .DE
  159. would give `c',
  160. and
  161. .DS
  162. $argv[1\-2]
  163. .DE
  164. would give `a b'. Other notations useful in shell scripts are
  165. .DS
  166. $\fIn\fR
  167. .DE
  168. where
  169. .I n
  170. is an integer as a shorthand for
  171. .DS
  172. $argv[\fIn\fR\|]
  173. .DE
  174. the
  175. .I n\|th
  176. parameter and
  177. .DS
  178. $*
  179. .DE
  180. which is a shorthand for
  181. .DS
  182. $argv
  183. .DE
  184. The form
  185. .DS
  186. $$
  187. .DE
  188. expands to the process number of the current shell.
  189. Since this process number is unique in the system it can
  190. be used in generation of unique temporary file names.
  191. The form
  192. .DS
  193. $<
  194. .DE
  195. is quite special and is replaced by the next line of input read from
  196. the shell's standard input (not the script it is reading).  This is
  197. useful for writing shell scripts that are interactive, reading
  198. commands from the terminal, or even writing a shell script that
  199. acts as a filter, reading lines from its input file. Thus the sequence
  200. .DS
  201. echo 'yes or no?\ec'
  202. set a=($<)
  203. .DE
  204. would write out the prompt `yes or no?' without a newline and then
  205. read the answer into the variable `a'.  In this case `$#a' would be
  206. `0' if either a blank line or end-of-file (^D) was typed.
  207. .PP
  208. One minor difference between `$\fIn\fR\|' and `$argv[\fIn\fR\|]'
  209. should be noted here.
  210. The form
  211. `$argv[\fIn\fR\|]'
  212. will yield an error if
  213. .I n
  214. is not in the range
  215. `1\-$#argv'
  216. while `$n'
  217. will never yield an out of range subscript error.
  218. This is for compatibility with the way older shells handled parameters.
  219. .PP
  220. Another important point is that it is never an error to give a subrange
  221. of the form `n\-'; if there are less than
  222. .I n
  223. components of the given variable then no words are substituted.
  224. A range of the form `m\-n' likewise returns an empty vector without giving
  225. an error when \fIm\fR exceeds the number of elements of the given variable,
  226. provided the subscript \fIn\fR is in range.
  227. .NH 2
  228. Expressions
  229. .PP
  230. In order for interesting shell scripts to be constructed it
  231. must be possible to evaluate expressions in the shell based on the
  232. values of variables.
  233. In fact, all the arithmetic operations of the language C are available
  234. in the shell
  235. with the same precedence that they have in C.
  236. In particular, the operations `==' and `!=' compare strings
  237. and the operators `&&' and `|\|\||' implement the boolean and/or operations.
  238. The special operators `=~' and `!~' are similar to `==' and `!=' except
  239. that the string on the right side can have pattern matching characters
  240. (like *, ? or []) and the test is whether the string on the left matches
  241. the pattern on the right.
  242. .PP
  243. The shell also allows file enquiries of the form
  244. .DS
  245. \-? filename
  246. .DE
  247. where `?' is replace by a number of single characters.
  248. For instance the expression primitive
  249. .DS
  250. \-e filename
  251. .DE
  252. tell whether the file
  253. `filename'
  254. exists.
  255. Other primitives test for read, write and execute access to the file,
  256. whether it is a directory, or has non-zero length.
  257. .PP
  258. It is possible to test whether a command terminates normally,
  259. by a primitive of the
  260. form `{ command }' which returns true, i.e. `1' if the command
  261. succeeds exiting normally with exit status 0, or `0' if the command
  262. terminates abnormally or with exit status non-zero.
  263. If more detailed information about the execution status of a command
  264. is required, it can be executed and the variable `$status' examined
  265. in the next command.
  266. Since `$status' is set by every command, it is very transient.
  267. It can be saved if it is inconvenient to use it only in the single
  268. immediately following command.
  269. .PP
  270. For a full list of expression components available see the manual
  271. section for the shell.
  272. .NH 2
  273. Sample shell script
  274. .PP
  275. A sample shell script which makes use of the expression mechanism
  276. of the shell and some of its control structure follows:
  277. .DS
  278. % cat copyc
  279. #
  280. # Copyc copies those C programs in the specified list
  281. # to the directory ~/backup if they differ from the files
  282. # already in ~/backup
  283. #
  284. set noglob
  285. foreach i ($argv) 
  286.  
  287.         if ($i !~ *.c) continue  # not a .c file so do nothing
  288.  
  289.         if (! \-r ~/backup/$i:t) then
  290.                 echo $i:t not in backup... not cp\e\'ed
  291.                 continue
  292.         endif
  293.  
  294.         cmp \-s $i ~/backup/$i:t # to set $status
  295.  
  296.         if ($status != 0) then
  297.                 echo new backup of $i
  298.                 cp $i ~/backup/$i:t
  299.         endif
  300. end
  301. .DE
  302. .PP
  303. This script makes use of the
  304. .I foreach
  305. command, which causes the shell to execute the commands between the
  306. .I foreach
  307. and the matching
  308. .I end
  309. for each of the values given between `(' and `)' with the named
  310. variable, in this case `i' set to successive values in the list.
  311. Within this loop we may use the command
  312. .I break
  313. to stop executing the loop 
  314. and
  315. .I continue
  316. to prematurely terminate one iteration
  317. and begin the next.
  318. After the
  319. .I foreach
  320. loop the iteration variable
  321. (\fIi\fR in this case)
  322. has the value at the last iteration.
  323. .PP
  324. We set the variable
  325. .I noglob
  326. here to prevent filename expansion of the members of
  327. .I argv.
  328. This is a good idea, in general, if the arguments to a shell script
  329. are filenames which have already been expanded or if the arguments
  330. may contain filename expansion metacharacters.
  331. It is also possible to quote each use of a `$' variable expansion,
  332. but this is harder and less reliable.
  333. .PP
  334. The other control construct used here is a statement of the form
  335. .DS
  336. \fBif\fR ( expression ) \fBthen\fR
  337.     command
  338.     ...
  339. \fBendif\fR
  340. .DE
  341. The placement of the keywords here is
  342. .B not
  343. flexible due to the current implementation of the shell.\(dg
  344. .FS
  345. \(dgThe following two formats are not currently acceptable to the shell:
  346. .sp
  347. .in +5
  348. .nf
  349. \fBif\fR ( expression )        # \fBWon't work!\fR
  350. \fBthen\fR
  351.     command
  352.     ...
  353. \fBendif\fR
  354. .fi
  355. .in -5
  356. .sp
  357. and
  358. .sp
  359. .in +5
  360. .nf
  361. \fBif\fR ( expression ) \fBthen\fR command \fBendif\fR        # \fBWon't work\fR
  362. .in -5
  363. .fi
  364. .FE
  365. .PP
  366. The shell does have another form of the if statement of the form
  367. .DS
  368. \fBif\fR ( expression ) \fBcommand\fR
  369. .DE
  370. which can be written
  371. .DS
  372. \fBif\fR ( expression ) \e
  373.     command
  374. .DE
  375. Here we have escaped the newline for the sake of appearance.
  376. The command must not involve `\||\|', `&' or `;'
  377. and must not be another control command.
  378. The second form requires the final `\e' to
  379. .B immediately
  380. precede the end-of-line.
  381. .PP
  382. The more general
  383. .I if
  384. statements above also admit a sequence of
  385. .I else\-if
  386. pairs followed by a single
  387. .I else
  388. and an
  389. .I endif,
  390. e.g.:
  391. .DS
  392. \fBif\fR ( expression ) \fBthen\fR
  393.     commands
  394. \fBelse\fR \fBif\fR (expression ) \fBthen\fR
  395.     commands
  396. \&...
  397.  
  398. \fBelse\fR
  399.     commands
  400. \fBendif\fR
  401. .DE
  402. .PP
  403. Another important mechanism used in shell scripts is the `:' modifier.
  404. We can use the modifier `:r' here to extract a root of a filename or
  405. `:e' to extract the
  406. .I extension.
  407. Thus if the variable
  408. .I i
  409. has the value
  410. `/mnt/foo.bar'
  411. then
  412. .sp
  413. .in +5
  414. .nf
  415. % echo $i $i:r $i:e
  416. /mnt/foo.bar /mnt/foo bar
  417. %
  418. .sp
  419. .in -5
  420. .fi
  421. shows how the `:r' modifier strips off the trailing `.bar' and the
  422. the `:e' modifier leaves only the `bar'.
  423. Other modifiers will take off the last component of a pathname leaving
  424. the head `:h' or all but the last component of a pathname leaving the
  425. tail `:t'.
  426. These modifiers are fully described in the
  427. .I csh
  428. manual pages in the User's Reference Manual.
  429. It is also possible to use the
  430. .I "command substitution"
  431. mechanism described in the next major section to perform modifications
  432. on strings to then reenter the shell's environment.
  433. Since each usage of this mechanism involves the creation of a new process,
  434. it is much more expensive to use than the `:' modification mechanism.\(dd
  435. .FS
  436. \(dd It is also important to note that
  437. the current implementation of the shell limits the number of `:' modifiers
  438. on a `$' substitution to 1.
  439. Thus
  440. .sp
  441. .nf
  442. .in +5
  443. % echo $i $i:h:t
  444. /a/b/c /a/b:t
  445. %
  446. .in -5
  447. .fi
  448. .sp
  449. does not do what one would expect.
  450. .FE
  451. Finally, we note that the character `#' lexically introduces a shell
  452. comment in shell scripts (but not from the terminal).
  453. All subsequent characters on the input line after a `#' are discarded
  454. by the shell.
  455. This character can be quoted using `\'' or `\e' to place it in
  456. an argument word.
  457. .NH 2
  458. Other control structures
  459. .PP
  460. The shell also has control structures
  461. .I while
  462. and
  463. .I switch
  464. similar to those of C.
  465. These take the forms
  466. .DS
  467. \fBwhile\fR ( expression )
  468.     commands
  469. \fBend\fR
  470. .DE
  471. and
  472. .DS
  473. \fBswitch\fR ( word )
  474.  
  475. \fBcase\fR str1:
  476.     commands
  477.     \fBbreaksw\fR
  478.  
  479. \& ...
  480.  
  481. \fBcase\fR strn:
  482.     commands
  483.     \fBbreaksw\fR
  484.  
  485. \fBdefault:\fR
  486.     commands
  487.     \fBbreaksw\fR
  488.  
  489. \fBendsw\fR
  490. .DE
  491. For details see the manual section for
  492. .I csh.
  493. C programmers should note that we use
  494. .I breaksw
  495. to exit from a
  496. .I switch
  497. while
  498. .I break
  499. exits a
  500. .I while
  501. or
  502. .I foreach
  503. loop.
  504. A common mistake to make in
  505. .I csh
  506. scripts is to use
  507. .I break
  508. rather than
  509. .I breaksw
  510. in switches.
  511. .PP
  512. Finally,
  513. .I csh
  514. allows a
  515. .I goto
  516. statement, with labels looking like they do in C, i.e.:
  517. .DS
  518. loop:
  519.     commands
  520.     \fBgoto\fR loop
  521. .DE
  522. .NH 2
  523. Supplying input to commands
  524. .PP
  525. Commands run from shell scripts receive by default the standard
  526. input of the shell which is running the script.
  527. This is different from previous shells running
  528. under \s-2UNIX\s0.  It allows shell scripts to fully participate
  529. in pipelines, but mandates extra notation for commands which are to take
  530. inline data.
  531. .PP
  532. Thus we need a metanotation for supplying inline data to commands in
  533. shell scripts.
  534. As an example, consider this script which runs the editor to
  535. delete leading blanks from the lines in each argument file:
  536. .DS
  537. % cat deblank
  538. # deblank \-\- remove leading blanks
  539. foreach i ($argv)
  540. ed \- $i << \'EOF\'
  541. 1,$s/^[ ]*//
  542. w
  543. q
  544. \&\'EOF\'
  545. end
  546. %
  547. .DE
  548. The notation `<< \'EOF\''
  549. means that the standard input for the
  550. .I ed
  551. command is to come from the text in the shell script file
  552. up to the next line consisting of exactly `\'EOF\''.
  553. The fact that the `EOF' is enclosed in `\'' characters, i.e. quoted,
  554. causes the shell to not perform variable substitution on the
  555. intervening lines.
  556. In general, if any part of the word following the `<<' which the
  557. shell uses to terminate the text to be given to the command is quoted
  558. then these substitutions will not be performed.
  559. In this case since we used the form `1,$' in our editor script
  560. we needed to insure that this `$' was not variable substituted.
  561. We could also have insured this by preceding the `$' here with a `\e',
  562. i.e.:
  563. .DS
  564. 1,\e$s/^[ ]*//
  565. .DE
  566. but quoting the `EOF' terminator is a more reliable way of achieving the
  567. same thing.
  568. .NH 2
  569. Catching interrupts
  570. .PP
  571. If our shell script creates temporary files, we may wish to catch
  572. interruptions of the shell script so that we can clean up
  573. these files.
  574. We can then do
  575. .DS
  576. onintr label
  577. .DE
  578. where
  579. .I label
  580. is a label in our program.
  581. If an interrupt is received the shell will do a
  582. `goto label'
  583. and we can remove the temporary files and then do an
  584. .I exit
  585. command (which is built in to the shell)
  586. to exit from the shell script.
  587. If we wish to exit with a non-zero status we can do
  588. .DS
  589. exit(1)
  590. .DE
  591. e.g. to exit with status `1'.
  592. .NH 2
  593. What else?
  594. .PP
  595. There are other features of the shell useful to writers of shell
  596. procedures.
  597. The
  598. .I verbose
  599. and
  600. .I echo
  601. options and the related
  602. .I \-v
  603. and
  604. .I \-x
  605. command line options can be used to help trace the actions of the shell.
  606. The
  607. .I \-n
  608. option causes the shell only to read commands and not to execute
  609. them and may sometimes be of use.
  610. .PP
  611. One other thing to note is that
  612. .I csh
  613. will not execute shell scripts which do not begin with the
  614. character `#', that is shell scripts that do not begin with a comment.
  615. Similarly, the `/bin/sh' on your system may well defer to `csh'
  616. to interpret shell scripts which begin with `#'.
  617. This allows shell scripts for both shells to live in harmony.
  618. .PP
  619. There is also another quotation mechanism using `"' which allows
  620. only some of the expansion mechanisms we have so far discussed to occur
  621. on the quoted string and serves to make this string into a single word
  622. as `\'' does.
  623. .bp
  624.