291
C shell
第五章
C shell
本章介绍 C shell,之所以如此命名,是因为它很多的编程结构与符号和 C 编程语言
相似。其中包括以下内容:
●
功能概述
●
语法
●
变量
●
表达式
●
命令历史
●
作业控制
●
调用 shell
●
内置的 C shell 命令
要想得到有关 C shell 的更多信息,可以阅读在参考文献中列出的《Using csh &
tcsh》。
功能概述
C shell 具备以下功能:
●
输入输出重定向
●
用于文件名缩写的通配符(元字符)
第五章292
●
定制用户环境的 shell 变量
●
整数运算
●
访问以前的命令(命令历史)
●
命令名缩写(别名)
●
用于写 shell 程序的内置命令集
●
作业控制
●
文件名完成(可选)
语法
本部分介绍了针对 C shell 的很多符号。包括以下内容:
●
特殊文件
●
文件名元字符
●
引用
●
命令方式
●
重定向方式
特殊文件
~
/.cshrc 在 shell 调用每一个实例时执行。
~
/.login 在 .cshrc 执行之后由登录 shell 执行。
~
/.logout 在退出时由登录 shell 执行。
~
/.history 来自以前的登录中存储的历史列表。
/etc/passwd
~
name 缩写的主目录的来源(可能来自 NIS 或 NIS+)。
文件名元字符
元字符 描述
* 匹配任何有 0 个或多个字符的字符串
? 匹配任何单个字符
[
abc
...] 匹配被括起来的字符中的任何一个;可以用连字符指定一个范围(例
如,a-z、A-Z、0-9)
C shell
293
C shell
元字符 描述
{
abc
,
xxx
,...} 扩展括号中的每一个由逗号分隔的字符串。这些字符串不一定匹配实际
的文件名
~
当前用户的主目录
~
name
用户 name 的主目录
示例
% ls new* 匹配 new、new.1 等
% cat ch? 匹配 ch9 等,但不匹配 ch10
% vi [D-R]* 匹配文件名开头是大写 D 到大写R 的文件
% ls {ch,app}? 先进行扩展,然后匹配 ch1、ch2、app1、app2 等
% mv info{,.old} 扩展成 mv info info.old
% cd
~
tom 将目录修改为用户 tom 的主目录
引用
引用可以禁止字符的特殊意义,使字符按其本来意思加以使用,下表中的字符在 C
shell 中有特殊的意义。
字符 意义
; 命令分隔符
& 后台执行
( ) 命令分组
| 管道
* ? [ ]
~
文件名元字符
{ } 字符串扩展字符,通常不要求引用
< > & ! 重定向符号
! ^ 历史替代,快速替代
"
,
\ 用于引用其他字符
` 命令替代
$ 变量替代
space tab newline 单词之间的间隔
下列的字符用于引用:
"" 位于"和"之间的所有的字符都按其字面意义加以采用,下面这些具有特殊意义
的字符除外:
第五章294
$ 产生变量替代。
` 产生命令替代。
" 表示双引号的结束。
\ 转义下一个字符。
! 历史字符。
newline
换行字符。
,,
除!(历史)和另一个
,
以及换行符之外,位于
,
和
,
之间的所有字符都按其字
面意义加以采用。
\ 在其后的字符会按字面意义采用。通常用于"" 中以转义"、$、` 和换行符。用
于
,,
内可转义换行符。经常用来转义一个历史字符(通常是!)。
示例
% echo
,
Single quotes "protect" double quotes
,
Single quotes "protect" double quotes
% echo "Don
,
t double quotes protect single quotes too?"
Don't double quotes protect single quotes too?
% echo "You have `ls|wc -l` files in `pwd`"
You have 43 files in /home/bob
% echo The value of \$x is $x
The value of $x is 100
命令方式
cmd
& 在后台执行 cmd。
cmd1
;
cmd2
命令序列,在同一行执行多个命令。
(
cmd1
;
cmd2
) 子 shell,将 cmd1 和 cmd2 视为一个命令组。
cmd1
|
cmd2
管道,用 cmd1 的输出作为 cmd2 的输入。
cmd1
`
cmd2
` 命令替代,用 cmd2 的输出作为 cmd1 的参数。
cmd1
&&
cmd2
逻辑与关系,执行cmd1(如果cmd1执行成功)后再执行cmd2。
这是一种短路操作,如果 cmd1 没有成功执行,cmd2 将永远不
能执行。
C shell
295
C shell
cmd1
||
cmd2
逻辑或关系,执行 cmd1 或(如果 cmd1 执行失败)cmd2。这是
一个短路操作,如果 cmd1 执行成功,cmd2 将永远不能执行。
示例
% nroff file > file.out & 后台格式化
% cd; ls 顺序执行
% (date; who; pwd) > logfile 重定向所有输出
% sort file | pr -3 | lp 先对文件排序,再分页输出,然后打印
% vi `grep -l ifdef *.c` 编辑 grep 找到的文件
% egrep
,
(yes|no)
,
`cat list` 指定一个搜索文件列表
% grep XX file && lp file 如果包含了该模式,则打印文件
% grep XX file || echo XX not found 否则,回显一个错误消息
重定向方式
文件描述符 名称 一般缩写 默认
0 标准输入 stdin 键盘
1 标准输出 stdout 终端
2 标准错误 stderr 终端
重定向方式可以改变一般的输入源和输出目标,参见下面的内容。
简单重定向
cmd
>
file
将 cmd 的输出发送到文件 file 中(覆盖)。
cmd
>!
file
和前一个命令意义相同,另外,还会忽略 noclobber 选项。
cmd
>>
file
将 cmd 的输出发送到文件 file 中(追加)。
cmd
>>!
file
和前一个命令意义相同,但写文件的时候忽略 noclobber 选项。
cmd
<
file
cmd 从文件 file 中获取输入 。
cmd
<<
text
读取标准输入,直到遇到一个和 text 相等的行(text 可以存储在一个 shell 变量
中)。 输入通常使用终端键入或存储在shell程序中。使用这类语法的命令通常有
评论5