1、Linux shell编程基础Advanced Bash-Scripting GuideLINUX与UNIX SHELL编程指南 -CUShell的位置硬件系统硬件系统linux内核内核kernelshell程序程序应用程序应用程序硬 件内 核shellcshkshPOSIXlsmailvidateTools&Application Shell的类别Shell类型类型主要特点主要特点简称简称命令命令提示符提示符Bourne Shell最老、使用最广泛,每个最老、使用最广泛,每个UNIX都提供,是三种都提供,是三种Shell程序的基程序的基础。础。B Shellsh$Korn Shell是对是对
2、B Shell的扩充,兼容的扩充,兼容B Shell。K Shellksh$C-Shell更接近于更接近于C语言,提供比语言,提供比B Shell更强大的功能,是三种更强大的功能,是三种Shell程序中功能最强大的。程序中功能最强大的。C Shellcsh%Bash:Bourne-Again Shell Shell的发展与分类 BshKshBashCshBsh在在20世纪世纪70年代中期诞生于新泽西的年代中期诞生于新泽西的AT&T贝尔实验室,具有较强的脚本编程贝尔实验室,具有较强的脚本编程功能功能Csh在在20世纪世纪80年代早期诞生于加利福尼年代早期诞生于加利福尼亚大学亚大学 ,使用,使用C
3、语言的语法,用户命令交语言的语法,用户命令交互更加方便互更加方便Ksh结合了结合了Bsh和和Csh两者的功能优势,两者的功能优势,兼有兼有Bsh的语法和的语法和Csh的交互特性的交互特性 Bash是是Bsh的升级替代品,吸收了的升级替代品,吸收了Ksh中中的诸多优秀特性,的诸多优秀特性,Bash是开源软件是开源软件 shell基本命令$ clear shell基本命令$ man shell基本命令echo:回显回显格式格式:echo OPTION.STRING. oraclesrc $ echo hello world!hello world!oraclesrc $ a=my name is
4、leeechooraclesrc $ echo $amy name is leeechooraclesrc $ echo $ORACLE_SIDDBTEST shell基本命令pwd:显示当前目录显示当前目录格式格式:pwd OPTIONoraclesrc ftp$ pwd/home/oracle/ftporaclesrc ftp$ cd /etcoraclesrc etc$ pwd/etcoraclesrc etc$ shell基本命令cd:改变目录改变目录格式格式:cd directoryname. oraclesrc $ pwd/home/oracleoraclesrc $ cd .or
5、aclesrc home$ pwd/homeoraclesrc home$ cd /oraclesrc /$ pwd/ shell基本命令ls:列表目录内容列表目录内容格式格式:ls OPTION. FILE.OPTION:-l:显示文件所有属性显示文件所有属性-a:显示所有文件含隐含文件显示所有文件含隐含文件 shell基本命令cat:连接文件并显示文件内容连接文件并显示文件内容格式格式: cat OPTION FILE.oraclesrc $ cat mytest.txtthis is test! shell基本命令wc:打印一个文件的字节数,字数和行数打印一个文件的字节数,字数和行数格式
6、格式: wc OPTION. FILE.OPTION:-l :文件包含的行数文件包含的行数-w:文件包含的单词数文件包含的单词数-c:文件包含的字符数文件包含的字符数 shell基本命令head:显示文件开始的部分显示文件开始的部分格式格式: head OPTION. FILE.OPTION:-n:显示的行数显示的行数 默认显示前10行 shell基本命令tail:显示文件后面的部分显示文件后面的部分格式格式: tail OPTION. FILE.OPTION:-n:显示的行数显示的行数 默认显示后10行 shell基本命令mkdir:创建文件目录创建文件目录格式格式: mkdir OPTIO
7、N DIRECTORY.oraclesrc leeecho$ pwd/home/oracle/leeechooraclesrc leeecho$ mkdir testoraclesrc leeecho$ lstest shell基本命令rmdir:删除文件目录删除文件目录格式格式: rmdir OPTION DIRECTORY. 文件夹必须为空才可以使用rmdir删除 shell基本命令rm:删除文件删除文件格式格式: rmdir OPTION DIRECTORY.OPTION:-r:删除文件夹以及所包含的文件:删除文件夹以及所包含的文件 rm是危险的,谨慎使用! shell基本命令date:
8、显示或设置日期显示或设置日期格式格式: date OPTION. +FORMAT 取昨天的时间echo date +%Y%m%d -d yesterday取三天前的时间echo date +%Y%m%d -d 3 days agoecho date +%Y%m%d -d -3 days取明天的时间echo date +%Y%m%d -d tomorrowecho date +%Y%m%d -d +1 days shell基本命令find:查找文件查找文件格式格式: find path. expressionfind /home/oracle/ -name *.txt -print shell基
9、本命令xargs:执行命令执行命令格式格式: xargs expressionfind /home/oracle/ -name *.txt -print | xargs cat解决命令参数过多的问题 shell基本命令grep:搜索符合要求的内容搜索符合要求的内容格式格式: grep options PATTERN FILE.OPTION:-v:找出不匹配的行找出不匹配的行-c:统计匹配行数统计匹配行数-n: 显示匹配行及其行号显示匹配行及其行号命令显示 grep A-Z list list中包含一个大写字母的行 grep 0-9 data data中包含数据的行 grep A-Z0-9 li
10、st list中包含大写字母开始,数据结尾的5个字符组合的行 grep .pic$ list list中以.pic结尾的行 shell基本命令crontab:执行作业执行作业格式格式: crontab -u user -l | -r | -eOPTION:-l:显示cron文件-e:创建、编辑cron文件-r:删除cron文件Crontab文件格式:文件格式:minhourdatemonth day command0-590-231-311-12 0-6 shell基本命令把两个命令连接起来,使前面命令的输出是后把两个命令连接起来,使前面命令的输出是后面一个命令的输入,这就是管道。面一个命令的
11、输入,这就是管道。显示显示oracle的后台进程的后台进程 ps -ef | grep $ORACLE_SID实际例实际例gunzip -c E:2006062120060621*.gz | grep -i J.SMS E:20060621test7.txtgunzip -c E:2006062120060621*.gz | grep -i J.SMS* E:20060621test7.txt子子 shell基本命令 echo this is test1/home/oracle/leeecho/text1.txt echo this is test3/home/oracle/leeecho/t
12、ext1.txt grep A-C 输出重定向输出重定向追加输出追加输出|管道操作管道操作输入重定向输入重定向 shell基本命令单引号忽略所有的特殊字符,单引号自己除外,变量不解释单引号忽略所有的特殊字符,单引号自己除外,变量不解释 echo |;()$ORACLE_SID双引号双引号 echo |;()$ORACLE_SID 单引号单引号() 忽略所有除自己之外的特殊字符忽略所有除自己之外的特殊字符双引号双引号(“) 不忽略一下三种特殊字符不忽略一下三种特殊字符 美元符号 $ 反引号 反斜杠 反斜杠反斜杠() 忽略后面跟着的一个特殊字符忽略后面跟着的一个特殊字符 shell基本命令有趣的例
13、子:有趣的例子:oraclesrc leeecho$ x=*oraclesrc leeecho$ echo $xtest1.txt test2.txtoraclesrc leeecho$ echo $x*oraclesrc leeecho$ echo $x$xoraclesrc leeecho$ echo $x$x shell基本命令echo Yesterday is date +%Y%m%d -d yesterday!echo Yesterday is $(date +%Y%m%d -d yesterday)! 反引号(反引号()$()结构结构Bash的命令行编辑功能 操作键操作键功能功能左
14、右方向键左右方向键 使用左右方向键可以使光标在当前命令行中使用左右方向键可以使光标在当前命令行中的已有字符间进行任意的移动的已有字符间进行任意的移动 退格键退格键删除命令行中光标左边的字符删除命令行中光标左边的字符Del删除当前光标处的字符删除当前光标处的字符 Home将光标快速移动到命令行的行首将光标快速移动到命令行的行首End将光标快速移动到命令行的行尾将光标快速移动到命令行的行尾Ctrl + u删除当前光标到行首的内容删除当前光标到行首的内容 Ctrl + k删除当前光标到行尾的内容删除当前光标到行尾的内容 Bash的命令行补全功能 命令补全功能 使用Tab键可在命令查找路径中查找匹配的
15、命令,并进行命令拼写的补全 文件补全功能 使用Tab键可对文件和目录名进行补全Bash的命令历史与命令重复 命令历史功能的使用 使用上下方向键浏览已输入命令(历史命令) 历史命令的查看 $ history 用户命令历史保存文件 /.bash_history 命令历史的清除$ history -c Bash的命令别名功能 命令别名的显示 $ alias 命令别名的定义 $ alias grep=grep -i 命令别名的取消 $ alias grep$ unalias -a 系统别名定义文件 RHEL4系统中为用户预定义的命令别名保存在“/etc/pro”目录的配置文件中管道与重定向 标准输入输
16、出 重定向操作 管道操作标准输入输出 输入输出文件输入输出文件文件编号文件编号默认设备默认设备标准输入标准输入0键盘键盘标准输出标准输出1显示器显示器标准错误输出标准错误输出2显示器显示器重定向操作类别类别操作符操作符说明说明输入重定向输入重定向将命令的执行结果重定向输出到指定的文件中,命将命令的执行结果重定向输出到指定的文件中,命令进行输出重定向后执行结果将不显示在屏幕上令进行输出重定向后执行结果将不显示在屏幕上 将命令执行的结果重定向并追加到指定文件的末尾将命令执行的结果重定向并追加到指定文件的末尾保存保存 错误重定向错误重定向2清空指定文件的内容,并保存标准错误输出的内容清空指定文件的内
17、容,并保存标准错误输出的内容到指定文件中到指定文件中2向指定文件中追加命令的错误输出,而不覆盖文件向指定文件中追加命令的错误输出,而不覆盖文件中的原有内容中的原有内容 输出与错误输出与错误组合重定向组合重定向&将标准输出与错误输出的内容全部重定向到指定文将标准输出与错误输出的内容全部重定向到指定文件件知识准备知识准备 命令行编辑功能 命令和文件名补全功能 命令历史功能 命令别名功能 提供作业控制功能 具有将命令序列定义为功能键的功能 灵活的Shell脚本编程Shell变量的分类 环境变量 预定义变量 位置变量 用户自定义变量(本地变量)环境变量 使用set命令查看环境变量 set 常用环境变量
18、 USER UID SHELL HOME PWD PATH PS1 PS2 环境变量配置文件 /etc/bashrc /etc/profile /.bash_profile /.bashrc 位置变量 $ ./exam01 one two tree four five six$0表示命令名称表示命令名称$0属于预定义变量属于预定义变量$0不属于位置变量不属于位置变量$1表示第表示第1个命令参数个命令参数$2表示第表示第2个命令参数个命令参数$3表示第表示第3个命令参数个命令参数$n表示第表示第n个命令参数个命令参数预定义变量 变量名变量名含义含义$# 表示位置参数的数量表示位置参数的数量 $*
19、表示所有位置参数的内容表示所有位置参数的内容 $?表示命令执行后返回的状态,用于检查上一个命表示命令执行后返回的状态,用于检查上一个命令的执行是否正确;在令的执行是否正确;在Linux中,命令退出状态中,命令退出状态为为0表示命令正确执行,任何非表示命令正确执行,任何非0值表示命令执行值表示命令执行错误错误 $表示当前进程的进程号表示当前进程的进程号 $!表示后台运行的最后一个进程号表示后台运行的最后一个进程号 $0表示当前执行的进程名表示当前执行的进程名 用户自定义变量 自定义变量的设置$ DAY=sunday 自定义变量的查看与引用 $ echo $DAY 自定义变量的输出 $ expor
20、t DAY 自定义变量的清除 $ unset DAY shell语法结构Shell的变量没有类型之说,只有在比较的时候有字符串和整的变量没有类型之说,只有在比较的时候有字符串和整数之说。数之说。 变量赋值变量赋值 a=123 b=jkl c=$(ls)使用变量使用变量 echo $a let a=a+789 (linux做运算的方法)做运算的方法) shell语法结构整数的比较整数的比较 -eq:等于:等于 -ne:不等于:不等于 -gt:大于:大于 -ge:大于等于:大于等于 -lt:小于:小于 -le:小于等于:小于等于字符串比较字符串比较 = 等于则为真等于则为真 != 不相等则为真不相
21、等则为真 -z 空串空串 -n 非空串非空串 0 为真,为真,1 为假为假 shell语法结构oraclesrc $ 23 -lt 89 oraclesrc $ echo $?0oraclesrc $ jkljl = jklljl oraclesrc $ echo $?1oraclesrc $ -z jkl oraclesrc $ echo $?1oraclesrc $ -z oraclesrc $ echo $?0oraclesrc $ shell语法结构 expr1 | expr2 expr1为假执行为假执行expr2 expr1 & expr2 expr1为真执行为真执行expr2 or
22、aclesrc $ str=cuitoraclesrc $ -n $str & echo The string is nullThe string is nulloraclesrc $ -n $str & echo The string is not nullThe string is not nulloraclesrc $ str=oraclesrc $ -z $str | echo The string is null oraclesrc $ -n $str | echo The string is nullThe string is null shell语法结构#!/bin/sh#thi
23、s is if test!a=5b=7if $a -lt $b then echo $a $bfi if then . else . fi shell语法结构#/bin/sha=0while $a -lt 10 do echo $a let a=$a+1done while do . . done shell语法结构#/bin/shfor i in 1 2 3 4 5 6 7 8 9 10doecho -n $idonefor i in seq 10doecho -n $idone for do . . done shell语法结构ftp命令命令解释解释?或?或help command命令帮助
24、命令帮助binary设定以二进制方式传送文件设定以二进制方式传送文件ascii设定以设定以ASCII方式传送文件(缺方式传送文件(缺省值)省值)cd directory改变远程目录改变远程目录lcd directory改变本地目录改变本地目录put file1 file2将本地将本地file1文件拷贝到远程文件拷贝到远程file2 shell语法结构ftp命令命令解释解释get file1 fine2将远程将远程file1文件拷贝到本文件拷贝到本地地file2mput files将本地多个文件将本地多个文件files拷贝拷贝到远程到远程mget files将远程多个文件将远程多个文件files拷贝拷贝到本地到本地close关闭远程连接关闭远程连接quit或或bye退出退出ftp shell语法结构sqlplus -s src/srcdbtest !.!