第4章Shell编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*同时使用输入输出重定向 */
对于标准错误输出流的重定向,不同的shell修改 方法有所不同。
如果将标准输出和标准错误输出流都定向到同一文件,B Shell中用2>&1来实现,C Shell中用>&来实现。试分析:
$ cc abc.c > log
$ cc abc.c 2>&1 log
% cc abc.c > log % cc abc.c >& log
$ echo ${ux}
$ echo ${hi}today $ echo ―$hi‖ today
/* 取变量hi的值并和today组合 */
也可用双引号做变量替换:
如果用单引号,会出现什么样的结果呢? $ echo ‗$hi‘today 输出: ‘$hi‘today
这就是单引号和双引号使用上的区别: 单引号,可是使其括住的特殊字符失去在Shell中的特殊含义;
4) 变量的作用域:局部变量和全局变量 一般情况下,变量仅在给它赋值的那个Shell下起作用, 即它是一个局部变量。 $ ux=unix $ sh /进子进程 /进子进程
$ echo $ux /显:unix
$ sh
$ echo $ux /显:unix $ exit
$ echo $ux /显: $ exit $ echo $ux /显:unix
(需要先确认文件有可执行权,chmod +x file.sh)
注意,由于Shell有很多种,而每一种Shell都有其特定的 语法,所以必须指明是用哪一种Shell语言来编写的程序, 内核才能知道用哪种解释器来执行。 在程序的首行顶头处写上: #!/bin/sh
或
#!/bin/csh
来标明是Bourne Shell 文件还是C Shell 文件。
如果是重定向到不同文件,B Shell用2>来指示标准错误 输出:
$ cc abc.c > log 2> errorlog
$find / -name filea -print 2> errorlog
C Shell % ( cc abc.c > log ) >& errorlog
% ( find / -name filea -print > /dev/tty ) >& errorlog
7) 变量替换
程序中若有以下语句: echo ―The CDPATH is $CDPATH‖ 会显示:The CDPATH is 对未赋值变量的赋值方法:
${var:-word}: 若var有值且非空,取该值,否则取 word,
var 不变; ${var:=word}:若var有值且非空,取该值,否则取 word, 同时将word值赋给var; ${var:+word}:若var有值且非空,取word,否则var仍为空 可将上列语句改为: echo ―The CDPATH is ${CDPATH:-Undefined}‖
hi=―how are you ‖
传统的B Shell 变量赋值“=”两边不允许空格出现。 Linux的bash无此限制。
2)shell变量引用和参数替换 在变量名前加“$‖, 如: $ echo $ux
/* 取变量ux的值并回显 */ 如果变量未被赋值,那么返回一个空串。
在许多情况下,对变量取值时用大括号把变量括住,以便强 调指出变量名,如:
4.1.1 输入输出重定向
执行一个shell命令行时,通常会自动打开三个标准文件,即: 标准输入文件(stdin),通常对应终端的键盘; 标准输出文件(stdout)和标准错误输出文件(stderr), 这两个文件都对应终端的屏幕。
进程将从标准输入文件中得到输入数据,将正常输出数据输出 到标准输出文件,而将错误信息送到标准错误文件中。 以上三个标准文件的文件标识符分别为0号、1号、2号。
4.1 命令解释程序
做为用户与Unix系统内核之间的界面,Shell接受、 解释并执行用户命令。 Shell执行用户命令的工作过程大体上表现为这样 一个循环: while (1) { prompt(―command: ‖); /* 打印提示符 */ read(command); /* 读入并分析命令 */ execute(command); /* 执行命令 */ }
当标准文件描述符被分配给终端以外的对象,就称为 I/O重定向, 由 “>‖、 “>>‖ 、 “<‖ 、“<<‖等符号完 成。
用 >, <, >>等符号改变标准流的方向, 分析以下命令的结果:
$ ls -l
$ ls -l > mydirlist
$ pwd > mydirlist
$ pwd >> mydirlist $ date >> mydirlist
Shell Programming
— UNIX Shell程序设计
Shell的双重特性:
命令解释程序(命令解释器): Shell解释用户输入的命令行,提交系统内核 处理,并将结果返回给用户; Shell与UNIX命令一样都是实用程序,但有区 别。一旦用户注册到系统后, Shell 就被系统装 入内存,并一直运行到用户退出系统之止;而一 般命令仅当被调用时,才由系统装入内存执行。 程序设计语言: Shell本身也是一种可编程的程序设计语言。
而
双引号,在遇到 $ 、\、 ‘ ’、 ` `等特殊符号时,要进行变量 或参数的替换。其它时候与单引号功能相同。
3)Shell 编程中三种引号的作用:
单引号 ‘ ’:其中内容是字符串,没有shell的特殊含义; 双引号“ ”:其中特殊字符作shell 含义解释,其它作字符; 反引号 ` `:其中的命令可作为执行结果进行赋值。 例: $ TT=`date` $ echo $TT 回显: wed Aug 16 15:11:42 Roc 2000 $ file=report $ echo ‗The time is `date`,the file is $file‘ 回显: The time is `date`,the file is $file $echo ―The time is `date`,the file is $file‖ 回显:The time is wed Aug 16 15:11:42 Roc 2000,the file is report.
4.2.1 Shell 程序的设计与执行
shell程序的功能是将命令序列组合并由系统自动执行。
用vi编辑器创建一个简单的shell程序,内容如下:
#!/bin/bash
echo hello who ls –l date
以 file.sh文件名存盘。
file.sh 文件交给系统执行可用三种方式实现: 利用输入输出重定向: $ sh < file.sh 把file.sh当作sh的执行参数: $ sh file.sh 直接执行file1.sh程序: $ ./ file.sh
$ rm no_exist | | echo ―remove file error ! ‖
4.1.3 后台进程
占据终端显示的进程叫作“前台进程”; 不占据终端显示的则叫作“后台进程”。 一个终端可以同时运行一个前台进程和多个后台进程。
后台命令(或程序)以符号 “&‖ 结束, 将立即返回Shell提示符,同时在后台执行该命令。
结果: 3 first second third
出现上述结果的原因是程序中有位置参数的引用 $ echoarg.sh first second third
( $0)
$1
$2
$3
$# 是Shell程序的参数即位置参数的个数,
$0 是Shell命令或程序名 $n (1~9)是命令的参数。
另一个例题:假设有一个shell程序 run.sh
$ ( ls –l; pwd; date ) > mydirlist
$ cat file1 file2 >> file3
$ mail tom < file
$ myprog < testdatafile
$ command << string ,为“行输入重定向”,较少使用。
$ myprog < infile > outfile
特别要注意的是转义符的使用,分析以下命令的输 出结果:
$ echo * $ echo \*
$ ls * abc file1 youx $ echo How are you? How are youx $ echo How are you\? How are you?
4.2 Shell程序设计
Shell允许通过编程来完成复杂的功能处理, 与高级语言相比,具有以下特点: Shell是解释性的,多数高级语言是编译性 的; Shell语言与高级语言处理的对象不同; Shell与系统有密切的关系; Shell易编写、调试、灵活性较强,但速度 低; Shell作为命令级语言,命令组合功能很强。
$ export ux /输出为全局变量
只有使用了export命令后,变量才会在子进程中起作用:
5)标准变量 Shell 标准变量,在shell进程创建时自动赋值: 变量用途 用户名 注册目录 访问路径 cd路径 提示符 辅提示符 终端类型 运行的shell sh变量 HOME PATH CDPATH PS1 PS2 TERM SHELL csh变量 user home path cdpath prompt term shell csh环境变量 USER HOME PATH
$ man sh | lp & [1] 1557 $
$ killHale Waihona Puke Baidu-9 $!
4.1.4 通配符及特殊字符
有些字符是对于Shell有特殊意义的字符,常用于控制文件名的 组成,还用于构成Unix中广泛应用的正则表达式。
* ? [abc] [! abc] [a-z] [! a-z] ; & $ () \ 匹配任意字符串,0或多个字符 匹配单个字符 匹配a、b、c这组字符中的一个 匹配这组字符以外的某个字符 匹配在a到z这个范围内的某个字符 匹配不在a到z这个范围内的某个字符 分隔命令,标志命令结束,但不换行 后台命令 变量的访问 将小括号中所括的命令生成一个子shell去执行 转义字符,它使紧跟其后的那个字符失去在 Shell中的特殊意义
4.1.2 管道线
管道线实现了Unix命令功能的组合。 它将一个命令(或程序)的输出作为另一个命令(或 程序)的输入。 记为 a | b , 表示把 a 命令的输出作为 b 命令的输入, 实现了输出重定向和输出重定向功能的组合。
$ ls -l > tempfile $ wc -l < tempfile $ rm tempfile
vi $1.c
cc $*.c -o $1 -lX11 -lm $1
按以下执行:
$ run.sh basicwin mysub
几个由系统自动赋值的shell变量: B shell $# $? $$ $! C shell $#argv $status $$ 变量作用 位置参数的个数 前一个命令返回的状态 当前shell进程的pid 最近访问的后台进程的pid
TERM
6) 位置变量 Shell 中命令行的参数可用单独的位置参数提取,它们是$1,$2, $3,…$9. 考虑下列shell程序,其文件名为echoarg.sh: echo $# 执行此程序时用:
for VAR in $*
do echo $VAR done
$ echoarg.sh first second third
此外,在Shell程序中可以用 # 来标志其后的文本是注释。
4.2.2 Shell 变量的应用
Shell 变量是字符或字符串. 要注意,程序中出现的数字那 也是基于字符类型的。
1) shell 变量及赋值 以字母开头,由字母、数字及下划线组成。如: ux=u.unix 如果赋给变量的值中含有空格或制表符等,在赋值的时候要 用引号将变量的值引起,如:
$ ls -l | wc -l
完成的工作是一样的,但二者工作机制不同。
管道线连用的例子:
$ du -a | sort -nr | head -20
如果以其他分隔符如 | | 、 && 代替管道线的符号,还可以 做到命令的有条件执行。分隔符右侧的命令是否执行,取决于 左侧命令的退出状态 && : 表示根据条件(true)执行其后面的命令 | | : 表示根据条件(false)执行其后面的命令 $ cc prgm1.c -o prgm1 && prgm1 $ cc prgm1.c 2> err | | mail bob < err