第一天下午SHELL新_第1页
第一天下午SHELL新_第2页
第一天下午SHELL新_第3页
第一天下午SHELL新_第4页
第一天下午SHELL新_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章SHELL主要内容Shell的作用Shell程序的编辑和运行基于Bash的Shell程序设计变量声明表达式条件判断控制结构参数访问Shell的作用shell是用户和系统内核之间的接口程序shell是命令解释器在本章中,shell指linux的终端

即解释用户命令和shell程序的文字终端硬件shell操作系统图形界面其它用户界面用户3linux下的shell用户使用shell的设定通过查看/etc/passwd文件可以查看用户使用的shell类型例子:/etc/passwd部分节选

webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

xfs:x:43:43:XFontServer:/etc/X11/fs:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

gdm:x:42:42::/var/gdm:/sbin/nologin

htt:x:100:101:IIIMFHtt:/usr/lib/im:/sbin/nologin

tom:x:500:500:tom:/home/tom:/bin/bash#可见,tom用户使用的shell为bash4linux下的shelllinux下的shell通过cat/ect/shells命令查看安装的shellshell及路径查看shell的命令5shell程序Shell程序的特点及用途:shell程序可以认为是将shell命令按照控制结构组织到一个文本文件中,批量的交给shell去执行不同的shell解释器使用不同的shell命令语法shell程序解释执行,不生成可以执行的二进制文件可以帮助用户完成特定的任务,提高使用、维护系统的效率了解shell程序可以更好的配置和使用linux

6登陆后进入用户指定的shell(1)修改/etc/passwd文件(2)使用chsh修改登陆后的shell临时改变正在使用的shell基于bash的shell程序greeting.sh

echo"ProgrammeEnds."12say_hello11echo"ProgrammeStartsHere....."10}9echo"Hello$name"8readname7echo"EnterYourName,Please.:"6{5functionsay_hello()4#aFunction3#aSimpleshellScriptExample2#!/bin/bash1解释输出提示,提示程序结束调用函数程序开始的第一条命令,输出提示信息函数结束输出读入用户的输入到变量nameecho命令输出字符串函数开始以functin

开始,定义函数同上以#开始,其后为程序注释以#!开始,其后为使用的shell8基于bash的shell程序程序编译和运行过程一般步骤:编辑文件保存文件将文件赋予可以执行的权限运行及排错常用到的命令:vi,编辑、保存文件ls-l查看文件权限chmod

改变程序执行权限直接键入文件名运行文件shell程序的编辑和执行查看权限查看权限,初始状态无执行(x)权限增加可执行(x)的权限查看权限,已经具备执行(x)权限运行程序程序运行过程输出shell程序设计一般结构shell类型函数主过程#!/bin/bashfunctionfun1(){}......funciton

funn(){}.................函数定义shell类型主过程变量的声明和使用变量的声明和使用变量是弱类型的声明变量不用声明类型可以存储不同类型的内容使用灵活使用时要明确变量的类型大小写区分变量声明及赋值格式格式:

变量=值 (注意:等号两侧不能有空格)例如:

a=”hello”

b=9变量的声明和使用变量的引用格式:

$变量名,或者${变量名}

变量名为一个字符用方式一,变量名多于一个字符建议用第2种方式例子:

a=1

abc="hello"

echo$a

echo${abc}常用的运算符整数的算术运算符+、-、*、/、%;赋值运算符+=、-=、*=、/=、%=位运算符<<、>>、&、|、~、^;位运算赋值运算符<<=、>>=、&=、|=、~=、^=;逻辑运算符:&&,||,!,>,>=,<,<=,!=,==简单数学表达式expr命令计算一个表达式的值格式:expr

argExpr3+2例子:计算(2+3)×4的值

1、分步计算,即先计算2+3,再对其和乘4

s=`expr2+3`

expr$s\*4

2、一步完成计算:

expr`expr2+3`\*4

说明:运算符号和参数之间要有空格分开;通配符号(*),在作为乘法运算符时要用\、“”、‘’符号修饰`是ESC键下面的符号,不是单引号简单数学表达式let命令格式:letarg1[arg2......]例子:计算(2+3)×4的值

lets=(2+3)*4说明:与expr命令相比,let命令更简洁直观当运算符中有<、>、&、|等符号时,同样需要用引号(单引号、双引号)或者斜杠来修饰运算符命令文件Shell程序可以直接从终端上键入,如:$who|wc-l也可以先把程序键入一个文件,然后由shell执行该文件应用示例:建立文件nu,通过执行该文件完成以上命令的功能要以这种方式执行程序,需要有执行权限,可以利用chmod命令完成:chmod+xnu执行:./nu变量与所有的编程语言一样,shell也允许把值存在变量中,shell变量名以字母或下划线字符开始,由字母、数字或下划线组成要把值存入变量,只要写出变量名,或紧跟一个=,再加变量值即可例如:variable=valuecount=1可以利用echo命令查看变量值例如:echo$variableechocount环境变量环境变量是一种特殊的变量,其特点为:它们可以由其他程序传递给脚本在脚本中被调用的任何程序都将继承环境变量可以像定义一个变量一样来设置环境变量,在标记它为环境变量时需要使用“export”命令应用示例:$exportMYENV=1 $echo$MYENV使用“set”命令可以获取当前上下文中全部的变量

特殊变量bash中存在着一些拥有特殊用途的变量,我们称这种变量为特殊变量。其中一些变量可以让用户初始化,并让bash按照特殊的方式运行;还有一些变量虽然对bash没有什么特殊的含义,但是对系统程序很重要。例如:PATH变量是Linux系统中执行命令时所搜索的路径,它是由系统初始化的。一般它的值为:/bin:/sbin:/usr/bin:/usr/sbin。最常用的是位置变量,用来存储bash脚本程序名后面的参数。Linux系统中的启动脚本和关闭脚本使用了大量的参数。其中第一个参数保存在变量1中,可利用$1引用,第二个参数存储在变量2中,可利用$2引用,以此类推。

bash中的引号在bash编程中,引号的使用十分灵活。不同种类的引号具有不同的含义。bash把单引号、双引号和反斜杠(\)都用作转意字符。在这3种符号中,单引号的功能最强。用单引号将一个字符串括起来可以屏蔽其中所有的特殊字符。例如:如希望把$1中的$当作货币符号赋给变量tax,应采用如下形式的语句:$

tax=‘$1’bash中的引号(二)Linux双引号的作用与单引号差不多,区别在于双引号没有那么严格,单引号忽略所有特殊字符,双引号只忽略大多数,不忽略以下三种符号:美元符号反引号反斜杠(\)反斜杠一次只能让单个字符转义,不能操作整个字符串。它的屏蔽能力与单引号相当。下面的例子中:$string=all\right反斜杠可以让bash忽略all后的空格,这样string接收到的将是一个单词allright。命令替换命令替换是指shell将一个命令的标准输出插在一个命令行中任何位置的功能,有两种命令替换方法:反引号`command`$(command)结构应用示例:$echothedateandtimeis:`date`$echoYouareworkingin`pwd`

参数传递通过参数传递shell程序可以从命令行接收参数,用途更加强大。下面介绍三种与参数传递有关的变量位置参数($1、$2…)Shell程序执行时自动把第一个参数放在一个特殊的变量1中,以此类推,2,3…等参数放在变量2、3…中应用示例:编辑ison文件内容如下:who|grep$1执行:$chmod+xison

$./ison

bcshell将用bc代替$1,命令行变为:who|grep

bc

参数传递(二)$#变量用于存放命令行中所键入的参数个数shell程序测试这个变量确定用户输入的参数个数是否正确应用示例:编辑args文件内容如下:echo$#

argumentspassedechoarg1=:$1:arg2=:$2:arg3=:$3:

执行:$argsabc$argsab$args

从这个例子可以看到shell程序将命令行的参数个数传递给了$#变量参数传递(三)$*变量可以引用传递给程序的所有参数经常应用在参数不确定或者参数数目可变的程序中应用示例:编辑args2文件内容如下:echo$#argumentspassedechotheyare$*

执行:$chmod+xargs2 $arg2abc $arg2ab$arg2

shift命令shift命令的作用是把位置参数左移原来在$2中的内容赋给$1,$3中内容赋给$2,依此类推。原来$1中的值就丢失了。$#(参数变量的个数)也自动减1

shift命令(二)编辑shiftdemo程序如下:echo$#$*

shiftecho$#$*shiftecho$#$*

shiftecho$#$*

执行:chmod+xshiftdemo ./shiftabc退出状态与$?变量 每当程序执行完成后都会给系统返回一个退出状态。该状态是个数值,通常指示该命令运行是否成功。退出状态为0表示运行成功,非零表示运行失败。Shell自动将最后所执行命令的退出状态设置到shell变量$?中,可以用echo命令在终端上显示它的值应用示例:$who|grep

bc

$echo$? $who|grep123$echo$?

判断条件判断语句是几乎所有编程语言中都有的语句,shell中有两种条件判断语句:if表达式case表达式

if表达式一般结构

ifconmmand1thenelifcommand2thenelseFi

这个if…then…else表达式中的else和elif是可选部分。其中elif是elseif得缩写,在if…then…else表达式中这样的elseif语句可以有多个。其中fi表示if…then…else表达式的结束。Bash支持此类表达式的多层嵌套。 其中command1需要执行并检测其退出状态,如果退出状态为0,则执行其后then与elif之间的语句,同理执行并检测command2的退出状态,并根据退出状态是否为0选择执行elif与else之间或else与fi之间的语句test命令shell有一条内部命令test,经常用来在if命令中测试一种或几种条件,其一般格式为:testexpression其中expression表示要测试的条件。test计算expression,若结果为真,其返回的退出状态为0,若结果为假,返回的退出状态就不为零应用示例:$name=bc $test“$name”=bc

$echo$?※注意:test把所有操作数($name和bc)和操作符作为单独的参数分别对待,也就是说它们之间至少要有一个空白字符分隔

test命令(二)test命令的另一种格式shell程序使用test命令非常频繁,因此产生了另一种公认的命令格式:[expression]“[”实际上就是命令的名字,同时要求在表达式的有一个配对的“]”,在“[“之后和”]”之前都要有空格应用示例:$name=bc $[“$name”=bc]

$echo$?

test命令(三)整数操作符test命令还有一类进行整数比较的操作符,见右表:例如:操作符“-eq”检测两个整数是否相等,如果有一个变量名为count,想看看它的值是否为0,则可以写成:[“$count”–eq0]操作符返回真(退出状态为0)的条件int1–eqint2int1等于int2int1–geint2

int1大于或等于int2int1–gtint2int1大于int2int1–leint2

int1小于或等于int2int1–ltint2int1小于int2int1–neint2int1不等于int2test命令(四)文件操作符test提供了一类问询文件状态的一元操作符,见右表:例如:[-f/etc/fstab]检测fstab文件是否存在且是否为普通文件

if结构应用示例使用if…then…else结构编写一个判断命令行所传入参数大小的程序将所输入数值存放在位置参数$1中若$1>100,则输出:thenumberisgreaterthan100若$1<10,则输出:thenumberissmallerthan10否则输出:thenumberisbetween10and100

if表达式应用示例(二)编辑ifdemo程序如下if["$1"-gt100]thenecho"thenumberisgreaterthan100."elif["$1"-lt10]thenecho"thenumberissmallerthan10."elseecho"thenumberisbetween10and100."fi执行$chmod+xifdemo$./ifdemo100…输入数据测试程序功能

case表达式case表达式类似于C语言中的case语句和switch语句,即从几种情况中选择一种执行。一般结构casestringinstring1)…;;string2)…;;*)…;;

esaccase表达式(二)关键字是case、in、双分号和esac。字符串string首先与string1和string2比较,如果匹配就执行它们下面的语句直到双分号。如果字符串string与列出的字符串都不匹配,则执行*)下面的语句

case表达式(三)应用示例:编写一个实现中英文数字转换的程序,编辑casedemo程序如下:if["$#"-ne1]thenecho"usage:./casedemonumber"exit1ficase"$1"in0)echozero;;1)echoone;;2)echotwo;;………………8)echoeight;;9)echonine;;esac

调试程序用的-x选项可以通过键入sh–x后跟程序名及其参数跟踪程序的执行,在这种模式下执行每条命令时都在终端上将命令显示出来,前面加个加号执行:$sh–xcasedemo1将会在终端上看到:+'['1-ne1']‘+case"$1"in+echooneone

循环shell中提供了可供灵活处理循环的语句,这些循环可以重复执行一组命令,既可以是事先指定的次数,也可以是直到某种条件满足为止。shell中有三个内部循环命令:forwhile{…}until

for命令for命令用来将一组命令循环执行预先确定的次数基本格式:forvarinword1word2…wordndo command

done应用示例:

$foriin123>do>echo$i>done可以看到终端上依次输出1、2、3

不带列表的for命令for命令也可以写成以下形式:forvardo commanddoneshell也能认出这种少了in的特殊格式,shell会自动将命令行键入的所有参数依次组织成列表。应用示例:

编辑fordemo文件内容如下: echoNumberofargumentspassedis$# forargdoecho$argdone执行:$chmod+xfordemo

$./fordemoabc

while命令第二种循环命令是while,格式为:whilecommand1do commanddone先执行command1,并检测其退出状态,如果为0则执行do与done之间命令,再次检测直到command1退出状态不为0如果第一次执行command1时退出状态就不为0,那么do和done之间的命令可能根本不执行while命令应用示例(一)编辑whiledemo1程序如下: i=1 while[“$i”-le5] do echo$i i=$((i+1)) done 执行:$chmod+xwhiledemo1

$./whiledemo1将变量i作为计数变量,初值设为1

while命令应用示例(二)while循环通常跟shift命令结合使用,以处理命令行中键入的参数个数可变的情况编写whiledemo2程序如下:

while[“$#”-ne0]do echo“$1” shiftdone执行:$chmod+xwhiledemo2 $./whiledemo2abcshift命令使位置变量向下移($2到$1,$3到$2),并且$#递减。until命令until命令跟while很像,区别在于只要在until后面的命令退出状态不为0,循环就一直执行下去,其格式为: untilcommand1 do command done跟while命令一样,如果第一次执行command1时返回的退出状态为0,do和done之间的命令可能跟本不会执行。

until命令示例程序编辑untildemo程序如下:if["$#"-ne1]thenecho"Usage:untildemouser"exit1fiuntilwho|grep"$1">/dev/nulldosleep10doneecho"$1hasloggedon"执行:$chmod+xuntildemo $./untildemo

bc $./

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论