Shell基础与编程技术讲义.ppt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Shell 基础 编程 技术 讲义
- 资源描述:
-
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第四章Shell基础与编程技术,4.1 SHELL概述,4.2 SHELL程序设计基础,4.3 SHELL基本命令,4.4 SHELL变量,4.5 SHELL程序流程,4.6 程序调试,4.7 SHELL编程综合范例,4.8 实战技巧 系统资源查看与多命令执行,10/1/2026,1,4.1 shell概述,Shell是最基础和实用的linux工具,熟练掌握shell技巧及其使用方法,是用好linux的关键。用户对shell的熟练程度直接体现用户的linux编程水平。本章先了解shell,进而掌握shell命令、变量和程序控制结构、程序调试,最后通过理解综合范例,把握编程技巧,达到学以致用的目的。,shell是一个工具程序,在用户登录后由系统启动,解释并运行由命令行或脚本文件输入的命令,实现用户与内核间的交互。,Shell提供的变量、赋值语句、控制流等基本操作语句与高级语言中的函数调用极为相似,除了关键字与语法规则不同外,还有两点不同。一是参数可以为任意字符串,多数情况下字符串不用引号;二是参数表不用括号,各参数之间也不用逗号分隔。,10/1/2026,2,Linux系统提供了多种不同的shell。常用的有Bourne shell(简称sh)、C-shelll(简称csh)、Korn shell(简称ksh)和Bourne Again shell(简称bash)。它们的渊源和区别,请读者自己到网上遨游一下,便略知一二。,目前linux系统的缺省shell分别是Bourne Again shell,即bash。,要知道所用的linux有哪些版本的shell,可以查看/etc/shell目录下的文件。查看命令行如下,:,$cat/etc/shells,还可以用下面的命令来查看当前的shell类型:,#echo$SHELL,其中的“$SHELL”是环境变量,记录使用的shell型。可以用$exit命令退出当前shell。,10/1/2026,3,4.2 shell程序设计基础,shell擅长系统管理,shell脚本实质是命令批处理。复杂脚本一般包括判断、循环、文件测试等程序结构。这时应对linux工具集有一些理解。工具grep、sed和awk等,在处理命令输出和文件时功能很强大。建立shell脚本的步骤同建立文本文件相同。用vi等进行程序录入和编辑,也可以用cat和管道等命令直接建立一个脚本文件。,【例】4.1 建立一个shell脚本,在提示符后输入显示和重定向命令:,$cat myprogram 回车后直接输入命令,再回车并输入命令,如下所示:,#!/bin/sh,#filename:myprogram,x=”hello world.”,echo$x,y=”my first shell program.”,echo$y,exit,完成编辑按住Ctrl+Z退出,则myprogram的shell脚本程序就完成了,返回shell命令状态。,10/1/2026,4,10/1/2026,5,同其他语言一样,也可以通过使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写shell程序。程序最好以“#!/bin/sh”为开始的第一行。符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中使用/bin/sh来执行程序。当脚本编好后,要执行该脚本还要改变其文件为可执行文件属性。但在cygwin的linux模拟环境中可以直接执行而无需改变其文件属性。,改变脚本文件成为可执行文件属性的命令行的写法是:,$chmod+x myprogram 或$chmod 755 myprogram,最后,执行该程序的命令行写法是:,$./myprogram 或$bash myprogram,回车就可以看到程序的执行结果:,hello world.,my first shell program.,10/1/2026,6,在shell编程时,以#开头的句子表示这一行为注释。,Shell对用户输入的命令即文件名进行分析。如果文件标记为可执行,但不是编译过的程序,shell把它看作shell脚本,并解释执行。,用户开发的shell脚本可以驻留在命令搜索路径的目录之下如/bin、/usr/bin等,像普通命令一样使用。通过这样方式可以扩充新命令。,shell脚本经常被用来执行重复性的工作。当进入系统时要查看有无信件、现有用户群、将工作目录改为指定目录、显示当前日期等。完成这些工作的命令是固定的,可把它们写入一个shell脚本中,每次批处理完成。,有些固定工作的命令很复杂,如文件系统安装mount带多个选项和参数,此时用shell脚本存放该命令,就能提高效率。,shell的基本功能有运行程序、输入输出重定向、变量和文件名的替换、管道、编程与环境的控制等。,RedHat Linux带有不少快捷方式。就是home目录的简写形式。如想把一个名为sometext的文件复制到home目录下的docs子目录中,可以用#cp sometext/docs实现。另外,$cd回车可随时回到home目录。,10/1/2026,7,(1)bash 配置文件,在用户的home目录下,运行命令:,$ls.bash*,将会看到这些文件:,.bash_history:记录了用户以前输入的命令。,.bash_logout:当用户退出shell 时,要执行的命令。,.bash_profile:当用户登入shell 时,要执行的命令。,.bashrc:每次打开新的shell 时,要执行的命令。,其中.bash_profile只在会话开始时读取一次,而.bashrc每次打开新终端时都被读一次。.bash_profile经常设置先读.bashrc文件,用户能把所有配置都放进.bashrc里。,这些是用户个人设置,系统级设置在/etc/profile、/etc/bashrc及目录/etc/profile.d下的文件里。当系统与用户设置发生冲突时,用户设置有效。,10/1/2026,8,(2)提示符,每打开一个控制台console或xterm时,先看到提示符。默认提示符将显示用户名、主机名(默认localhost)、当前目录(表示home目录),最后一个字符是普通用户($)或是root(#)的标记。用户通过$PS1设置提示符。,命令:echo$PS1将显示当前的设定。默认设定提示符显示的只是当前目录的最后部分。可以用pwd(输出当前目录,print working directory)查看细节。,怎样让shell自动告诉用户的当前目录呢?,提示符等信息一般包含在文件/etc/bashrc中,用户可以通过编辑各自home目录下的.bash_profile和.bashrc来改变设置。,在man bash中的PROMPTING部分,对这些参数有详细说明。用户可以自行设置内容如时间、命令历史记录号或不同颜色等。,在/.bashrc中,用户比较清晰的设定是:PS1=0331mw0330m,root在/.bashrc中的设定是:PS1=0330;31mw0330m,这时用户得到的提示符是:/usr/bin,当用root时,变成:/usr/bin,用户已去掉了主机名和用户名。普通用户提示符可以是黑底白字或白底黑字。,10/1/2026,9,(3)改变$PATH,$PATH,与,$PS1,都是环境变量。输入,set,将列出所有当前定义的环境变量。用户看到的环境变量在shell配置文件中的定义,可能是用户自己的配置文件,也可能是由root通过/etc下面的系统级文件定义的。如果用户使用X,更多的变量将由X和用户窗口管理器或桌面环境的启动文件配置。,了解如何改变$PATH变量很有用,它决定了shell寻找命令或程序的目录路径。若要执行命令的目录在$PATH中,用户就不必输入这个命令的完整路径,能够直接执行。第三方软件一般没有把可执行文件放到标准目录中,需要添加到$PATH中,才能保证程序的正常运行。,用户如何处理一般的环境变量是有技巧的。所有环境变量名都大写,用户也可以自定义一些非大写的变量,如$path、$pAtH,但shell 不知道这些变量。变量名有时以$开头,有时不是。当设置一个变量时,用户直接用名称而不需要加$,但要获取变量的值就要在变量名前加$:,$echo$PATH,$/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin,否则命令行$echo PATH的执行结果就是:$PATH。,10/1/2026,10,处理$PATH变量时,用户不能只替换变量,而要将新字符串添加到原来的值中。用户不能用PATH=/some/directory,这将删除$PATH中的其它所有目录。用户在该终端运行程序时,必须给出完整路径。所以只能添加:,PATH=$PATH:/some/directory,当用户打开新终端运行echo$PATH时,返回的是旧$PATH值,看不到添加的新目录。因为用户定义的是局部环境变量。要定义全局变量,用户需要将局部变量输出(export),用export命令:,export PATH=$PATH:/some/directory,现在打开新终端,输入echo$PATH,将能看到新设置的$PATH。为了永久保存添加的路径,要将export行添加到用户.bash_profile文件。,不要在.bashrc中设置PATH,以免PATH目录意外增长。因为用户每打开一个终端,目录都会被添加,从而导致PATH变量目录的多次复制。,(4)历时记忆功能,bash命令的历史功能是把以往输入的命令记录下来,方便日后查询与再次使用。只要按向上键就能调出历史命令。与SHIFT键连用,可遍历该控制台中的历史输出。历史命令的编辑修改通过光标和Home、End等键完成。,用户可以为环境变量HISTFILE赋新值改变存放历史命令的文件,如:,$HISTFILE=/home/mengqc/.myhistory,10/1/2026,11,用户通过$PS1设置提示符。,(1)bash 配置文件,Shell对用户输入的命令即文件名进行分析。,12、故人江海别,几度隔山川。,就是home目录的简写形式。,详细跟踪和跟踪执行的区别在于:在执行命令前,详细跟踪显示命令行的原始内容,而跟踪执行则显示经过替换后的命令行的内容。,d/rc$runlevel.,continue也是shell的内部命令,其格式为continue或continue n。,s=expr$i *$i,bash_profile:当用户登入shell 时,要执行的命令。,如对系统的备份问题,可以用一些压缩工具。,其中op表示操作符,它可以是下列四个操作符之一“:-”、“:=”、“:+”和“:?”。,变量2的值取决于变量1(参数)是否为空串、用什么操作符及字符串的取值。,(1)整个程序的跟踪执行:sh-v 文件名。,其中int1 和int2 可以是任何正整数或负整数。,4.3 shell基本命令,Linux中的shell命令很多,第三章已进行了解析,这里把与编程有关的命令罗列出来,便于读者掌握。这些命令分为内部命令和外部命令两类。,4.3.1 内部命令,shell内部命令是shell本身具备的基本命令,执行速度比外部命令快,存放在内存中,在当前shell中立即被执行,不必创建新进程。编写shell程序时尽量使用内部命令,以提高程序的执行效率。,不同shell的内部命令大同小异,差别在于命令名或语法,用户只要熟悉一种shell就可以了。表4.2以bash为例列出常用的内部命令。,10/1/2026,12,10/1/2026,13,4.3.2 外部命令,shell除去内部命令以外的命令被称为外部命令或程序。常用的有mv、ls、cp等。用户在执行外部命令时,shell首先查询路径找到该命令,然后生成子shell,由它解释执行这条命令。在命令执行过程中,原shell(父shell)等待子shell的执行而进入睡眠态,一旦子shell执行完毕,子shell将唤醒原shell,而子shell的生命周期到此结束。,4.3.3 命令分组,在shell中有两种命令分组的方法:“()”和“”。当shell执行()中的命令时将再创建一个新的子进程,然后这个子进程执行圆括弧中的命令。当用户在执行某个命令时,若不想让命令运行对状态集合的改变,影响后面语句的执行时,就该把这些命令放在括弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受干扰。用于将顺序执行的命令输出结果用于另一个命令的输入(管道方式)。当用户使用圆括弧和花括弧时,需要在其前面加上转义符(、)以便shell知道他们不是用于命令执行的终止之用。,10/1/2026,14,4.3.4 函数,bash函数的实质是命令集合或批处理文件。在shell中定义的函数都是由若干条shell命令组成的命令集合体,与shell程序形式相似,可看作一条复合命令。不同之处在于它是多进程。函数定义的基本格式为:,function函数名(),若干命令行,其中关键字function可以缺省。调用函数的格式为:,函数名 参数1 参数2.,shell函数可以完成一些例行工作,可以有自己的退出状态,所以函数可以作为if、while等控制结构的条件。,在函数定义时一般不带参数,而在调用函数时带参数运行,shell此时把参数分别赋予相应的位置参数$1、$2、.及$*。,函数的规则是先定义后使用。调用函数时直接利用函数名,不带圆括号,与一般命令同样使用。shell脚本与函数间的参数传递可用位置参数和变量直接传递。变量值可以由shell脚本传递给被调用函数,而函数中所用的位置参数$1、$2等对应于函数调用语句中的实参,这与普通命令不同。,10/1/2026,15,【例】4.2,#func is a function name,#it echos the values of variables and arguments,func(),echo Lets begin now.,echo$a$b$c,echo$1$2$3,echo The end.,a=Working directory,b=is,c=pwd,func Welcome You Byby,echo Today is date ,shell中的函数把若干命令集合在一起,通过函数名调用。如果需要还可被多次调用。执行函数并不创建新的进程,是通过shell进程执行的。通常函数的最后一个命令执行后就退出被调函数。可以用return命令立即退出函数,其语法格式是:,return n,其中的n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执行后的退回值。,10/1/2026,16,【,例,】4.3,定义,4,个函数并实现其功能,upper()函数:将传递给它的文件中的字母转换成大写,并存放到同名的结尾为.out的文件中。,lower()函数:将传递给它的文件里的字母转换成小写,并存放到同名的结尾为.out的文件中。,print()函数:输出传递给它的文件的内容。,usage_error()函数:输出程序的帮助信息。,程序的主模块是case条件语句,根据命令行中第一个参数决定程序完成什么功能,并调用相应函数完成这个功能。,10/1/2026,17,4.3.5 shell,的命令组合,Linux,系统可以把系统命令、应用程序和用户程序有机地组合起来完成一系列任务。shell通过管道、输入输出重定向以及程序设计的方法来实现这一功能。通过这些方法,用户可以灵活高效地使用shell控制linux系统的各种资源。,管道是把一个应用程序的标准输出与另外一个应用程序的标准输入相连接的有效工具。管道的基本格式为:,应用程序管道操作符应用程序,管道操作符是一个代表管道的专用字符“|”。管道线是由管道操作符分隔的几个应用程序组成的序列。管道线实现了创建管道文件并重定向输入输出的功能。管道重定向与I/O重定向不同,前者直接把一个程序的输出与另一个程序的输入相连,不创建任何中间文件。Linux系统的一串管道线是一个命令表,送回的值是该命令表中最后一个管道线的出口状态。,命令表中分隔命令的符号有“;”或换行符。&表示条件为真(true)时执行其后面的管道线。“|”表示条件为假(false)时才执行后面的管道线。&表示前面的管道线在后台执行。,10/1/2026,18,通过命令、管道线和命令表,用户可以完成各种从简单到复杂的任务。,输入输出重定向主要有以下几种用法:,在标准管道重定向中,“”为输出重定向,“”为追加输出重定向。如“应用程序 2 文件”或“应用程序 2 文件”则将应用程序产生的写文件和标准错误输出的全部信息一起写入文件。使用&进行标准输出的重定向。如:“应用程序&2”命令就是把应用程序的输出重定向到标准错误输出中。,当系统执行shell命令时,会自动打开3个文件:标准输入(文件描述字为0),标准输出(文件描述字为1),标准错误输出(文件描述字为2)。,系统初始化时,将这3个文件连接到相应的终端,0对应键盘,1对应屏幕,2对应屏幕。如果用户键入了一个命令,系统就会自动执行该命令,并将结果送到屏幕上。如果用户输入的是错误命令,系统会自动将出错信息送到标准错误输出即屏幕上。,10/1/2026,19,4.3.6 shell特殊字符,shell中的特殊字符,都有特定的含义,如通配符“*”和“?”、管道线“|”、单引号和双引号等。在使用时应注意它们表示的意义和作用范围。,1.一般通配符,通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。常用的通配符有四种:,“*”匹配任意字符0或多次。如f*可以匹配以f开头的任意字符串。,“?”匹配任意一个字符,如f?匹配f1、fa等,但不匹配f、fabc等。,“”匹配该字符组限定的任何一个字符。如fa-d与fabcd作用相同。,“!”表示不在一对方括号中列出的字符。如f!1-9.c表示以f开头,后面一个字符不是数字1至9的.c文件名,它匹配fa.c、fb.c等。在一个正则表达式中,可以同时使用“*”和“?”。,10/1/2026,20,2.模式表达式,模式表达式是包含一个或多个通配符的字符序列。其形式和含义如下:,*(模式表)匹配给定模式表中“模式”的0或多次出现,各模式之间以“|”分开。例如,file*(.c.o)将匹配文件file、file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等,但不匹配file.h或file.s等。,+(模式表)匹配给定模式表中“模式”的1次或多次出现,各模式之间以“|”分开。例如,file+(.c|.o)匹配文件file.c、file.c.o等,但不匹配file。,?(模式表)匹配模式表中任何一种“模式”的0或1次出现,各模式之间以“|”分开。例如file?(.c.o)只匹配file、file.c和file.o,不匹配file.c.o等。,(模式表)仅匹配模式表中给定“模式”的一次出现。,!(模式表)除给定模式表中一个“模式”外,它可匹配其它任何东西。,可以看出,模式表达式的定义是递归的,每个表达式中都可以包含一个或多个模式。例如file*(.cho.sh)是合法的模式表达式。,10/1/2026,21,3.引 号,在shell中引号分为三种:单引号、双引号和倒引号。,双引号中的字符,除$、倒引号()和反斜线()仍保留其特殊功能外,其余字符均作为普通字符对待。“$”表示变量替换,即用其后指定的变量的值来代替$和变量;倒引号表示命令替换;仅当“”后面的字符是下述字符之一时,“”才是转义字符,这些字符是:“$”、“”、“”、“”或换行符。转义字符告诉shell不对其后面的字符进行特殊处理,只当普通字符。如:,$echo My current dir is pwd and logname is$LOGNAME,My current dir is/home/mengqc and logname is mengqc,单引号中的字符都作为普通字符出现。例如,,$echo The time is date ,the file is$HOME/abc,The time is date ,the file is$HOME/abc,倒引号中的字符串被shell解释为命令行。执行时先执行该命令行,并以它的标准输出结果取代整个倒引号部分。在前面示例中已见过。例如,,$echo current directory is pwd,current directory is /home/mengqc,注释:shell程序中以“#”开头的正文行都表示注释。注释行用来说明程序的功能、结构、算法和变量等,增加程序可读性。在执行时注释行被忽略。,10/1/2026,22,4.4 shell变量,shell用变量存放字符串,变量没有存储类型,使用时直接定义并赋值。shell有环境变量和临时变量之分。环境变量是永久性变量,其值不会随shell脚本执行结束而消失。临时变量是在shell程序内部定义的,使用范围仅限于程序内部,程序执行结束就随之消失了。,Bash,作为常用的,shell,,其变量和,C,变量有区别,值得注意的问题有:,Bash,变量在引用时要在变量前加,$,符。第一次赋值及在,for,循环头部不用加,$,符号;,Bash,中没有浮点型变量,也没有浮点运算;,Bash,整形变量的算术运算要经过,let,或,expr,语句处理。在变量赋值时,“,=”,左右两边都不能有空格,,Bash,语句的结尾不加分号,;,。,在变量之间的比较操作上,整数变量和字符串变量各不相同。判断整数,a,和,b,是否相等就写做,if$a=$b,,判断整数,a,是否大于整数,b,就写做,if$a-gt$b,。比较字符串,a,和,b,是否相等就写作:,if$a=$b,,判断字符串,a,是否为空就写作:,if -z$a,。判断整数变量,a,是否大于,b,就写作:,if$a-gt$b,。注意在“,”,和“,”,符号的左右侧必须留有空格。如,if -x/root,可用来判断当前用户是否可以进入,/root,目录。,10/1/2026,23,4.4.1 用户自定义变量,变量和shell是紧密相关的,bash有两个基本的系统配置文件:/etc/bashrc和/etc/profile。它们包含两组不同的变量:shell变量和环境变量。前者只在特定shell中固定(如bash),后者可在不同shell中固定。显然,shell变量是局部的,而环境变量是全局的。环境变量通过shell命令设置,设置好的环境变量又可以被所有当前用户运行的程序使用。对于bash可以通过变量名来访问相应的环境变量,通过export来设置环境变量。,用户定义的变量是最普通的shell变量。变量名以字母或下划线开头的字母、数字和下划线序列,且大小写字母意义不同。如dir与Dir是不同变量。这与C语言中标识符的定义相同。变量名的长度不受限制。定义变量并赋值的一般形式是:变量名=字符串,例如:myfile=/usr/meng/ff/m1.c,10/1/2026,24,变量值的改变,只须利用赋值语句重新赋值。未赋值的变量仅含一个空串。在程序中使用变量值,要在变量名前面加上一个符号“$”。例如,,,$dir=/usr/meng/ff,则命令行$echo$dir 的显示结果为:,/usr/meng/ff,如果在赋值变量中包含空格、制表符或换行符,那么就应该用双引号把这个字符串括起来。例如,:,names=Zhangsan Lisi Wangwu,可以将一个命令的执行结果赋值给变量。有两种替换方式:使用倒引号或小括号引用命令。例如:将当前工作目录的全路径名存放到变量dir中,可以输入以下命令行:,$dir=pwd,或,$dir=$(pwd),一个变量可以是字符串,或再定义为整数。如果对该变量进行整数运算,就可以被解释为整数;如果进行字符串操作,它就被看作为字符串。,10/1/2026,25,【,例,】4.4,关键字,let,的应用,#!/bin/bash,x=2006,let x=$x+1,echo$x,x=a string.,echo$x,关于整数变量计算,有如下几种:,+-*/%,,它们的意思和字面意思相同,在*和,/,之前必须冠以反斜线,以免被,SHELL,先行解释。整数运算一般通过,let,和,expr,指令来实现,如对变量,x,加,1,可以写作:,let x=$x+1,或者,x=expr$x+1,。,$#,传入脚本的命令行参数个数;,$*,所有命令行参数值,在各个参数值之间留有空格;,10/1/2026,26,为了使某个变量存在于一个局部程序块中,引入了局部变量的概念。,Bash,变量首次被赋初值时加上,local,关键字就可以声明为局部变量,如:,#!/bin/bash,HELLO=var1,echo$HELLO,function hello,local HELLO=var2,echo$HELLO,echo$HELLO,该程序的执行结果是:,var1,var2,var1,这个执行结果表明全局变量,$HELLO,的值在执行函数,hello,时并没有改变,表明局部变量,$HELLO,的作用域在于函数的程序块中。,10/1/2026,27,4.4.2 变量的类型声明,Bash中变量的类型声明一般用关键词declare,其语法格式为:,declare+/-rxia变量名称设置值,其所带的参数含义是:-/+a 设置/撤消变量的数组属性;-/+i 设置/撤消变量的整数属性,但变量可以是数值,字符串或运算式;-/+r 设置/撤消变量的只读属性;-/+x 设置/撤消变量输出属性,指定变量为环境变量供shell外程序使用;-p 显示变量属性;-f定义函数或仅显示函数。,在前5个选项中用来声明变量并设置变量的属性(rixa即为变量的属性),在第6个选项中用来显示shell函数。若不加上参数,则显示全部的shell变量与函数(与执行set指令的效果相同)。参数-用来指定变量的属性,+则取消变量所设的属性。,#!/bin/bash,declare-i a=2,declare-i b=3,declare-i c=$a+$b,echo$c,这样出来的结果才能是5。,10/1/2026,28,4.4.3 数组变量,bash只提供一维数组,数组的大小没有限定。和C类似,数组元素下标由0开始。获取数组中的元素要利用下标。下标是整数或算术表达式,值=0。可用赋值语句对数组赋值。形式是:数组名下标值。,【例】4.5$city0=Beijing or$city1=Shanghai,用declare显式声明数组形式是:declare -a 数组名,读取数组元素值的一般格式是:$数组名下标,【例】4.6$echo$city0,Beijing,数组元素可单独逐个赋值或组合赋值。形式是:,数组名=(值1 值2 .值n);其中各个值之间以空格分开。如:,$A=(this is an shell example script),$echo$A*,则显示的结果为:$this is an shell example script$echo$A6,由于数组初值有6个,所以A元素个数是6。A6超出了数组A范围,被认为是新元素,由于没有赋值,所以是空串。数组名表示下标为0的数组元素,如city就等价于city0。使用*或做下标,则会以数组中所有元素取代*或。,10/1/2026,29,4.4.4 变量的引用,在bash中,有效的变量引用表达式有以下几种形式:,$name$name#pattern,$name$name#pattern,$namen$name%pattern,$name*$name%pattern,$name$#,$name:-word$#*,$name:=word$#name,$name:?word$#name*,$name:+word$#name,10/1/2026,30,这些不同形式的意义解释,表达式$name表示变量name的值,若未定义,则用空值替换。,表达式$name将被变量name的值替换。用花括号括起name,是把变量名与后面字符分隔开,避免混淆。替换后花括号被取消。,$namen表示数组变量name中第n个元素的值。,表达式$name*和$name都表示数组name中所有非空元素值,用空格分开。用双引号括起来时,$name*被扩展成字符串,各数组元素以空格分开;而$name被扩展成多个词,每个数组元素是一个词。如果数组name中没有元素,则$name被扩展为空串。,表达式$name#pattern和$name#pattern,如果pattern(表示匹配模式)与name值的开头匹配,那么name的值去掉匹配部分后的结果就是该表达式的值;否则,name的值就是该表达式的值。在第一种格式中,name值去掉的部分是与pattern匹配的最少的部分;而第二种格式中,name值去掉的部分是与pattern匹配的最多的部分。,表达式$name%pattern和$name%pattern,如果pattern与name值的末尾匹配,那么name的值中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。,表达式$#和$#*的值分别是由$和$*返回的参数的个数。,表达式$#namei的值是数组name第i个元素值的长度。,表达式$#name*和$#name的值都是数组name的元素个数。,10/1/2026,31,4.4.5 键盘输入变量,利用read命令可从键盘读数据赋给指定变量。read命令的一般格式是:,read 变量1 变量2。例如:,read a b c,输入数据时,数据间以空格或制表符分隔。如果变量个数与给定数据个数相同,则依次对应赋值;如果变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据;如果变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串。,10/1/2026,32,4.4.6 位置变量,在执行linux命令或shell脚本时可以用实参替代位置变量,它们的名称很特别,分别是0、1、29。因为它们与命令行上具体位置的实参相对应:命令名(文件名)对应位置变量0,第一个实参对应位置变量1,第二个实参对应位置变量2如果位置变量是由两个或更多个数字构成,必须把它们用一对花括号括起来,如10、11。命令行实参与脚本中位置变量的对应关系如下:,comm c1 c2 c3 c4 c10 c11,$0$1$2$3$4$10$11,【例】4.7,$set pwd;ls;date,$echo$1$2$3$9$10$11,/home/mengqc bash_1 ex1 12 3 21:52:32,在cygwin中的应用情况见图4.1所示。,10/1/2026,33,如果在脚本中使用的位置参数不超过9个,那么只用$1$9即可。但是,实际给定的命令行参数有可能超过9个,此时就要用shift命令移动位置参数。每执行一次shift命令,就把命令行上的实参向左移一位,即相当于位置参数向右移动一个位置,如表4.3所示。,表4.3 位置变量的shift对应关系,命令行Ex7ABCDEF原位置参数$0$1$2$3$4$5$6新位置参数$0$1$2$3$4$5表4.3列出了实参与位置参数的对应关系。可以看出,shift命令执行后新$1的值是原$2的值,新$2的值是原$3的值,依此类推。shift命令不能将$0移走,所以经shift右移后,$0的值不会变化,见图4.2所示。,10/1/2026,34,4.4.7 预定义特殊变量,shell中预定义的特殊含义的shell变量值只能由shell根据实际情况赋值,不能通过用户重新设置。下面给出这些特殊变量的表示形式及意义。,$#命令行上实际参数的个数,不包含shell文件名。,$?上一条命令执行后的返回值(也称为“退出码”),是一个十进制数。多数shell命令执行成功时,返回值为0;执行失败则返回非0值。,图4.2 shift右移位置参数的变化情况,$当前进程的进程号。,$!上一个后台命令对应的进程号,是由15位数字构成的数字串。,$-由当前shell设置的执行标志名组成的字符串。例如:,set-xv,这个命令行给shell设置了标志-x和-v(用于跟踪输出)。,$*表示命令行中实际给出的所有实参字符串,不限于9个实参。,$它与$*基本功能相同,但“$”与“$*”不同。,$0:保存程序名。,10/1/2026,35,4.4.8 环境变量与置换变量,PWD是指用户当前目录的全名 PPID是指父进程ID,$是指当前进程ID UID是指当前用户的User ID,PATH是指查找命令的目录列表。PATH变量含带冒号符的字符串。,USER是指用户账号MAIL是指系统信箱的路径。,TERM是指终端类型。LOGNAME是用户登录名,SECONDS是指当前运行的bash进程的运行时间(以秒为单位),HOME是指用户home目录的路径名,是cd命令的默认参数,COLUMNS是指定义了命令编辑模式下可使用命令行的长度,EDITOR是指默认的行编辑器 IFS是定义SHELL使用的分隔符,TMOUT SHELL指自动退出时间(秒),设为0禁止SHELL自动退出,PS1是指主命令提示符 PS2指二级命令提示符,要求输入数据时用,PS3是select的命令提示符PS4是指调试命令提示符,LD_LIBRARY_PATH是指寻找库的路径,以冒号分隔。,参数置换变量的一般形式是:变量2=$变量1 op 字符串,其中op表示操作符,它可以是下列四个操作符之一“:-”、“:=”、“:+”和“:?”。变量2的值取决于变量1(参数)是否为空串、用什么操作符及字符串的取值。在操作符的前后不要留空格。,10/1/2026,36,4.4.9 算术运算,bash中的整数算术运算命令是let,其语法格式为:let arg,其中arg是单独的算术表达式,使用的是C语言中表达式的语法、优先级和结合性。除+、-和逗号(,)之外,所有整型运算符都能支持。提供方幂运算符“*”。命名的参数可以在算术表达式中直接利用名称访问,前面不带“$”符号。当访问命名参数时,就作为算术表达式计算它的值。算术表达式按长整数进行求值,不检查溢出。但用0作除数就会产生错误。,let 命令的替代表示形式是:(算术表达式),例如,let j=i*6+2等价于(j=i*6+2)。,如果表达式的值是非0,那么返回状态值0;否则返回状态值1。当表达式中有shell的特殊字符时,必须用双引号将其括起来。【例】如,,,let val=a|b,。如果不括起来,shell会把命令行let val=a|b中的“|”看成管道符,将其左右两边看成不同的命令,因而无法正确计算表达式的值。,10/1/2026,37,4.5 shell程序流程,shell具有一般高级程序设计语言所具有的控制结构等复杂功能,如if语句、case语句、循环结构和函数等。,4.5.1 测试语句test,条件测试有三种常用形式:一是test命令,二是一对方括号,这两种形式是完全等价的。三是两对方括号,即 条件表达式。test命令可以和多种系统运算符一起使用,这些运算符可以分为四类:文件属性及权限测试运算符、字符串测试运算符、数值测试运算符和逻辑运算符。与传统语言不同,shell用于指定条件值的不是布尔表达式而是命令和字符串。,10/1/2026,38,test测试命令用法,Test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如表4.4所示。,test可以对字符串、整数和文件进行条件测试。,Linux还提供了与(“!”)、或(“展开阅读全文

咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。
咨信网小贴示:
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】


Shell基础与编程技术讲义.ppt
















自信AI助手














微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/14504407.html