您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Linux程序设计__技术技巧与项目实践---Shell基础与编
2019/9/51第四章Shell基础与编程技术4.1SHELL概述4.2SHELL程序设计基础4.3SHELL基本命令4.4SHELL变量4.5SHELL程序流程4.6程序调试4.7SHELL编程综合范例4.8实战技巧系统资源查看与多命令执行2019/9/524.1shell概述•Shell是最基础和实用的linux工具,熟练掌握shell技巧及其使用方法,是用好linux的关键。用户对shell的熟练程度直接体现用户的linux编程水平。本章先了解shell,进而掌握shell命令、变量和程序控制结构、程序调试,最后通过理解综合范例,把握编程技巧,达到学以致用的目的。•shell是一个工具程序,在用户登录后由系统启动,解释并运行由命令行或脚本文件输入的命令,实现用户与内核间的交互。•Shell提供的变量、赋值语句、控制流等基本操作语句与高级语言中的函数调用极为相似,除了关键字与语法规则不同外,还有两点不同。一是参数可以为任意字符串,多数情况下字符串不用引号;二是参数表不用括号,各参数之间也不用逗号分隔。2019/9/53•Linux系统提供了多种不同的shell。常用的有Bourneshell(简称sh)、C-shelll(简称csh)、Kornshell(简称ksh)和BourneAgainshell(简称bash)。它们的渊源和区别,请读者自己到网上遨游一下,便略知一二。•目前linux系统的缺省shell分别是BourneAgainshell,即bash。•要知道所用的linux有哪些版本的shell,可以查看/etc/shell目录下的文件。查看命令行如下:•$cat/etc/shells•还可以用下面的命令来查看当前的shell类型:•#echo$SHELL•其中的“$SHELL”是环境变量,记录使用的shell型。可以用$exit命令退出当前shell。2019/9/544.2shell程序设计基础shell擅长系统管理,shell脚本实质是命令批处理。复杂脚本一般包括判断、循环、文件测试等程序结构。这时应对linux工具集有一些理解。工具grep、sed和awk等,在处理命令输出和文件时功能很强大。建立shell脚本的步骤同建立文本文件相同。用vi等进行程序录入和编辑,也可以用cat和管道等命令直接建立一个脚本文件。【例】4.1建立一个shell脚本,在提示符后输入显示和重定向命令:$catmyprogram回车后直接输入命令,再回车并输入命令,如下所示:#!/bin/sh#filename:myprogramx=”helloworld.”echo$xy=”myfirstshellprogram.”echo$yexit完成编辑按住Ctrl+Z退出,则myprogram的shell脚本程序就完成了,返回shell命令状态。2019/9/552019/9/56•同其他语言一样,也可以通过使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写shell程序。程序最好以“#!/bin/sh”为开始的第一行。符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中使用/bin/sh来执行程序。当脚本编好后,要执行该脚本还要改变其文件为可执行文件属性。但在cygwin的linux模拟环境中可以直接执行而无需改变其文件属性。•改变脚本文件成为可执行文件属性的命令行的写法是:•$chmod+xmyprogram或$chmod755myprogram•最后,执行该程序的命令行写法是:•$./myprogram或$bashmyprogram•回车就可以看到程序的执行结果:•helloworld.•myfirstshellprogram.2019/9/57•在shell编程时,以#开头的句子表示这一行为注释。•Shell对用户输入的命令即文件名进行分析。如果文件标记为可执行,但不是编译过的程序,shell把它看作shell脚本,并解释执行。•用户开发的shell脚本可以驻留在命令搜索路径的目录之下如/bin、/usr/bin等,像普通命令一样使用。通过这样方式可以扩充新命令。•shell脚本经常被用来执行重复性的工作。当进入系统时要查看有无信件、现有用户群、将工作目录改为指定目录、显示当前日期等。完成这些工作的命令是固定的,可把它们写入一个shell脚本中,每次批处理完成。•有些固定工作的命令很复杂,如文件系统安装mount带多个选项和参数,此时用shell脚本存放该命令,就能提高效率。•shell的基本功能有运行程序、输入输出重定向、变量和文件名的替换、管道、编程与环境的控制等。•RedHatLinux带有不少快捷方式。'~'就是home目录的简写形式。如想把一个名为‘sometext’的文件复制到home目录下的‘docs’子目录中,可以用#cpsometext~/docs实现。另外,$cd回车可随时回到home目录。2019/9/58(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'下的文件里。当系统与用户设置发生冲突时,用户设置有效。2019/9/59(2)提示符每打开一个控制台console或xterm时,先看到提示符。默认提示符将显示用户名、主机名(默认localhost)、当前目录(‘~’表示home目录),最后一个字符是普通用户($)或是‘root’(#)的标记。用户通过$PS1设置提示符。命令:echo$PS1将显示当前的设定。默认设定提示符显示的只是当前目录的最后部分。可以用pwd(输出当前目录,printworkingdirectory)查看细节。怎样让shell自动告诉用户的当前目录呢?提示符等信息一般包含在文件'/etc/bashrc'中,用户可以通过编辑各自home目录下的'.bash_profile'和'.bashrc'来改变设置。在manbash中的'PROMPTING'部分,对这些参数有详细说明。用户可以自行设置内容如时间、命令历史记录号或不同颜色等。在'~/.bashrc'中,用户比较清晰的设定是:PS1=\[\033[1m\][\w]\[\033[0m\]'root'在'~/.bashrc'中的设定是:PS1=\[\033[0;31m\][\w]\[\033[0m\]这时用户得到的提示符是:[/usr/bin]当用'root'时,变成:[/usr/bin]用户已去掉了主机名和用户名。普通用户提示符可以是黑底白字或白底黑字。2019/9/510(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否则命令行$echoPATH的执行结果就是:$PATH。2019/9/511处理$PATH变量时,用户不能只替换变量,而要将新字符串添加到原来的值中。用户不能用'PATH=/some/directory',这将删除$PATH中的其它所有目录。用户在该终端运行程序时,必须给出完整路径。所以只能添加:PATH=$PATH:/some/directory当用户打开新终端运行echo$PATH时,返回的是旧$PATH值,看不到添加的新目录。因为用户定义的是局部环境变量。要定义全局变量,用户需要将局部变量输出(export),用export命令:exportPATH=$PATH:/some/directory现在打开新终端,输入echo$PATH,将能看到新设置的$PATH。为了永久保存添加的路径,要将'export'行添加到用户'.bash_profile'文件。不要在'.bashrc'中设置PATH,以免PATH目录意外增长。因为用户每打开一个终端,目录都会被添加,从而导致PATH变量目录的多次复制。(4)历时记忆功能bash命令的历史功能是把以往输入的命令记录下来,方便日后查询与再次使用。只要按向上键就能调出历史命令。与SHIFT键连用,可遍历该控制台中的历史输出。历史命令的编辑修改通过光标和Home、End等键完成。用户可以为环境变量HISTFILE赋新值改变存放历史命令的文件,如:$HISTFILE=/home/mengqc/.myhistory2019/9/5124.3shell基本命令•Linux中的shell命令很多,第三章已进行了解析,这里把与编程有关的命令罗列出来,便于读者掌握。这些命令分为内部命令和外部命令两类。•4.3.1内部命令•shell内部命令是shell本身具备的基本命令,执行速度比外部命令快,存放在内存中,在当前shell中立即被执行,不必创建新进程。编写shell程序时尽量使用内部命令,以提高程序的执行效率。•不同shell的内部命令大同小异,差别在于命令名或语法,用户只要熟悉一种shell就可以了。表4.2以bash为例列出常用的内部命令。2019/9/5132019/9/5144.3.2外部命令•shell除去内部命令以外的命令被称为外部命令或程序。常用的有mv、ls、cp等。用户在执行外部命令时,shell首先查询路径找到该命令,然后生成子shell,由它解释执行这条命令。在命令执行过程中,原shell(父shell)等待子shell的执行而进入睡眠态,一旦子shell执行完毕,子shell将唤醒原shell,而子shell的生命周期到此结束。•4.3.3命令分组•在shell中有两种命令分组的方法:“()”和“{}”。当shell执行()中的命令时将再创建一个新的子进程,然后这个子进程执行圆括弧中的命令。当用户在执行某个命令时,若不想让命令运行对状态集合的改变,影响后面语句的执行时,就该把这些命令放在括弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受干扰。{}用于将顺序执行的命令输出结果用于另一个命令的输入(管道方式)。当用户使用圆括弧和花括弧时,需要在其前面加上转义符(、)以便shell知道他们不是用于命令执行的终止之用。2019/9/5154.3.4函数•bash函数的实质是命令集合或批处理文件。在shell中定义的函数都是由若干条shell命令组成的命令集合体,与shell程序形式相似,可看作一条复合命令。不同之处在于它是多进程。函数定义的基本格式为:•[function]函数名()•{•若干命令行•}•其中关
本文标题:Linux程序设计__技术技巧与项目实践---Shell基础与编
链接地址:https://www.777doc.com/doc-754452 .html