《shell编程-01.ppt》由会员分享,可在线阅读,更多相关《shell编程-01.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Shell 编程主讲:成宝宗主要内容Shell介绍shell基本语法Shell常用语句Shell介绍UNIX的shell程序解释用户的命令,不管是用户直接输入的或者从一个称作Shell脚本或者Shell程序文件读入。Shell脚本是解释型的,而不是编译型的。Shell从脚本行的每行读取命令并在系统中搜索这些命令,当编译器把一个程序转化为可供机器读取的形式时,那么它就可以被以一个可执行文件用在shell脚本当中。除了向内核传送命令之外,shell的主要任务是提供一个可单独配置的使用shell资源配置文件的用户环境。Shell类型 sh或者称作BourneShell:最初的shell并且仍然在UN
2、IX系统和UNIX相关系统中使用。它是基本的shell,是一个特性不多的小程序。虽然不是一个标准的shell,但是为了UNIX程序的兼容性在每个Linux系统上仍然存在。bash或者称作BourneAgainshell:标准的GNUshell,直观而又灵活。或许是初学者的最明智选择同时对高级和专业用户来说也是一个强有力的工具。在Linux上,bash是普通用户的标准shell。这个shell因此称为Bourneshell的超集,一套附件和插件。意味着bash和sh是兼容的:在sh中可以工作的命令,在bash中也能工作,反之则不然。csh或者称作Cshell:语法了类似于C语言,某些时候程序员会
3、使用。tcsh或者称作TurboCshell:普通Cshell的超集,加强了的用户友好度和速度。ksh或者称作Kornshell:某些时候被有UNIX背景的人所赏识。Bourneshell的一个超集,有着对初学者来说就是一场恶梦的标准配置。文件/etc/shells一个简单的shell脚本#!/bin/bash/shell脚本的开始clearecho“Hello,$USER“/打印用户信息echoecho“Todaysdateisdate“/显示日期和时间echoecho“Theuseris:“/提示信息who/who命令echoecho“Thisisuname-s“/cpu信息echoech
4、oThatsallfolks!Shell如何执行命令执行交互式命令外部命令内建命令执行脚本的方式:1,Sh文件2,先Chmod+x文件再./脚本例如:#!/bin/shcd.ls启动脚本以交互登录shell:首先先执行/etc/profile,设置所有用户公共的环境然后依次查找/.bash_profile/.bash_login和/.profile三个文件,找到第一个存在并且可读的文件来执行,因此当前用户的环境可以通过设置/etc/profile实现。Shell基本语法变量环境变量(可以从父进程传给子进程,常用env查看)本地变量(只存在于当前shell进程,用set可以显示)设置变量:VAR
5、value(本地变量)ExportVAR或者ExportVARvalue(导入成环境变量)Unset命令用户删除已经定义的环境变量或本地变量使用$VAR或者$VAR可以取出变量的值,例如:rootbaozongmyshell#echo$SHELL/bin/bashrootbaozongmyshell#echo$SHELLabcrootbaozongmyshell#echo$SHELLabc/bin/bashabcrootbaozongmyshell#echo$SHELLabc/bin/bashabcrootbaozongmyshell#echo$SHELLabc/bin/bashabc变量的定
6、义与删除变量定义的时候不允许有空格例如:STRING=“myname”导出变量Exporting 一个子shell能够改变从父shell变量继承过来的变量,但是在子shell所作的改变对父shell也没有影响Bourne shell保留变量 变量名字变量名字定义定义CDPATH一个由冒号分割的目录列表作为内建命令cd的搜索路径。HOME当前用户的home目录;默认为内建命令cd。这个变量的值同样被扩展使用。IFS分割域的一个字符的列表;用于shell把词分开作为扩展。MAIL如果这个变量设成一个文件名并且MAILPATH变量没有设置,Bash在指定文件中通知用户邮件的到达。MAILPATH一个
7、用冒号分隔的文件名列表,shell周期性地从这个文件里检测新邮件。OPTARGgetopts内建命令处理的最后的选项参数的值。OPTIND最后一个由getopts内建命令处理的选项参数的索引号。PATH一个用冒号分隔的目录列表,shell从这些目录里寻找命令。PS1主要提示符。默认值是“s-v$”。PS2次要提示符。默认值是“”。变量名变量名定义定义auto_resume这个变量控制shell如何与用户交互和作业控制。BASH用于执行当前Bash实例的全路径。BASH_ENV如果这个变量在Bash调用执行一个shell脚本时已被设置,它的值将被展开并用作在执行脚本前读取的启动文件名。BASH_
8、VERSION当前Bash实例的版本号。BASH_VERSINFO一个只读变量数组,它的成员保存这个Bash实例的版本信息。COLUMNSselect内建命令来决定打印选择列表时终端宽度。在收到SIGWINCH信号时自动设置。COMP_CWORD包含当前光标位置的字的$COMP_WORDS的一个索引。Anindexinto$COMP_WORDSofthewordcontainingthecurrentcursorposition.COMP_LINE当前命令行。COMP_POINT指明相对于当前命令起点的当前光标位置。COMP_WORDS一个由当前命令行中单个词组成的变量数组。COMPREPLY
9、一个变量数组,Bash从中读取由一个可编程完整设备调用的一个shell函数生成的可能的完成。AnarrayvariablefromwhichBashreadsthepossiblecompletionsgeneratedbyashellfunctioninvokedbytheprogrammablecompletionfacility.DIRSTACK一个保存当前目录栈内容的变量数组。Bourne shell保留变量EUID当前用户的数字有效用户ID。FCEDIT内建命令fc使用-e选项时默认使用的编辑器。FIGNORE一个由冒号分隔的在补全文件名时要忽略的后缀列表。FUNCNAME任意当前正
10、在执行的shell函数名。GLOBIGNORE一个由冒号分隔的模板列表,定义在文件名展开时忽略的文件名集。GROUPS一个数组变量,包含当前用户作为成员的组的列表。histchars共有三个字符控制历史展开、快速替换和标记。HISTCMD当前命令的历史数字,或者在历史列表里的索引。HISTCONTROL定义一个命令是否加入到历史列表中。HISTFILE保存历史命令的文件名。默认值是/.bash_history。HISTFILESIZE在历史文件中包含的最大行数,默认为500。HISTIGNORE一个由冒号分隔的模式列表,用来决定哪些命令行应该保存在历史列表中。HISTSIZE在历史列表中记录的
11、最大命令数,默认为500。HOSTFILE包含与/etc/hosts格式相同的文件名,shell需要补全主机名时读取。HOSTNAME当前主机的名字。HOSTTYPE一个描述运行Bash的机器的字符串。IGNOREEOF控制shell接收到一个EOF字符作为独立输入的行为。INPUTRCReadline初始化文件的名字,取代默认值为/etc/inputrc。LANG用于为任意没有特别选择用LC_开头的变量指明的设置决定场合设置。Usedtodeterminethelocalecategoryforanycategorynotspecificallyselectedwithavariablest
12、artingwith LC_.LC_ALL这个变量取代LANG的值并为任意其他LC_变量指定一个区域种类。LC_COLLATE这个变量决定搜索文件名展开结果时使用的整理顺序,并决定在文件名展开和模式匹配里区域表达、等价类和处理序列的表现。Thisvariabledeterminesthecollationorderusedwhensortingtheresultsoffilenameexpansion,anddeterminesthebehaviorofrangeexpressions,equivalenceclasses,andcollatingsequenceswithinfilename
13、expansionandpatternmatching.LC_CTYPE这个变量决定在文件名展开和模板匹配里字符的解释和字符集的行为。LC_MESSAGES这个变量决定用于转换由“$”引导的双引号字符串的区域。LC_NUMERIC这个变量决定数字格式化的本地类别。LINENO当前执行的脚本或者shell函数的行数。LINES内建命令select用来决定打印选择列表的列长度。MACHTYPE一个以标准的GNUCPU-COMPANY-SYSTEM 格式来充分描述运行Bash的系统的类型的字符串。MAILCHECKshell从MAILPATH或MAIL变量里指定的文件中检查邮件的频度(秒)。OLDP
14、WD内建命令cd设置的之前的工作目录。OPTERR如果设置成1,Bash显示内建命令getopts生成的错误信息。OSTYPE一个描述运行Bash的操作系统的字符串。PIPESTATUS一个数组变量,包含一个最近运行过的前台管道(可能只包含一个命令)进程的退出状态值的列表。POSIXLY_CORRECT如果这个变量在bash启动的时候存在于环境变量中,shell将进入POSIX模式。PPIDshell父进程的进程ID。PROMPT_COMMAND如果设置了,这个值解释为一个在打印每个基本提示符(PS1)之前执行的命令。PS3这个变量的值被用作select命令的提示符。默认值是“#?”。PS4这
15、个值在-x选项启用时,在命令行前打印的提示符。PWD内建命令cd设置的当前工作目录。RANDOM每次这个参数被引用时,生成一个0和32767之间的随机整数。给这个变量指定一个值作为随机数生成器的种子。REPLY内建命令read的默认值。SECONDS这个变量扩展为shell运行的秒数。SHELLOPTS一个由冒号分隔的shell已经启用的选项列表。SHLVL新的Bash实例启动就增加一。TIMEFORMAT这个参数的值用来作为一个格式化的字符串用来指定以time保留字作为前缀的管道定时信息如何显示。TMOUT如果设成一个大于0的值。TMOUT作为内建命令read的默认超时时间。在一个交互she
16、ll中,当shell处于交互状态时,这个值作为等待在基本提示串后输入的秒数。在这个秒数后如果没有输入Bash就终止。UID数值,当前用户的真实用户ID。字符字符定义定义$*展开为位置参数,从1开始。当扩展发生在双引号时,它展开成一个单独的词,每个参数的值由IFS特殊变量的第一个字符分隔。$展开为位置参数,从1开始。当在双引号里展开时,每个参数展开成独立的词。$#把位置参数展开为十进制数字。$?展开成最近执行的前台管道程序的退出状态。$-一个连字符展开为当前选项标志内部命令集或者那些shell自己的集(如-i)$展开成shell的进程ID。$!展开成最近在后台(异步)执行的命令的进程ID。$0展
17、开成shell或者shell脚本名。$_下划线变量在shell启动时设置,包含shell的绝对文件名或者作为参数列表被执行的脚本。随后,它展开为前一个命令扩展后的最后一个参数。它同样设置为每个执行程序的全路径,放在那个命令的输出环境中。当检查邮件时,这个参数保存邮件文件的名字。特殊Bash变量 文件名替换用于匹配的字符称为通配符,例如:*匹配零个或者多个任意字符?匹配一个任意字符若干字符匹配方括号中任意一个字符一次出现如:Ls/dev/ttyS*Lscheng0?.txtLscheng0-2.txtLscheng0120-9.txt命令替换命令替换命令替换允许一个命令的输出来替换这个命令本身。
18、命令替换在一个命令这样封装的时候发生:$(command)或者象这样使用:command如:date=dateEcho$date或者date=$(date)Echo$date转义字符 转义字符:“”单引号与双引号单引号()用于保持在引号内的每个字符的字面值。双引号保持引号内的所有字符的字面值,除了$,shell语法练习linux.txt文件中有linuxcandisplay这么一行lcd=catlinux.txth=hellow=worldlinux=echo$lcd$h$wecho$lcd$h$wecho“$linux”说说2个echo分别显示什么内容Shell的输入与输出Echo常见-n(
19、禁用转义字符)e(可以使用转义字符)#!/bin/shecho-ethis3linesnnnechookRead#!/bin/shechoenteryouname:readnameechoenteryoupasswd:readpasswdecho$name$passwd算术替换用于算术计算:$()中的shell变量取值将换成整数,如:Var=45Echo$($var+3)注意只能用+-*/和(),并且只能做整数计算。练习:编写一个shell版本的计算器别名:alias一个别名允许使用一个字符串来代替一个字当它作为一个简单命令的第一个字时候。shell维护一个可以用alias和unalias内建
20、命令来设置或者取消的别名列表。用alias命令而不带选项的时候可以显示当前shell所知的别名列表。shell的历史记录history/bash_history文件中!n执行history中第n条指令!执行history中最后一条指令!str执行history中最后以str开头的命令注意:Shell具有的补全功能,请大家利用好。Shell脚本语法条件测试:test或者可以用test或者测试一个条件是否成立,如果测试结果为真,则该命令退出状态为0,如果为假,状态为1。test文件测试格式:testoptionfile或者optionfile-bfile块文件-cfile字符文件-dfile目录-
21、efile存在-pfile管道-rfile可读-sfile大于0-wfile可写-xfile可执行test-a逻辑与,操作符两边均为真,结果为真,否则为假。-o逻辑或,操作符两边一边为真,结果为真,否则为假。!逻辑否,条件为假,结果为真。test整数比较格式:testint1operatorint2-eq数值相等。-ne数值不相等。-gt第一个数大于第二个数。-lt第一个数小于第二个数。-le第一个数小于等于第二个数。-ge第一个数大于等于第二个数。n1-eqn2n1和n2相等n1-gen2n1大于或者等于n2n1-gtn2n1大于n2n1-len2n1小于或者等于n2n1-ltn2n1小于n
22、2n1-nen2n1不等于n2test字符串测试格式:testoptionstring或者optionstring=两个字符串相等。!=两个字符串不等。-z空串。-n非空串。s1=s2相等s1!=s2s1与s2不同s1s2s1的ASCII在s2后If语句if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。简单的if语句是:if条件then命令fi注意:使用if语句时,必须将then部分放在新行,否则会产生错误。如果要不分行,必须使用命令分隔符。现在简单if语句变为:if条件;then命令fiIf语句if语句其格式为:if条件1then命令1elif条件2then命令2el
23、se命令3fIIf条件1如果条件1为真Then那么命令1执行命令1elif条件2如果条件1不成立then那么命令2执行命令2else如果条件1,2均不成立命令3那么执行命令3fi完成练习:用shell编写猜数字程序在当前目录下查找指定文件for循环for循环一般格式为:for变量名in列表do命令1命令2done当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的shell命令和语句。变量名为任何单词。In列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换、字符串和文件名,下面看一些例子。for循环练习统计当前目录中的文件个数自动备份当前目录中的所有文件,并将他们打包并存放到/tmp目录中测试某些主机连通性while循环while循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为:while 命令d o命令1命令2.d o n e练习模拟用户认证程序login统计文件行数
限制150内