版权声明: 本文内容为大连理工大学LINUX选修课讲义,欢迎大家转载,但禁止使用本材料进行 任何商业性或赢利性活动。转载时请保留本版权声明。
作者:何斌武,hbwork@dlut.edu.cn,大连理工大学网络中心,April 1999.
URL: ftp://ftp.dlut.edu.cn/pub/PEOPLE/albin/ ------------------------------------------------------------------------------ 这个网上很流行的一个讲义,我在上面做了些许的说明,算是我学习过程中的一点心得吧。 里面所有的红字是我加进去的。
苏小勇 http://www.bestunix.net
Bourne Shell
介绍:Bourne Shell 基础及其他很多有用的特性,shell编程及组织。
主要内容: .shell基础 基本介绍,环境,选项,特殊字符 .shell变量 用户定义变量,环境变量,位置变量(shell 参数) .shell script编程 条件测试,循环及重复控制 .shell定制
1.shell基础知识 作者:Stephen Bourne 在Bell实验室开发 建议:man sh 查看相关UNIX上的改进或特性
(1)shell提示符及其环境 在passwd文件中可以看到每个用户登陆后使用的shell,下面两个文件也是这个意思。 /etc/passwd文件 提示符:$ /etc/profile $HOME/.profile (2)shell执行选项 在建立一个shell脚本后我们要用sh命令来运行和测试,下面是一些sh常用的参数
-n 测试shell script语法结构,只读取shell script但不执行 -x 进入跟踪方式,显示所执行的每一条命令,用于调度 -a Tag all variables for export -c "string" 从strings中读取命令 -e 非交互方式 -f 关闭shell文件名产生功能 -h locate and remember functions as defind -i 交互方式 -k 从环境变量中读取命令的参数 -r 限制方式 -s 从标准输入读取命令 -t 执行命令后退出(shell exits) -u 在替换中如使用未定义变量为错误 -v verbose,显示shell输入行
这些选项可以联合使用,但有些显然相互冲突,如-e和-i.
(3)受限制shell(Restircted Shell) 说了半天好象这个东西没什么用,那就不管了。 sh -r 或 /bin/rsh
不能执行如下操作:cd, 更改PATH,指定全路径名,输出重定向,因此可以提供一个较 好的控制和安全机制。通常rsh用于应用型用户及拨号用户,这些用户通常是看不到提 示符的。通常受限制用户的主目录是不可写的。
不足:如果用户可以调用sh,则rsh的限制将不在起作用,事实上如果用户在vi及more 程序中调用shell,而这时rsh的限制将不再起作用。
(4)用set改变 shell选项
实际上就是设置sh的默认参数,我们在运行shell脚本时,并不总是使用sh scriptsfile,而是用./scriptsfile来运行,这个时候就使用sh的默认参数。 用户可以在$提示符下用set命令来设置或取消shell的选项。使用-设置选项,+取消相应 选项,大多数UNIX系统允许a,e,f,h,k,n,u,v和x的开关设置/取消。
set -xv 启动跟踪方式;显示所有的命令及替换,同样显示输入。 set -tu 关闭在替换时对未定义变量的检查。
使用echo $-显示所有已设置的shell选项。
(5)用户启动文件 .profile PATH=$PATH:/usr/loacl/bin; export PATH
(6)shell环境变量 这里是举例说明什么是环境变量,但还是没说什么是环境变量,按我的理解,环境变量类似于宏定义,或者说环境变量是一个作用于系统的全局变量或局部变量。
CDPATH 用于cd命令的查找路径 HOME /etc/passwd文件中列出的用户主目录 IFS Internal Field Separator,默认为空格,tab及换行符 MAIL /var/mail/$USERNAME mail等程序使用 PATH PS1,PS2 默认提示符($)及换行提示符(>) TERM 终端类型,常用的有vt100,ansi,vt200,xterm等
示例:$PS1="test:";export PS1 test: PS1="$";export PS1 $echo $MAIL /var/mail/username
(7)保留字符及其含义 $ shell变量名的开始,如$var | 管道,将标准输出转到下一个命令的标准输入 # 注释开始 & 在后台执行一个进程 ? 匹配一个字符 * 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.) $- 使用set及执行时传递给shell的标志位 $! 最后一个子进程的进程号 $# 传递给shell script的参数个数 $* 传递给shell script的参数 $@ 所有参数,个别的用双引号括起来 $? 上一个命令的返回代码 当前shell的名字 $n (n:1-) 位置参数 $$ 进程标识号(Process Identifier Number, PID) 覆盖现有文件的数据 >file 输出重定向 这个没看明白 `command` 命令替换,如 filename=`basename /usr/local/bin/tcsh` 会在现有文件末尾追加数据 >>fiile 输出重定向,append
转义符及单引号: 注意单引号,双引号,没引号的异同。 $echo "$HOME $PATH" /home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: $echo '$HOME $PATH' $HOME $PATH $echo $HOME $PATH $HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbwork/bin
其他: $dir=ls $$dir $alias dir ls $dir 将ls结果输出到文件filelist ls > filelist 将ls结果追加到文件filelist最后 ls >> filelist 统计文件filelist内容的行数 wc -l < filelist 统计字符串filelist的总行数 wc -l filelist 等待5秒钟,显示5 seconds reaches,执行ls -l命令 sleep 5; echo 5 seconds reaches; ls -l [在当前进程中找出所有的inetd进程] ps ax |grep inetd 这个没看明白,find不会用,呵呵 find / -name core -exec rm { } ; & 设置filename为日期+年月日.log filename=`date "+%Y%m%d"`.log
|