《10-1shell编程.ppt》由会员分享,可在线阅读,更多相关《10-1shell编程.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux Shell编程编程第一个shell程序用 vi 编辑器编辑一个hello文件,内容如下:#!/bin/bash#This is the first shell programecho Hello World!基于bash的shell程序程序编译和运行过程一般步骤:编辑文件保存文件将文件赋予可以执行的权限运行及排错常用到的命令:vi,编辑、保存文件ls-l 查看文件权限chmod 改变程序执行权限直接键入文件名运行文件2023年1月13日shellshell程序的编辑和执行程序的编辑和执行查看权限查看权限,初始状态无执行(x)权限增加可执行(x)的权限查看权限,已经具备执行(x)权限
2、运行程序程序运行过程输出2023年1月13日shellshell程序设计程序设计一般结构shell类型函数主过程#!/bin/bashfunction fun1().funciton funn().函数定义shell类型主过程执行该程序$bash hello或者$chmod u+x hello$./hello此处没有直接$hello是因为当前目录不是当前用户可执行文件的默认目录,而将当前目录设为默认目录是一个不安全的设置shell接受并执行命令的程序称为 shell。它位于用户和操作系统之间。UNIX shell 和 Linux shell 的功能都非常强大,可以通过组合一些基本的函数来构造非
3、常复杂的操作。通过使用编程结构则可以构建一些函数在 shell 中直接执行,或者将这些函数保存成 shell 脚本 的形式,这样就可以一次次重用这些函数了。有时需要在系统引导之前就执行一些命令,以便能够进行终端连接;有时又需要周期性地执行命令,而不管登录与否。shell 可以完成这些功能。标准输入和输出并不需要来自于(或定向到)终端处的真实用户。shell是一种命令解释程序(命令解释器),shell解释用户输入的命令行,提交系统内核处理,并将结果返回给用户。与Linux命令一样都是实用程序,但两者又有区别。一旦用户注册到系统后,shell就被系统装入内存,并一直运行到用户退出系统之止;而一般命
4、令仅当被调用时,才由系统装入内存执行。shell本身也是一种可编程的程序设计语言。用shell写的程序(shell脚本)相当于dos/windows下的批处理文件,它可以简单到只有一条命令,也可以复杂到包括大量循环、条件语句、数学运算、控制结构,也可以是介于两者之间的程序。shell允许通过编程来完成复杂的功能处理,但作为语言与高级语言相比较具有不同的特点:(1)shell是解释性的,多数高级语言是编译性的;(2)shell语言与高级语言处理的对象不同;(3)shell与系统有密切的关系;(4)shell易编写、调试、灵活性较强,但速度低;(5)shell作为命令级语言,命令组合功能很强。sh
5、ell有两种主要语法类型:Bourne shell和C shell,彼此不兼容。Bourne shell家族:sh ksh bash psh zsh;C shell家族:csh tcsh。其中bash和 zsh在不同程度上支持 csh 的语法。这里,再着重介绍一下bash的特点:(1)自动补全功能假设要输入的命令很长,或者命令后面要给的文件名很长。这个时候只要按一个Tab键,bash就会在可能的命令或文件名里面找寻匹配的命令,找到的话就会自动帮你补齐。(2)命令行编辑程序bash的命令行编辑是在提示符下,可对未执行的命令字符任意地修改。(3)命令历史(command history)所谓的命令
6、历史就是把曾经输入过的命令记录起来,方便日后的查询与使用。只要按向上键就可以调出前一个命令,再按一次向上键就可以调出更前一个命令,依此类推,用向下键可以回到下个命令,所以用上、下键就可以选择以前输入过的命令。Shell两大功能命令解释器:解释执行所有的用户命令程序设计语言:具有高级语言的所有功能shell是用户和系统内核之间的接口程序 shell是命令解释器 在本章中,shell指linux的终端即解释用户命令和shell程序的文字终端硬件shell操作系统图形界面其它用户界面用户装入装入UNIX硬件检测硬件检测安装安装rootfs建立建立0号进程号进程产生新进程产生新进程swap对换进程对换
7、进程1号进程号进程init执行执行/etc/inittab初始化各端口初始化各端口gettygetty用户注册用户注册正确吗正确吗建立建立shell进程进程Shell的启动和建立的启动和建立子子父父boot.NYBA命令行形式1.单条命令:$cat file1 最常用命令形式2.多条命令:$pwd;who;date 提高键盘命令输入效率3.复合命令:$ps e|grep student2$(ls;cat file3;pwd)run_log 方便灵活,运行效率高4.后台命令:$ls lR file_list&多进程并发,充分利用系统资源linux下的shell用户使用shell的设定通过查看/e
8、tc/passwd文件可以查看用户使用的shell类型例子:/etc/passwd部分节选webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologinxfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologinntp:x:38:38:/etc/ntp:/sbin/nologingdm:x:42:42:/var/gdm:/sbin/nologinhtt:x:100:101:IIIMF Htt:/usr/lib/im:/sbin/nologintom:x:500:500:tom:/home/tom:/bi
9、n/bashtom:x:500:500:tom:/home/tom:/bin/bash#可见,tom用户使用的shell为bashlinux下的shelllinux下的shell通过cat/ect/shells命令查看安装的shellshell及路径查看shell的命令Shell程序的特点及用途shell程序可以认为是将shell命令按照控制结构组织到一个文本文件中,批量的交给shell去执行 不同的shell解释器使用不同的shell命令语法shell程序解释执行,不生成可以执行的二进制文件可以帮助用户完成特定的任务,提高使用、维护系统的效率 了解shell程序可以更好的配置和使用linux
10、 基于基于bashbash的的shellshell程序程序简单程序示例greeting.sh echo Programme Ends.12say_hello11echo Programme Starts Here.109echo Hello$name8read name7echo Enter Your Name,Please.:65function say_hello()4#a Function3#a Simple shell Script Example2#!/bin/bash1解释输出提示,提示程序结束调用函数程序开始的第一条命令,输出提示信息函数结束输出读入用户的输入到变量nameech
11、o命令输出字符串函数开始以 functin 开始,定义函数同上以#开始,其后为程序注释以#!开始,其后为使用的shellbashbash 是一个为GNU项目编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell。Bourne shell是一个早期的重要shell,由Stephen Bourne在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由Brian Fox创造。在1990年,Chet Ramey成为了主要的维护者。bash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格
12、的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。bash的命令语法很多来自Korn shell(ksh)和 C shell(csh),例如命令行编辑,命令历史,目录栈,$RANDOM 和$PPID 变量,以及POSIX的命令置换语法:$(.)。作为一个交互式的shell,按下TAB键即可自动补全已部分
13、输入的程序名,文件名,变量名等等。程序的运行当用户输入一行命令后,shell负责解释、分析输入的内容,并且决定做什么,同时替系统内核删除命令行中不必要的信息。命令是一个可执行的Linux命令、程序、工具或shell脚本。例1:ls-l file1 file2 file3例2:echo Welcome to Tsinghua University.例3:echo Welcome to Tsinghua University.注意:例2和例3的结果是完全一样的。使用保留字和元字符shell有一些具有特殊意义的字(保留字),如在shell脚本中,像do、done、for、while等保留字控制循环操
14、作,if、then、else等保留字进行条件控制。保留字随shell的不同而不同。在Linux系统里,有一组特殊意义字符,这就是所谓的元字符(通配符)。现在列出一些常用的通配符的意义,供参考。.上一层目录,与cd命令配合用得比较多.目前工作的目录*任意长度的字符?长度为一个的任意字符.括号内的一个字符m 等于某个通配符,如*、?等a-z*小写字母开头的所有字符串 转义符号,用以解除特殊字符的特殊意义 用户目录;分隔符,当命令行有多个命令时,做分隔用 BourneShell的提示符,同时也作为shell语言的位置变量参数#做注释用|建立一个管道,使一命令的输出作为另一个命令的输入&将命令以后台方
15、式执行 将命令的输出重导入文件中相反 将命令的输出加在一个已经存在的文件后面.括号内的一个字符串例:ls t*显示当前目录下以t打头的所有文件。常用 bash 环境变量变量名变量名功能功能USER已登录用户的用户名UID已登录用户的数字用户 idHOME用户的主目录PWD当前工作目录SHELLshell 名$进程 id(或正在运行的 Bash shell 进程或其他进程的 PID)PPID启动这个进程的进程的进程 id(即父进程的 id)?上一个命令的退出码echo 命令的使用命令的使用echo命令的基本功能就是在标准输出上显示命令的基本功能就是在标准输出上显示后面的字符串,或变量的值。当字符
16、串中带空白符后面的字符串,或变量的值。当字符串中带空白符或其它控制字符时,用引号将其括起来。例如:或其它控制字符时,用引号将其括起来。例如:$echo 1234512345$echo “department computer”department computer$echo“My home directory is:$HOME”My home directory is:/usr/teacher/david$echo“Input your choice(y/n)”Input your choice(y/n)shell变量变量环境变量环境变量 常用的常用的shell环境变量及实例环境变量及实例:H
17、OME=/usr/computer/student6 用户主目录用户主目录,注册时的初始目录注册时的初始目录PATH=/bin:/usr/bin:$HOME/bin:./键盘命令的搜索路径键盘命令的搜索路径TERM=linux 当前所用的终端类型当前所用的终端类型PS1=$shell的主提示符的主提示符IFS=域分隔符域分隔符,通常为空白符通常为空白符,用来分隔命令行用来分隔命令行各个域各个域PATH环境变量PATH的构成决定了寻找shell命令和其他程序的途径,是影响shell程序效率的主要因素之一。PATH变量设置要考虑以下几点:在PATH变量中,命令使用得多的程序目录应放在前面,极少用目
18、录不设在PATH变量中。在shell程序内用得较多的程序目录应加在变量PATH中。并且PATH应尽可能地短,不要出现重复的目录。还要尽量避免查询大目录,如需设置,将其路径放在PATH路径的最后位置。例:PATH=/bin:/usr/bin:/etc:.用户工作环境设置用户工作环境设置由于shell程序在Linux系统中的特殊作用,每一个进入Linux系统的用户都必须选择一种shell作为工作环境。每种shell都提供一种工作模式,而工作模式的确定是由一组工作环境变量来决定的。用户工作环境设置用户工作环境设置1)工作环境变量在shell中可以提供一种维护工作环境变量的服务。这里,所谓的环境变量是
19、说那些当前用户工作中可以修改的变量。在UNIX系统中,随着用户正常地登录进系统时,根据用户注册时登记的相关信息,用户的工作环境变量也随之确定下来,通常会有1030个永久性的变量与用户的登录标识联系在一起。用户工作环境设置用户工作环境设置这些变量是用户在登录时进行赋值的,由shell统一维护,在用户注销时自动撤销。这些变量大部分是用户的基本的永久性变量,在用户工作时是不变的。但也有一部分变量是为了特殊目的而设定的,这些变量对用户有很大的针对性,同时也为用户提供了一定的自由度,因此它们允许用户根据自己的需要自行修改和调整。用户工作环境设置用户工作环境设置一般会有.bash_profile,.bas
20、hrc,.bash_logout等文件,如果是cshell,会有.cshrc这个文件,但是作用基本是相同的,都是设定用户缺省的环境变量。这些文件中的内容用户可以根据需要进行修改,以设成自己需要的内容。2 2)bashbash的环境变量的环境变量 bash是是使使用用最最广广泛泛的的UNIXUNIX系系统统,我我们们可可以以了了解解一一下下bshellbshell的环境变量的设置。的环境变量的设置。在用户目录下有在用户目录下有.bash_profile,.bash_profile,.bashrcbashrc,.bash_logout.bash_logout三三个个和和环环境境变变量量相相关关的的
21、文文件件,其其中中.bash_profile.bash_profile就就相相当当于于dosdos下下面面的的autoexec.bat,autoexec.bat,一个典型的一个典型的.bash_profile.bash_profile的内容:的内容:用户工作环境设置用户工作环境设置用户工作环境设置用户工作环境设置#.bash_profile#.bash_profile#Get the aliases and functions#Get the aliases and functionsif -f/.if -f/.bshrcbshrc then then././.bshrcbshrcfifi#U
22、ser specific environment and startup programs#User specific environment and startup programsPATH=$PATH:$HOME/binPATH=$PATH:$HOME/binexport PATHexport PATH用户工作环境设置用户工作环境设置它在执行的时候会调用它在执行的时候会调用.bashrcbashrc,内容如下:内容如下:#.#.bashrcbashrc#User specific aliases and functions#User specific aliases and functio
23、ns#Source global definitions#Source global definitionsif -f/etc/if -f/etc/bashrcbashrc;then;then./etc/./etc/bashrcbashrcfifi用户工作环境设置用户工作环境设置这这个个shellshell会会继继续续调调用用/etc/etc/bashrcbashrc这这个个文文件件,在在这这个个shellshell中中将将设设置置环环境境变量。正常登录后,一个变量。正常登录后,一个shellshell的环境大致如下所示:的环境大致如下所示:INPUTRC=/etc/INPUTRC=/etc/
24、inputrcinputrc USER=USER=sgfsgf MAIL=/MAIL=/var/spool/mail/sgfvar/spool/mail/sgf HOSTNAME=HOSTNAME=localhostlocalhost OLDPWD=/home/OLDPWD=/home/sgfsgf HOME=/home/HOME=/home/sgfsgf SUPPORTED=zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:enSUPPORTED=zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:enG_BROKEN_FILEN
25、AMES=1G_BROKEN_FILENAMES=1PS1=$PS1=$PS2=PS2=用户工作环境设置用户工作环境设置LOGNAME=LOGNAME=sgfsgf _=_=bash_historybash_history COLORS=/etc/DIR_COLORSCOLORS=/etc/DIR_COLORSTERM=TERM=linuxlinux PPID=3296PPID=3296PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/binPATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/binLANG=en_U
26、S.UTF-8LANG=en_US.UTF-8HISTSIZE=1000HISTSIZE=1000SHELL=/bin/bashSHELL=/bin/bashPWD=/home/PWD=/home/sgfsgf其他的其他的shellshell如如CshellCshell,KshellKshell均是大同小异均是大同小异 注:可用注:可用set命令查看登录后的命令查看登录后的shell环境变量及内容环境变量及内容用set命令查看set或者$set variable.txt$more variable.txt设置变量在 Bash shell 中,可以通过在一个名字后面紧跟上一个等号(=)来创建或设
27、置 shell 变量。变量名(或标识符)是由字符、数字和下划线构成的单词,它只能由字符或下划线开头。变量是大小写敏感的,例如 var1 和 VAR1 是不同的两个变量。通常,$和$?是 shell 参数,而不是变量。它们只能被引用;无法对它们进行赋值。变量的声明和使用变量的声明和使用变量是弱类型的声明变量不用声明类型可以存储不同类型的内容使用灵活使用时要明确变量的类型大小写区分变量声明及赋值格式格式:变量值(注意:等号两侧不能有空格)例如:a=”hello”b=9变量的声明和使用变量的引用格式:$变量名,或者$变量名变量名为一个字符用方式一,变量名多于一个字符建议用第2中方式例子:a=1abc
28、=helloecho$aecho$abc系统变量常用系统变量:$0 当前shell程序的名字$1$9 命令行上的第一到第九个参数$#命令行上的参数个数$*命令行上的所有参数$分别用双引号引用命令行上的所有参数$当前进程的进程标识号(PID)$?上一条命令的退出状态$!最后一个后台进程的进程标识号系统变量只能引用不能修改!局部变量(用户变量)局部变量是由用户根据需要任意创建的.变量名通常由一个字母后跟零个到多个字母、数字或下划线组成。引用变量的值时,在变量名前面加上$符号.例如:$AA=123$echo$AA123 (变量AA的值)$B=“this is a string”(字符串中有空格时用引
29、号)$echo$Bthis is a string (变量B的值)单引号、双引号、反撇号和花括号$a=“he is a student”$echo“She said:$a”She said:he is a student$b=The value of a is$a$echo$bThe value of a is$a shell规定单引号禁止变量替换,元字符$和*等保持其符号本身;而双引号允许元字符变量替换.$c=“The value of a is$a”$echo$cThe value of a is he is a student$a=date$echo$adate (变量a的值是字符串da
30、te)$b=date$echo$bSat Feb 1 16:28:19 Beijing 2003 (变量变量b b的值是反撇号中命令的执行结果的值是反撇号中命令的执行结果)$c=There is a teach$echo“$cer reading room”reading room (无变量cer,用空串替代)$echo“$cer reading room”There is a teacher reading room (花括号将变量名和后面的字符串区分开)变量输出命令 exportshell变量定义后或修改值后,如果未经export命令输出,则只在当前的shell中起作用,对其各个子shel
31、l不产生任何影响.经过 export 命令输出的变量对当前shell的各个子shell、以及子shell的子shell起作用。例如:$PATH=$PATH:./;export PATH说明:1.export后面的变量名前不加$符号2.经export输出给子shell的变量如果在子shell中被修改,则只影响子shell,不影响父shell;如果在子shell中被输出,则只影响子shell的子shell3.export命令常用在.profile文件中 变量的替换变量的替换shell允许对变量赋值。shell一旦在命令行中发现变量名时,将在变量名的位置上用以前赋给该变量的值替代变量名。例:myho
32、me=/usr/app1echo myhome/usr/app1ls-x myhomefile1 file2 file3 file4文件名的替换文件名的替换shell在命令行中将文件名进行替换。事实上,shell在确定要执行的程序名和它的自变量之前,要对命令行扫描,找出元字符进行相应的文件名的替换。例:ls-xfile1 file2 file3 file4echo*file1 file2 file3 file4输入输出重定向(改向)shell处理命令行的输入输出重定向,它扫描命令行中特殊改向字符“”、“”,将输入或输出重定向到指定的文件中。例:$echo“Please call me:1234
33、5678”msg$cat msgPlease call me:12345678注意:就程序或命令本身而言,它并不知道其标准输出已被改向,只是简单地按照自身的方式向标准输出输送信息。命令文件:输出重定向。表示把命令的输出输出到文件里,以取代标准输出。命令文件:输出重定向。(用“”进行输出重定向会把原来的文件覆盖掉,而“”是把输出添加到原文件的末尾。)命令A|命令B:“|”是管道符号,表示把命令A运行的结果,也就是命令A的标准输出作为命令B的标准输入。管道在shell中有两种结构类型:管道线和命令表。当shell检测到一个管道操作符时,就建立一个系统管道文件,这是一个先进先出的数据结构,它允许在同
34、一时刻对管道线上的命令或程序进行读和写,即允许两个无关的命令通过管道连接交换信息。管道的概念管道:是一个命令的标准输出与另一个命令的标准输入之间的连接,不经过任何中间文件;管道线:是由管道操作符分隔的一个命令序列,最简单的管道线是一个简单命令;管道操作符:用符号“|”表示。例:w|wc-lps-aux|grep ftp命令表的概念命令表:一串管道线构成了一个命令表,最简单的命令表是一个管道线,一个命令表送回的值是该命令表中最后一个管道线的出口状态。管道线分隔符:分隔命令表元素,确定管道线执行的条件。各分隔符含义如下:;表示按顺序执行管道线;&表示根据条件(true),执行其后面的管道线;表示根
35、据条件(false),执行其后面的管道线;&表示前面的管道线在后台(异步)执行。例1:四个管道线构成一个命令表ls -l /tmp /rootw|wc-lps例2:与例1等价ls-l/tmp /root;w|wc-l;psw 和 wc 命令w 命令打印系统中当前活动的摘要。该摘要包含以下内容:用户 登录的用户。tty 用户使用的 tty 名称。注册 用户登录的日期和时间 wc命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。Shell的内部命令:空命令,不作任何事情,退出状态为真(0)cd 改变当前工作目录pwd 显示当前工作目录read 读标准输入,赋给后面的变量time 显示当前shell运行命令所花费的时间说明:shell 的内部命令包含在shell命令内部,不是一条单独的操作系统命令,因此无法在文件系统中查找到.read示例echo Please input a number:c read num echo“the number you input is$num”
限制150内