[精选]Shell基础与编程技术讲义.ppt
《[精选]Shell基础与编程技术讲义.ppt》由会员分享,可在线阅读,更多相关《[精选]Shell基础与编程技术讲义.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章Shell基础与编程技术4.1 SHELL概述4.2 SHELL程序设计基础4.3 SHELL基本命令4.4 SHELL变量4.5 SHELL程序流程4.6 程序调试4.7 SHELL编程综合范例4.8 实战技巧 系统资源查看与多命令执行4.1 shell概述Shell是最基础和实用的是最基础和实用的linux工具,熟练掌握工具,熟练掌握shell技巧及其技巧及其使用方法,是用好使用方法,是用好linux的关键。用户对的关键。用户对shell的熟练程度直的熟练程度直接表达用户的接表达用户的linux编程水平。本章先了解编程水平。本章先了解shell,进而掌握,进而掌握shell命令、变量
2、和程序控制结构、程序调试,最后通过理命令、变量和程序控制结构、程序调试,最后通过理解综合范例,把握编程技巧,到达学以致用的目的。解综合范例,把握编程技巧,到达学以致用的目的。shell是一个工具程序,在用户登录后由系统启动,解释并是一个工具程序,在用户登录后由系统启动,解释并运行由命令行或脚本文件输入的命令,实现用户与内核间运行由命令行或脚本文件输入的命令,实现用户与内核间的交互。的交互。Shell提供的变量、赋值语句、控制流等基本操作语句与高提供的变量、赋值语句、控制流等基本操作语句与高级语言中的函数调用极为相似,除了关键字与语法规则不级语言中的函数调用极为相似,除了关键字与语法规则不同外,
3、还有两点不同。一是参数可以为任意字符串,多数同外,还有两点不同。一是参数可以为任意字符串,多数情况下字符串不用引号;二是参数表不用括号,各参数之情况下字符串不用引号;二是参数表不用括号,各参数之间也不用逗号分隔。间也不用逗号分隔。Linux系统提供了多种不同的系统提供了多种不同的shell。常用的有。常用的有Bourneshell简称简称sh、C-shelll简称简称csh、Kornshell简称简称ksh和和BourneAgainshell简称简称bash。它们的渊源和区。它们的渊源和区别,请读者自己到网上遨游一下,便略知一二。别,请读者自己到网上遨游一下,便略知一二。目前目前linux系统
4、的缺省系统的缺省shell分别是分别是BourneAgainshell,即,即bash。要知道所用的要知道所用的linux有哪些版本的有哪些版本的shell,可以查看,可以查看/etc/shell目录下的文件。查看命令行如下目录下的文件。查看命令行如下:$cat/etc/shells还可以用下面的命令来查看当前的还可以用下面的命令来查看当前的shell类型:类型:#echo$SHELL其中的其中的“$SHELL是环境变量,记录使用的是环境变量,记录使用的shell型。可以型。可以用用$exit命令退出当前命令退出当前shell。4.2 shell程序设计基础shell擅长系统管理,擅长系统管理
5、,shell脚本实质是命令批处理。复杂脚本一般包括判脚本实质是命令批处理。复杂脚本一般包括判断、循环、文件测试等程序结构。这时应对断、循环、文件测试等程序结构。这时应对linux工具集有一些理解。工具集有一些理解。工具工具grep、sed和和awk等,在处理命令输出和文件时功能很强大。建立等,在处理命令输出和文件时功能很强大。建立shell脚本的步骤同建立文本文件相同。用脚本的步骤同建立文本文件相同。用vi等进行程序录入和编辑,等进行程序录入和编辑,也可以用也可以用cat和管道等命令直接建立一个脚本文件。和管道等命令直接建立一个脚本文件。【例】【例】4.1建立一个建立一个shell脚本,在提示
6、符后输入显示和重定向命令:脚本,在提示符后输入显示和重定向命令:$catmyprogram回车后直接输入命令,再回车并输入命令,如下回车后直接输入命令,再回车并输入命令,如下所示:所示:#!/bin/sh#filename:myprogramx=helloworld.echo$xy=myfirstshellprogram.echo$yexit完成编辑按住完成编辑按住Ctrl+Z退出,则退出,则myprogram的的shell脚本程序就完成了,返回脚本程序就完成了,返回shell命令状态。命令状态。同其他语言一样,也可以通过使用任意一种文字编辑器,比方同其他语言一样,也可以通过使用任意一种文字编
7、辑器,比方nedit、kedit、emacs、vi等来编写等来编写shell程序。程序最好以程序。程序最好以“#!/bin/sh为开为开始的第一行。符号始的第一行。符号#!用来告诉系统它后面的参数是用来执行该文件的程用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中使用序。在这个例子中使用/bin/sh来执行程序。当脚本编好后,要执行该来执行程序。当脚本编好后,要执行该脚本还要改变其文件为可执行文件属性。但在脚本还要改变其文件为可执行文件属性。但在cygwin的的linux模拟环境模拟环境中可以直接执行而无需改变其文件属性。中可以直接执行而无需改变其文件属性。改变脚本文件成为可执行文
8、件属性的命令行的写法是:改变脚本文件成为可执行文件属性的命令行的写法是:$chmod+xmyprogram或或$chmod755myprogram最后,执行该程序的命令行写法是:最后,执行该程序的命令行写法是:$./myprogram或或$bashmyprogram回车就可以看到程序的执行结果:回车就可以看到程序的执行结果:helloworld.myfirstshellprogram.在在shell编程时,以编程时,以#开头的句子表示这一行为注释。开头的句子表示这一行为注释。Shell对用户输入的命令即文件名进行分析。如果文件标记为可执行,对用户输入的命令即文件名进行分析。如果文件标记为可执行
9、,但不是编译过的程序,但不是编译过的程序,shell把它看作把它看作shell脚本,并解释执行。脚本,并解释执行。用户开发的用户开发的shell脚本可以驻留在命令搜索路径的目录之下如脚本可以驻留在命令搜索路径的目录之下如/bin、/usr/bin等,像普通命令一样使用。通过这样方式可以扩充新命令。等,像普通命令一样使用。通过这样方式可以扩充新命令。shell脚本经常被用来执行重复性的工作。当进入系统时要查看有无信脚本经常被用来执行重复性的工作。当进入系统时要查看有无信件、现有用户群、将工作目录改为指定目录、显示当前日期等。完成件、现有用户群、将工作目录改为指定目录、显示当前日期等。完成这些工作
10、的命令是固定的,可把它们写入一个这些工作的命令是固定的,可把它们写入一个shell脚本中,每次批处脚本中,每次批处理完成。理完成。有些固定工作的命令很复杂,如文件系统安装有些固定工作的命令很复杂,如文件系统安装mount带多个选项和参带多个选项和参数,此时用数,此时用shell脚本存放该命令,就能提高效率。脚本存放该命令,就能提高效率。shell的基本功能有运行程序、输入输出重定向、变量和文件名的替换、的基本功能有运行程序、输入输出重定向、变量和文件名的替换、管道、编程与环境的控制等。管道、编程与环境的控制等。RedHatLinux带有不少快捷方式。带有不少快捷方式。就是就是home目录的简写
11、形式。如目录的简写形式。如想把一个名为想把一个名为sometext的文件复制到的文件复制到home目录下的目录下的docs子目子目录中,可以用录中,可以用#cpsometext/docs实现。另外,实现。另外,$cd回车可随时回到回车可随时回到home目录。目录。1bash 配置文件在用户的在用户的home目录下,运行命令:目录下,运行命令:$ls.bash*将会看到这些文件:将会看到这些文件:.bash_history:记录了用户以前输入的命令。:记录了用户以前输入的命令。.bash_logout:当用户退出:当用户退出shell时,要执行的命令。时,要执行的命令。.bash_profile
12、:当用户登入:当用户登入shell时,要执行的命令。时,要执行的命令。.bashrc:每次翻开新的:每次翻开新的shell时,要执行的命令。时,要执行的命令。其中其中.bash_profile只在会话开始时读取一次,而只在会话开始时读取一次,而.bashrc每次翻开新终每次翻开新终端时都被读一次。端时都被读一次。.bash_profile经常设置先读经常设置先读.bashrc文件,用户能把文件,用户能把所有配置都放进所有配置都放进.bashrc里。里。这些是用户个人设置,系统级设置在这些是用户个人设置,系统级设置在/etc/profile、/etc/bashrc及目录及目录/etc/profi
13、le.d下的文件里。当系统与用户设置发生冲突时,用户设置下的文件里。当系统与用户设置发生冲突时,用户设置有效。有效。2提示符每翻开一个控制台每翻开一个控制台console或或xterm时,先看到提示符。默认提示符将显示用户名、时,先看到提示符。默认提示符将显示用户名、主机名默认主机名默认localhost、当前目录、当前目录表示表示home目录,最后一个字符是目录,最后一个字符是普通用户普通用户$或是或是root#的标记。用户通过的标记。用户通过$PS1设置提示符。设置提示符。命令:命令:echo$PS1将显示当前的设定。默认设定提示符显示的只是当前目录的最后局将显示当前的设定。默认设定提示符
14、显示的只是当前目录的最后局部。可以用部。可以用pwd输出当前目录,输出当前目录,printworkingdirectory查看细节。查看细节。怎样让怎样让shell自动告诉用户的当前目录呢?自动告诉用户的当前目录呢?提示符等信息一般包含在文件提示符等信息一般包含在文件/etc/bashrc中,用户可以通过编辑各自中,用户可以通过编辑各自home目录下目录下的的.bash_profile和和.bashrc来改变设置。来改变设置。在在manbash中的中的PROMPTING局部,对这些参数有详细说明。用户可以自行设置局部,对这些参数有详细说明。用户可以自行设置内容如时间、命令历史记录号或不同颜色等
15、。内容如时间、命令历史记录号或不同颜色等。在在/.bashrc中,用户比较清晰的设定是:中,用户比较清晰的设定是:PS1=0331mw0330mroot在在/.bashrc中的设定是:中的设定是:PS1=0330;31mw0330m这时用户得到的提示符是:这时用户得到的提示符是:/usr/bin当用当用root时,变成:时,变成:/usr/bin用户已去掉了主机名和用户名。普通用户提示符可以是黑底白字或白底黑字。用户已去掉了主机名和用户名。普通用户提示符可以是黑底白字或白底黑字。3改变$PATH$PATH与与$PS1都是环境变量。输入都是环境变量。输入set将列出所有当前定义的环境变量。将列出
16、所有当前定义的环境变量。用户看到的环境变量在用户看到的环境变量在shell配置文件中的定义,可能是用户自己的配置文配置文件中的定义,可能是用户自己的配置文件,也可能是由件,也可能是由root通过通过/etc下面的系统级文件定义的。如果用户使用下面的系统级文件定义的。如果用户使用X,更多的变量将由,更多的变量将由X和用户窗口管理器或桌面环境的启动文件配置。和用户窗口管理器或桌面环境的启动文件配置。了解如何改变了解如何改变$PATH变量很有用,它决定了变量很有用,它决定了shell寻找命令或程序的目录路寻找命令或程序的目录路径。假设要执行命令的目录在径。假设要执行命令的目录在$PATH中,用户就不
17、必输入这个命令的完中,用户就不必输入这个命令的完整路径,能够直接执行。第三方软件一般没有把可执行文件放到标准目整路径,能够直接执行。第三方软件一般没有把可执行文件放到标准目录中,需要添加到录中,需要添加到$PATH中,才能保证程序的正常运行。中,才能保证程序的正常运行。用户如何处理一般的环境变量是有技巧的。所有环境变量名都大写,用户也用户如何处理一般的环境变量是有技巧的。所有环境变量名都大写,用户也可以自定义一些非大写的变量,如可以自定义一些非大写的变量,如$path、$pAtH,但,但shell不知道这不知道这些变量。变量名有时以些变量。变量名有时以$开头,有时不是。当设置一个变量时,用户直
18、开头,有时不是。当设置一个变量时,用户直接用名称而不需要加接用名称而不需要加$,但要获取变量的值就要在变量名前加,但要获取变量的值就要在变量名前加$:$echo$PATH$/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin否则命令行否则命令行$echoPATH的执行结果就是:的执行结果就是:$PATH。处理处理$PATH变量时,用户不能只替换变量,而要将新字符串添加到原来的值变量时,用户不能只替换变量,而要将新字符串添加到原来的值中。用户不能用中。用户不能用PATH=/some/directory,这将删除,这将删除$PATH中的其它所有中的其它所有目录。用
19、户在该终端运行程序时,必须给出完整路径。所以只能添加:目录。用户在该终端运行程序时,必须给出完整路径。所以只能添加:PATH=$PATH:/some/directory当用户翻开新终端运行当用户翻开新终端运行echo$PATH时,返回的是旧时,返回的是旧$PATH值,看不到添加的值,看不到添加的新目录。因为用户定义的是局部环境变量。要定义全局变量,用户需要将新目录。因为用户定义的是局部环境变量。要定义全局变量,用户需要将局部变量输出局部变量输出export,用,用export命令:命令:exportPATH=$PATH:/some/directory现在翻开新终端,输入现在翻开新终端,输入ec
20、ho$PATH,将能看到新设置的,将能看到新设置的$PATH。为了永久保。为了永久保存添加的路径,要将存添加的路径,要将export行添加到用户行添加到用户.bash_profile文件。文件。不要在不要在.bashrc中设置中设置PATH,以免,以免PATH目录意外增长。因为用户每翻开一目录意外增长。因为用户每翻开一个终端,目录都会被添加,从而导致个终端,目录都会被添加,从而导致PATH变量目录的屡次复制。变量目录的屡次复制。4历时记忆功能历时记忆功能bash命令的历史功能是把以往输入的命令记录下来,方便日后查询与再次使命令的历史功能是把以往输入的命令记录下来,方便日后查询与再次使用。只要按
21、向上键就能调出历史命令。与用。只要按向上键就能调出历史命令。与SHIFT键连用,可遍历该控制台键连用,可遍历该控制台中的历史输出。历史命令的编辑修改通过光标和中的历史输出。历史命令的编辑修改通过光标和Home、End等键完成。等键完成。用户可以为环境变量用户可以为环境变量HISTFILE赋新值改变存放历史命令的文件,如:赋新值改变存放历史命令的文件,如:$HISTFILE=/home/mengqc/.myhistory4.3 shell基本命令Linux中的中的shell命令很多,第三章已进行了解析,这里把命令很多,第三章已进行了解析,这里把与编程有关的命令罗列出来,便于读者掌握。这些命令分与
22、编程有关的命令罗列出来,便于读者掌握。这些命令分为内部命令和外部命令两类。为内部命令和外部命令两类。4.3.1内部命令内部命令shell内部命令是内部命令是shell本身具备的基本命令,执行速度比外本身具备的基本命令,执行速度比外部命令快,存放在内存中,在当前部命令快,存放在内存中,在当前shell中立即被执行,不中立即被执行,不必创立新进程。编写必创立新进程。编写shell程序时尽量使用内部命令,以提程序时尽量使用内部命令,以提高程序的执行效率。高程序的执行效率。不同不同shell的内部命令大同小异,差异在于命令名或语法,的内部命令大同小异,差异在于命令名或语法,用户只要熟悉一种用户只要熟悉
23、一种shell就可以了。表就可以了。表4.2以以bash为例列出常为例列出常用的内部命令。用的内部命令。4.3.2 外部命令shell除去内部命令以外的命令被称为外部命令或程序。常用的有除去内部命令以外的命令被称为外部命令或程序。常用的有mv、ls、cp等。用户在执行外部命令时,等。用户在执行外部命令时,shell首先查询路径找到该命令,首先查询路径找到该命令,然后生成子然后生成子shell,由它解释执行这条命令。在命令执行过程中,原,由它解释执行这条命令。在命令执行过程中,原shell父父shell等待子等待子shell的执行而进入睡眠态,一旦子的执行而进入睡眠态,一旦子shell执行完执行
24、完毕,子毕,子shell将唤醒原将唤醒原shell,而子,而子shell的生命周期到此结束。的生命周期到此结束。4.3.3命令分组命令分组在在shell中有两种命令分组的方法:中有两种命令分组的方法:“和和“。当。当shell执行执行中的命令时将再创立一个新的子进程,然后这个子进程执行圆括弧中的命令时将再创立一个新的子进程,然后这个子进程执行圆括弧中的命令。当用户在执行某个命令时,假设不想让命令运行对状态集中的命令。当用户在执行某个命令时,假设不想让命令运行对状态集合的改变,影响后面语句的执行时,就该把这些命令放在括弧中,这合的改变,影响后面语句的执行时,就该把这些命令放在括弧中,这样就能保证
25、所有的改变只对子进程产生影响,而父进程不受干扰。样就能保证所有的改变只对子进程产生影响,而父进程不受干扰。用于将顺序执行的命令输出结果用于另一个命令的输入管道方式。用于将顺序执行的命令输出结果用于另一个命令的输入管道方式。当用户使用圆括弧和花括弧时,需要在其前面加上转义符、以便当用户使用圆括弧和花括弧时,需要在其前面加上转义符、以便shell知道他们不是用于命令执行的终止之用。知道他们不是用于命令执行的终止之用。4.3.4 函数bash函数的实质是命令集合或批处理文件。在函数的实质是命令集合或批处理文件。在shell中定义的函数都是由假设中定义的函数都是由假设干条干条shell命令组成的命令集
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精选 Shell 基础 编程 技术 讲义
限制150内