Linux编程(第二版)全套教学课件_第1页
Linux编程(第二版)全套教学课件_第2页
Linux编程(第二版)全套教学课件_第3页
Linux编程(第二版)全套教学课件_第4页
Linux编程(第二版)全套教学课件_第5页
已阅读5页,还剩684页未读 继续免费阅读

下载本文档

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

文档简介

第一讲Linux操作系统目录结构与文件操作

(《Linux编程》第1章)本讲教学目标:掌握Linux系统目录结构掌握文件操作命令使用第1章Linux简介与使用第2章LinuxShell编程第3章Linux环境C编程第4章(1)系统级IO第4章(2)文件系统第4章(3)磁盘空间管理第5讲进程控制第6讲线程管理与同步互斥第7章进程间通信第8章网络编程第9章并发网络服务器全套可编辑PPT课件163本章主要内容Linux/Unix系统简介Linux目录结构Linux系统用户界面、命令格式(自学)Linux文件与命令操作(自学)一、UNIX/Linux系统简介(1)UNIX系统简介1.什么是UNIX系统是一种多用户、多任务、多层次的操作系统,广泛用于金融、教育、科研、军事领域,用于运行核心业务,管理企业关键数据资料、信息与Windows系列系统相比,具有安全性高、可靠性强、性能高优点,可以一年365天、7×24小时不停机运行UNIX系统凝聚了一大批天才计算机科学家和程序员的智慧,结构清晰、功能强大、技术先进,是大学师生研究、学习操作系统原理、计算机系统工作原理首选的实例系统2.UNIX系统诞生1969年,由BellLabs(贝尔实验室)KenThompson和DennisRitchie处于兴趣开发而成,1971年完成版本11973年,DennisRitchie创造了C语言,与KenThompson一起用C语重写了Unix的第三版内核,使维护和移植变得便利同时授权给科研机构与企业进一步发展,逐渐形成两个版本线:加州大学Berkeley分校,1978年发展了研究版本BSDUNIXAT&T,1983年开发商业版本SystemV版本4(SVR4),在此基础上早就了IBMAIX和HPUX两个发现版本3.UNIX主要版本AIX:是IBM基于SVR4开发的一套UNIX操作系统,性能高、安全、可靠性高,广泛用于金融领域。Solaris:SunMicrosystems1982年推出基于BSDUnix的SunOS,以后在接口上向SVR4靠拢,新版本称为Solaris,性能高、处理能力强,在高校、科研院所用得多HP-UX:是惠普公司以SVR4为基础所研发成的类UNIX操作系统。IRIX:是SGI公司以SVR4与BSD延伸程序为基础所发展成的UNIX操作系统,具有很强的图形处理功能,在游戏设计中广泛使用的三维图形库编程openGL从此而来。4.UNIX系统存在的问题Unix的不同版本间不兼容,给应用开发带来极大负担搭建Unix系统的费用非常昂贵。主机、UNIX系统、开发工具、应用软件需分别购买Unix系统源码不开放,购买要钱,给学习、研究带来不便(2)Linux系统概述1.什么是Linux?Linux是一种类UNIX操作系统,继承了Unix系统强大的功能和性能,采用与Unix系统兼容的操作命令,学会操作Linux一般就会操作UNIX系统,学会在Linux下开发应用,就会在UNIX下开发应用Linux系统运行于廉价的PC和大多数计算机系统硬件,开放源码,各种开发软件丰富齐全、免费下载使用,如gcc、java、apache、hadoop、MLLIBLinux是广大学生学习操作系统原理、计算机系统原理的优秀实例系统Linux系统由芬兰学生林纳斯1991年开发第1版,经过20多年发展,已经成为一种成熟、优秀的操作系统,已成为今天世界上使用最多的一种UNIX类操作系统:Linux可安装在各种计算机硬件设备中,比如个人计算机、大型机、超级计算机、Android手机、平板电脑、路由器,世界上运算最快的10台超级计算机全部运行Linux操作系统2.Linux内核版本Linux内核是指由林纳斯亲自维护的Linux操作系统核心代码2001年,Linux2.4版本内核发布,2003年Linux2.6版本内核发布,使Linux逐渐成为一个成熟的操作系统常见的Linux内核版本有Linux2.4.20,Linux2.6、Linux3.2、Linux4.6.4等,其中r.x.y:r-主版本号,x-偶数稳定奇数开发,y-错误修补次数3.Linux发行版本Linux发现版本是厂商将Linux内核与外围实用程序和文档包装,提供安装界面和系统配置、管理工具等,形成发行系统目前主要发现版本有:RedHatEnterpriseLinux(RHEL):主要用作服务器FedoraUbuntu:界面美观、功能强大CentOS:是Linux服务器最有名最常用的发行版.中标麒麟(NeoKylin):普华Linux(i-soft)由于采用相同内核,Linux应用程序在不同版本间可做到二进制代码级兼容练习二、Linux系统目录结构

(1)目录树结构Linux与所有Unix系统具有大体一致的目录结构是一颗以”/”为根目录的树,无盘符概念,所有分区的文件挂载在某个目录下各个目录的取名和文件内容有统一规定,是一种规范可根据目录名和文件名推断其大概功能/

/binbinary(二进制)C:\WINDOWS\system32/bootboot

/devdevice

/etcetcetera(等等)注册表/home

C:\DocumentsandSettings/include、/usr/include

/lib/usr/liblibrary(库)C:\WINDOWS\system32/lost+found

/mntmount

/optoption

/procprocess注册表/root

/sbin/usr/sbinsystembinary

/selinux

securelinux

/srv

server

/tmptemporaryC:\Windows\Temp/usrUnixSystem(UserSoftware)ResourcesC:\ProgramFiles/varvariable

(2)主要目录说明:三、Linux目录结构设计的好处①用户创建的文件、档案全部放在/home目录下,规范、方便管理、可靠性好;②可创建专用系统分区,保存Linux系统文件,以只读方式挂载在/usr目录下,安全性好;③可创建一个专用分区,保存动态增长的文件档案,以读写方式挂载到/var目录下,不影响其他文件;④所有的UNIX和Linux目录结构与上述规范大体相似,同时也方便了人们的学习。练习:三、Linux系统安装、启动、登录、用户界面与命令格式

(1)安装、启动、登录看视频(2)、

三种系统操作界面

1.图形界面2.命令界面

3.编程接口open、read、write、close等,本课程基本上就是学习Linux编程接口(3)Linux命令格式1.Linux命令格式$命令名选项参数1参数2……命令名:由小写英文字母构成的字符串,命令功能为英文单词含义,如date、cp、mv、who、ls命令选项:是对命令的特别定义,以“-”开始,指示命令按特定模式执行,产生输出,如ls-l、ls-a若同时使用多个选项,多个选项可用一个“-”连起来,如ls–la命令选项出现顺序一般没有要求,如ls-l-a与ls-a–l功能相同

gcchello.c-ohello与gcc-ohello.chello功能相同命令参数:提供命令运行的信息,或者是命令执行过程中所使用的文件名,从哪里可以得到输入,以及把输出送到什么地方

如:cpfile1file2、mvfile1dir1、mkdirdir2练习:2.命令说明1)命令输出,命令执行成功与否判定执行成功:输出期望信息,或无任何输出,直接显示命令提示符$失败:显示出错信息,格式:”命令名:出错描述”示例:$cd$pwd/home/can$LS

bash:LS:commandnotfound$

ls-P

ls:invalidoption-P$

ls-lPPls:cannotaccessPP:Nosuchfileordirectory2)命令联机帮助百度百科Info命令,如$infopwdMan命令,如$manpasswd3)本课命令输入描述说明四、Linux文件、目录操作及文件属性、权限

通常普通用户的主要工作是文件档案处理,输入命令文件名运行程序,通过命令从文件读入输入数据,处理后,保存到另一文件。本课程所有实验任务都属于这类工作Linux系统为每个普通用户在/home目录下创建了一个用户名为目录名的“家”,如用户can的“家”是/home/can,用户guest的“家”是/home/guest;但根用户root的“家”在目录/root普通用户通常在其“家”目录下进行文档处理,创建、修改、删除文件档案,不能增删“家”之外其他目录中的文件档案(安全起见)(一)

目录路径与目录操作

I、绝对路径、工作目录、相对路径每个文件在某个目录之下,要操作或访问某个文件,应在命令或程序中通过路径方式给出文件所在位置。给出文件路径方法有两种:1.绝对路径:给出从根目录开始一直到所要操作文件名、中间以“/”隔开的完整路径。示例:$cat/etc/passwd、

$more/home/can/NachOS-4.1/code/testfd=open("/home/can/work/f1",O_RDONLY);fp=fopen("/home/can/work/f1","r+");2.工作目录相对路径:为缩短文件路径字符串长度,

Linux系统为每个命令窗口(Terminal)和应用进程设置一个工作目录,工作目录初始设置为用户的“家”,可用命令cd改变当用户操作工作目录中文件时,仅需在命令中给出文件名,如touchf1若操作非工作目录下文件,只需给出绝对路径中除工作目录之外的部分。示例:若当前工作目录为“/home/can”,则文件/home/can/NachOS-4.1/code/test/add.c可用相对路径表示为NachOS-4.1/code/test/add.c,相应命令检视命令简化为cat

NachOS-4.1/code/test/add.cII、几个特殊目录(“.”、”..”、”~”、“-”)Linux系统定义几个符号来表示一些常用的特殊目录,给命令输入带来方便“.”:当前工作目录,若工作目录为/home/can,则在文件路径中,“.”等同于/home/can“..”:上一层目录,若当前目录为/home/can,则“..”表示/home“-”:前一个工作目录,如当前工作目录为/home/can,执行cd/etc后,“.”表示/etc,而“-”表示/home/can;“~”:表”目前用户”所在的家目录,若但其用户为can,则“~”表示/home/can;~guest代表guest家目录“/home/guest”。练习:III、Linux目录操作命令(cd,pwd,mkdir,rmdir,rm)1.cd(变换工作目录)、pwd(显示当前工作目录)cd(changedirectory)命令改变当前工作目录,使用pwd(printworkdirectory)命令显示当前工作目录的绝对路径通常人们喜欢将两个命令联合使用,用cd切换到目标目录,用pwd验证切换到哪里去了。范例:$

pwd/home/can$

cd~guest$pwd/home/guest$cd~$

pwd/home/can$

cd

$

cd..$

pwd/home

$

cd-$

cd/var/spool/mail

$cd../mqueue思考题2.mkdir(创建目录)、rmdir(删除空目录)、ls(检视目录),rm(删除非空目录)一般在某个mkdir、rmdir、rm命令后接一个ls(list)命令,列出文件目录,以验证目录创建、目录删除操作是否成功范例$cd/tmp$pwd

/tmp$rm-rf*

$ls

$mkdirtest

$ls

test$mkdirtest1test/subtest2

$ls.testtest1test2test:Sub$rmdirtest1

$rmdirtestrmdir:failedtoremove`test1':Directorynotempty$rm-rftest$ls

test23.ls(文件目录检视命令)

格式:$ls[-aAdfFhilRS]目录名

常用选项:-a:列出全部的档案(或称文件),连同文件名以“.”开头的隐藏档案(文件)-A:列出全部的档案,连同隐藏档,但不包括.与..这两个目录,这个选项用得多;-F:根据档案、目录等信息,给予附加数据结构,例如:*:代表可执行档;/:代表目录;=:代表socket档案;|:代表FIFO档案;-i:列出inode位置,而非列出档案属性;-l:以长格式列出目录内容,包含档案的属性等等数据,这个选项用得多;-R:连同子目录内容一起列出来;-i:列出inode位置,而非列出档案属性;范例:$cd

$ls

DesktopNachos-3.4-for-ubuntu.tar.gzPublic

$ls-A.bash_history.lesshstPictures

$ls/etc…$ls-FDesktop/nachos-3.4/Pictures/fifo1|a.out*test/f1$ls-l~total24708drwxr-xr-x2rootroot40962012-08-2117:31Desktopdrwxr-xr-x2rootroot40962012-08-1823:27Documentsdrwxr-xr-x2rootroot40962012-08-1823:27Downloads-rw-r--r--1rootroot02015-02-0111:41f1prw-r--r--1rootroot02015-02-0111:38fifo1$ls-i686757Desktop686812nachos-4.0.tar807026Documents807159NachOS-4.1.bak$ls-ial683678-rw1rootroot74282014-04-0515:44.bash_history686917-rw-r--r--1rootroot31352012-08-1915:07.bashrc925835drwx5rootroot40962015-02-0108:07.cache678320drwx9rootroot40962012-10-2417:55.config(二)

文件属性与权限

I、文件属性描述有9种,可用命令ls–l列出文件类型和访问权限位结构II、文件访问权限1.操作权限含义对于普通文件、管道和设备等文件来写来说,r权限:该用户能读这个文件的内容,w权限:表示能更改文件内容x权限:能执行这个文件代表的程序或命令对于目录文件来说r权限:能列该目录内容,w权限:在该目录中增加或删除文件,x权限:能用cd命令进入该目录示例:-rwxr-xr-x

1canusers 1234567 2015-02-0111:41 hellodrwxr-xr--2aliceusers40962015-02-0112:41 sub(三)Linux文件操作命令

I、复制、移动与删除文件(cp,rm,mv,ln)ln(link)用于建立硬链接与符号链接,硬连接指向同一索引节点的另一文件名;mv(move)用于移动文件或目录到一个新的目录位置,也可以用于更名(rename)文件;rm(remove)用于移除文件,不但可删除文件,还可删除目录。1.复制文件(cp)命令格式:cp[-adfilprsu]源文件(source)目的文件(destination)

cp[options]source1source2source3Directory

常用选项:-f:为强制(force)的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;-i:若目的文件(destination)已经存在时,在覆盖时会先询问确认-l:创建文件的硬连结(hardlink),而非复制档案本身;-r:递归持续复制,用于目录复制;-s:复制成为符号连结文件(symboliclink),亦即“快捷方式”文件;范例1(复制单个文件):将家目录下的.bashrc复制到/tmp下,文件名改为bashrc$cd/tmp

$cp~/.bashrcbashrc$

ls范例2(复制单个文件):将/var/log/wtmp复制到/tmp底下,文件名不变$cd/tmp$cp/var/log/wtmp.$ls-l/var/log/wtmpwtmp-rw-rw-r--1rootutmp71808Jul1812:46/var/log/wtmp-rw-r--r--1rootroot71808Jul1821:58wtmp范例3:(复制整个目录):复制/etc/这个目录下的所有内容到/tmp底下$cd/tmp

$cp-rf/etc//tmp范例4(建立硬连接、符号链接):将范例一复制的bashrc建立一个硬链接和一个快捷方式$

ls-lbashrc$cp-sbashrcbashrc_slink或ln-sbashrcbashrc_slink$

cp-lbashrcbashrc_hlink或lnbashrcbashrc_hlink

$

ls-lbashrc*范例5(同时复制多个文件):将家目录的.bashrc及.bash_history复制到/tmp底下$cp~/.bashrc~/.bash_history/tmp2.rm(移除档案或目录)

命令格式:#rm[-fir]档案或目录常用选项:-f:就是force的意思,强制移除;-i:互动模式,在删除前会询问使用者是否动作-r:递归删除啊!见文件删文件,见目录删目录范例1:复制一个文件然后删除之$cd/tmp$cp~/.bashrcbashrc$rmbashrc范例2:删除一个不为空的目录$mkdirtest$cp~/.bashrctest/$rmdirtestrmdir:`test‘:Directorynotempty$rm-rftest3.mv(移动档案与目录,或更名)

常用格式:mv[-fiu]sourcedestination(档案或目录更名)

mv[options]source1source2source3Directory(档案或目录移动)

常用选项:-f:force强制的意思,强制直接移动而不询问;-i:若目标档案(destination)已经存在时,就会询问是否覆盖!-u:若目标档案已经存在,且source比较新,才会更新(update)范例1(单个文件移动):复制一档案,建立一目录,将档案移动到目录中$

cd/tmp$cp~/.bashrcbashrc$mvbashrcmvtest

$

cd/tmp$cp~/.bashrcbashrc$mkdirmvtest$mvbashrcmvtest范例2:(目录更名):将刚刚建立的目录mvtest称更名为mvtest2$mvmvtestmvtest2范例3:(多文件移动):再建立两个档案,再全部移动到/tmp/mvtest2中$cp~/.bashrcbashrc1$cp~/.bashrcbashrc2$mvbashrc1bashrc2mvtest2练习II、文件内容查阅(cat,tac,head,tail,more,less,od)1.检视文本文件内容:cat,tac,head,tail,more,less(范例)$cat/etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/sh$more/etc/passwd……avahi-autoipd:x:103:108:Avahiautoipdaemon,,,:/var/lib/avahi-autoipd:/bin/falseavahi:x:104:109:AvahimDNSdaemon,,,:/var/run/avahi-daemon:/bin/false--More--(51%)$less/etc/passwd……avahi-autoipd:x:103:108:Avahiautoipdaemon,,,:/var/lib/avahi-autoipd:/bin/falseavahi:x:104:109:AvahimDNSdaemon,,,:/var/run/avahi-daemon:/bin/false2.创建与编辑文件(gedit,touch,dd)gedit:创建和编辑文本文件(如源程序)touch:创建空文件,更新文件修改时间dd:创建指定大小,内容初始化为0的文件gedit$gedit&或$geditp1.c(2)在/tmp目录下新建一个空文件testtouch$cd/tmp$

touchtesttouch(3)在/tmp目录下创建一个大小为10MB的文件testdd:$cd/tmp$

ddif=/dev/zeroof=testddcount=10240bs=1024$ls-ltestdd-rw-r--r--1rootroot0Jul1920:49testtouch(四)

档案属性修改(touch,chmod)

文件其他属性在文件编辑过程中自动修改,文件权限信息通过chmod命令修改,文件所属用户、所属用户组用命令chown和chgrp修改chmod命令基本格式为:范例:创建文件f52、f521、f522,将f52权限更改为777,为所有用户添加对f521读写权限,去掉所有用户对f522的写权限练习:思考题1.161)一个Linux文件的八进制数访问权限为755,用ls-l命令显示的文件权限是什么?用ls-l命令显示的文件权限是rw-r--r--,用八进制数表示的权限值是多少?2)写出命令,在当前目录下创建文件f54,将其访问权限设置为664.3)当前目录下某个文件test.sh的权限是rw-r--r--,成功执行命令chmod+xtest.sh后,test.sh的权限变成___________________,用八进制数表示为____________。(五)使用通配符(*,-,?)一次操作多个文件(目录)

*:匹配任何字符串?:匹配任何一个字符(六)

档案的压缩与打包(tar命令)

I、文件打包和解包常用格式:$tar<选项>[压缩文件]<文件列表>

常用选项:

-cvf打包

-xvf解包

-czvf打包后压缩成.gz格式恩及

-zxvf先对.gz文件解压缩,再解包

-cjvf打包并压缩成.bz2格式文件

-xjvf先对.bz2文件节压缩,再解包范例:在当前目录下创建目录dir5,在其中创建四个文件f1、f2、f3、f4,对该目录打包并压缩成文件dir5.tar.gz,删除该目录,然后解包dir5.gz:2.在Windows主机与Linux虚拟机之间进行档案互传

(1)文本复制(2)文件拖放:看视频练习:总结:即兴总结课后作业:命令练习实验第2章LinuxC编程环境本章概述本章的学习目标主要内容本章概述

本章主要讲述shell基本编程方法、Shell环境变量、Shell控制结构、Shell函数、Shell输入输出的基本概念、语法结构和编程方法,其中介绍的示例都浅显易懂,帮助读者掌握shell基本编程方法。本章重点是shell变量、输入输出重定向、管道、环境变量、标准文件描述符的概念和基本使用方法本章学习目标掌握Shell脚本、变量、表达式、数学运算、字符串处理、输入输出的语法结构掌握使用shell条件和条件、选择、循环三大控制结构编程的基本编程方法理解全局变量、局部变量、环境变、命令行参数量基本概念与用途掌握文件I/O和I/O重定向的基本编程方法理解Shell函数本章主要内容Shell编程基本概念Shell数学运算与字符串处理Shell条件与if控制结构循环结构环境变量与命令行参数Linux全局变量和环境变量Linux文件I/O、I/O重定向和管道命令行参数shell函数2.1Shell编程基本概念1.shell脚本程序实例shscri.sh组成Shell脚本的语句可包括Linux命令、赋值语句、输入输出语句、流程控制结构”#!/bin/bash//注释行list=`ls./temp`//该命令的输出为表达式值forfin$listdomv./temp/$f./temp/$f.txtdoneechofinished!//输出信息“finished!”$chmod+xshscri.sh$./shscri.shfinished!一.Shell脚本程序结构二.Shell变量与赋值表达式1.变量定义和赋值Shell变量无需事先定义直接复制,在给变量赋值时自动获得定义Shell变量值的类型都是字符串,可以将任何字符串赋值给变量。值通过等号直接赋给用户变量,在变量、等号和值之间不能出现空格示例:var1=10var2=57var4=testingvar5="stillmoretesting"exvar.c:#!/bin/bash#testingvariablesnum=3guest1=Aliceguest2="BillGates"msg="$guest1logsoutbeforethe${num}thday."echo$msgecho"currentdirectoryof${guest2}is`pwd`."2.Shell变量引用和shell表达式给Shell变量的赋值表达式可以由字符串常量、Shell变量引用、Linux命令输出直接拼接而成。Shell要求通过美元符号($)来引用变量若被引用的shell变量名后紧接着字母、数字、下划线等字符,则应将变量名用花括号({})括起$chmod+xexvar.sh$./exvar.shAlicelogsoutbeforethe3thday.currentdirectoryofBillGatesis/home/xuqg/temp.思考题下面的shell脚本存在多处错误,每行都有错,请指出来并予以更正。#!bin/bash var1=5var2=helloworldvar3=$var2abcdecho我的当前目录是:'pwd'四、Shell输入输出语句Shell脚本用echo命令变量值或包含变量值、字符串常量、命令输出的表达式值显示出来shell脚本用read命令让用户从键盘终端输入信息,存入Shell变量格式:read[-s][-pprompt]variable1variable2…表示将用户输入的多个字符串依次存入shell变量variable1、varible2、…。-pprompt:表示在提示用时输入前显示提示串prompt-s:表示默读,用户输入信息时无任何显示,用于输入密码等敏感信息示例程序io.sh:#!/bin/bash#testingreadandechocommandsread-p"Enteryourname:"firstlastecho"Checkingdatafor$last,$first"read-s-p"请输入您的密码:"passecho"Isyourpasswordreally$pass?“$chmod+xio.sh$./io.shEnteryourname:BillGatesCheckingdataforGates,Bill请输入您的密码:123456Isyourpasswordreally123456?五、退出脚本和退出状态Bash启动的一条命令或一个脚本运行完成后,我们经常需要了解命令或脚本的执行情况,成功、失败,还是压根就没有执行,如果失败,是什么原因所致。后续命令需要根据退出状态做不同处理。在Linux系统中,任何命令、脚本执行完成后,都有一个退出状态,即使命令根本没有执行或不存在,也会有一个退出状态。按照Linux系统规范,命令或脚本退出状态码是一个介于0和255之间的整数值,一般0代表执行成功,>0代表执行失败。命令或脚本的退出状态有用户设置和系统设置两种情况。(1)用户设置程序或脚本退出状态码,格式为:exit状态码状态码为0表示脚本执行成功,为非0表示失败,非0编码与失败原因之间的对应关系由编程人员自行定义。(2)系统设置退出状态代码描述代码描述0命令成功完成128无效的退出参数126命令无法执行128+x使用Linux信号的致命错误127没有找到命令130CTRL-C终止进程Linux将进程(命令、脚本执行)的退出状态保存在一个特殊的shell变量(?)中,可在进程结束时,立即执行echo等命令读取该变量的值来取得前一个命令或脚本的退出状态。$dateSatSep2910:01:30EDT2007$echo$?0$asdfg-bash:asdfg:comrnandnotfound$echo$?127$echo$?0$./myprog.c-bash:./myprog.c:permissiondenied$echo$?126status1.sh#/bin/bashpwd$bash./status1.sh$echo$?0status2.sh#/bin/bashexit0$bash./status2.sh$echo$?0Status3.sh#/bin/bashexit10$bash./status3.sh$echo$?10status4.cintmain(){exit(5);}$gcc-ostatus4status4.c$./status4$echo$?5status5.cintmain(){atoi("123");}$gcc-ostatus5status6.c$./status5$echo$?123练习题2.2在当前目录下输入命令”ls-l”的输出结果如下:-rw-rw-r--1xuqgxuqg114Jul1519:07test.sh-rw-rw-r--1xuqgxuqg110Jul1518:46semlib.c~drwxr-xr-x4rootroot4096Feb100:18dir1请问下列各命令序列中echo$?的输出结果是什么?(注意:LinuxShell允许在一行输入多个命令,只需命令间以分号隔开)./dir1;echo$?;echo$?cd;echo$?./semlib.c;echo$?;$echo$?./abcd;echo$?2.2Shell数学运算与字符串处理一、Shell数学计算Linuxshell提供两种实施数学运算的机制:一种方法是使用expr命令,格式为exprexpression;另一种方法用美元符号和方括号把数学表达式括起来,格式为$[expression]。示例:arith.sh#!/bin/bashvarl=100var2=45var3=50var4=$[$varl*($var2-$var3)]echoThefinalresultis$var4$chmod+xarith.sh$./arith.shThefinalresultis-500二、Shell中字符串处理BashShell本身没有库函数概念,对字符串处理的支持主要通过expr、awk等命令来实现功能编程方法编程示例抽取子字符串exprsubstr字符串开始索引长度str=`exprsubstr"abc"22`结果str值为:bc${str:pos}${str:pos:len}功能:在字符串$str中,抽取从位置pos开始,长度为len的子串str="abc"

str2=${str:1}

str3=${str:1:2}结果:str2、str3的值都是bc计算字符串的长度${#string}exprlength$string功能:计算字符串$string的长度str=acbdefn1=${#str}n2=`exprlength`结果为n1、n2的值都是5计算子串的出现位置exprindex$stringsubstring功能:在字符串$string上找出substring中字符第一次出现的位置,若找不到则exprindex返回0或1。str="hello,everyone"n1=`exprindex"$str"my`n2=`exprindex"$str"ev`n3=`exprindex"$str"ev.*`结果:n1为0,n2、n3都是2找匹配字符串长度exprmatch$stringsubstring功能:计算$string从头开始匹配substring字符串长度,返回匹配到的字符串长度,若找不到则返回0string="hello,everyone"n1=`exprmatch"$string"he`n2=`exprmatch"$string"he.*`结果:n1为2,n2为14其中,.*正则表达式通配符,表示匹配任何子串删除字符串${string#substring}功能:删除string开头处与substring匹配的最短字符子串str="20091111readnowplease"str1=${str#2*1}结果str1为:111readnowplease删掉了从字符2开始,到第一个1为止的子串${string##substring}功能:删除string开头处与substring匹配的最长字符子串str="20091111readnowplease"str2=${str##2*1}结果str2为:readnowplease删掉了从字符2开始,到第一个1为止的子串思考题2.3请写出执行下面脚本的输出:#!/bin/bashstring="hello,everyonemynameisxiaoming"echoecho${#string}exprindex"$string"myexprmatch"$string"hell.*exprmatch"$string"hellecho${string:10:5}exprsubstr"$string"1052.3Shell条件与if控制结构Bash可以对Shell脚本进行流程控制,提供if、case和for等控制结构,使Shell具有C、Java等高级语言的流程控制能力一、if结构化语句

不带else分支的if语句格式:ifcommandthencommandsfi带else分支的if语句格式:ifcommandthencommandselsecommandsfi示例1:condif1.sh1#!/bin/bash2#testingtheifstatement3ifdate4then5echo"itworked"6fi$./condif1.shSatSep2914:09:24EDT2007itworked示例2:condif2.sh1#!/bin/bash2#testingabadcomrnand3ifasdfg4then5echo"itdidn'twork"6fi7echo"we'reoutsideoftheifstatement"$./condif12.sh./test2:line3:asdfg:commandnotfoundwe'reoutsideoftheifstatement示例3:condif3.sh1#!/bin/bash2#testingmultiplecommandsinthethensection3testuser=can4ifgrep$testuser/etc/passwd5then6echoThebashfilesforuser$testuserare:71s-a/home/$testuser/.b*8else

9echo"Theusername$testuserdoesn'texistonthissystem"10fi$./condif3.shrich:x:500:500:RichBlum:/home/rich:/bin/bashThefilesforuserrichare:/home/rich/.bash_historyIhome/rich/.bash_profile/home/rich/.bash_logout/home/rich/.bashrc二、test命令test命令可以做数值比较、文件属性检查、字符串比较,用于if条件判断。过test命令算出的条件值为true,则test命令将其退出状态码设置为0,if语句执行其Then分支,如果算出的条件值为false,则test命令退出状态为非0,if语句的else分支执行格式:if[condition]

then

commandsfiiftestconditionthencommandsfi1.数值比较比较描述比较描述n1-eqn2检查n1是否等于n2n1-len2检查n1是否小于或等于n2n1–gen2检查n1是否大于或等于n2n1-ltn2检查n1是否小于n2n1-gtn2检查n1是否大于n2n1-nen2检查n1是否不等于n2cmpnum.sh是一个例子:#!/bin/bash

#usingnumerictestcomparisons

val1=10

va12=11

if[$va11-gt5)

then

echo"Thetestvalue$va11isgreaterthan5"

fi

if[$va11-eq$va12]

then

echo"Thevaluesareequal"

e1se

echo"Thevaluesaredifferent"

fi$./cmpnum.shThetestvalue10isgreaterthan5Thevaluesaredifferent2、字符串比较比较描述比较描述str1=str2检查str1与str2是否相同str1>str2检查str1是否大于str2str1!=str2检查str1与str2是否不同-nstr1检查str1长度是否大于0str1<str2检查str1是否大小于str2-zstr1检查str1长度是否为0示例脚本cmpstr.sh1234567891011121314151617#!/bin/bash#test1ngstringlengthvall=testingva12=''if[-n$vall]thenecho"Thestring'$vall'1snotempty"e1seecho"Thestring'$vall'isempty"fi

if[-z$va12]thenecho"Thestring'$val2'1snotempty"e1seecho"Thestring'$val2'isempty"fi$./cmpstr.shThestring'testing'isnotemptyThestring"isempty3、文件测试比较描述-dfile检查file是否存在并且是一个目录-efile检查file是否存在-ffile检查file是否存在并且是一个文件-rfile检查file是否存在并且可读-sfile检查file是否存在并且不为空-wfile检查file是否存在并且可写-xfile检查file是否存在并且可执行-Ofile检查file是否存在并且被当前用户拥有-Gfile检查file是否存在并且默认值为当前用户组file1-ntfile2检查file1是否比file2新file1-ozfile2检查file1是否比file2旧(1)检查对象是否存在示例cmpfile.sh123456789101112131415161718#!/bin/bash#checkifafileif[-e$HOME]thenecho"Theobject$HOMEexists,isitafile?"if[-f$HOME]thenecho"Yes,it'safile!"elseecho"No,$HOMEisnotafile!"fiif[-f$HOME/.bash_history]thenecho"But$HOME/.bash_historyisafile!"fielseecho"Sorry,theobjectdoesn'texist"fi$./cmpfile1.shTheobject…exists,isitafl1e?NO,…isnotafile!But…/.bash_historyisafile!(2)检查文件是否能够运行cmpfile2.sh123456789#!/bin/bash#testingfi1eexecutionif[-xcmpfile1.sh]thenecho"Youcanrunthescript:"./cmpfile1.she1seecho"Sorry,youareunab1etoexecutethescript"fi$./cmpfile2.shYoucanrunthescript:….三、复合条件检查if-then语句可以使用布尔逻辑来合并检查条件,可以使用两个布尔操作符:...[conditionl]&&[condition2]...[conditionl]||[condition2]cmpand.sh示例脚本1 #!/bin/bash2 #testingcompoundcomparisons3 if[-d$HOME]&&[-w$HOME:/testing]4 then5 echo"Thefileexistsandyoucanwritetoit"6 else7 echo"1can'twritetothefile"8 fi$./cmpand.shIcan'twritetothefile$touch$HOME:/testing$./cmpand.shThefileexistsandyoucanwritetoit四、case语句格式:casevariableinpatternl|pattern2)commandsl;;pattern3)commands2;;*)defaultcommands;;esaccondcase.sh示例程序:1 #!/bin/bash2 #usingthecasecommand3 USER=rich4 case$USERin5 rich|barbara)6 echo"Welcome,$USER"7 echo"Pleaseenjoyyourvisit";;8 testing)9 echo"Specialtestingaccount";;10 essica)11 echo"Don'tforgettologoffwhenyou'redone";;12 *)13 echo"Sorry,you'renotallowedhere";;14 esac$./condcase.shWelcome,richPleaseenjoyyourvisit2.4循环结构一、for循环结构格式:forvarinlistdocommandsdone1.读取列表或变量中的值loopfor1.sh是一个示例:1 #!/bin/bash2 #basicforcommand3 fortestinAlabamaAlaskaArizona"NewMexico"4 do5 echoThenextstateis$test6 done$./loopfor1.shThenextstateisAlabamaThenextstateisAlaskaThenextstate1sArizonaThenextstateisNewMexico2.读取命令结果中的值loopfor2.sh示例:1 #!/bin/bash2 #readingvaluesfromafile3 file="states"4 forstatein`cat$file`5 do6 echo"Visitbeautiful$state"7 done3.使用通配符读取目录loopfor3.sh示例程序:1 #!/bin/bash2 #iteratethroughallthefilesinadirectory3 forfilein/home/can/work/*4 do5 if[-d"$file"]6 then7 echo"$fileisadirectory"8 elif[-f"$file"]9 then10 echofileisafile"11 fi12 done$./loopfor3.sh/home/can/work/chap3isadirectory……编程题2.4ls-F命令的输出如下:

chap3/chap4/chap5/chap6/chap7/chap8/chap9/lib/

请编写Shell程序,将子目录lib下的libwrapper.a和wrapper.h两个文件复制到chap3~chap9这七个目录中。二、while循环结构whiletestcommanddoothercommandsdone示例程序loopwhile1.sh1 #!/bin/bash2 #whilecommandtest3 varl=104 while[$varl-gt0]5 do6 echo$var17 var1=$[$var1-1]8 done$./loopwhile1.sh1098…..三、until循环结构untiltestcommandsdoothercommandsdone示例loopuntil.sh1 #!/bin/bash2 #usingtheuntilcornmand3 var1=1004 until[$var1-eq0]5 do6 echo$var17 var1=$[$var1-25]8 done$./loopuntil.sh10075……2.5Linux全局变量和环境变量一、LinuxShell层次结构$bash./scope.sh命令①$bash 命令②$./scope.sh 命令③$exit 命令④$../scope.sh

命令⑤二、Shell全局变量与局部变量全局变量是在所有子Shell中都可见的Shell变量,而局部变量是仅在创建它的Shell中可见的变量。局部变量是通过直接给变量赋值而创建的Shell变量,而全局变量则是用export命令处理过的局部变量以下脚本就创建了局部变量var1和两个全局变量var2、var3:var1=localexportvar2="globalvar2"var3="globalvar3"exportvar32假设脚本文件scope2.sh #!/bin/bash echo$var1 echo$var2终端执行的命令序列:$var1=local$exportvar2="globalvar2"$bash./scope2.sh$bash$./scope.sh$exit$../scope2.sh或$source./scope2.sh思考题2.6在上述脚本中,将第1行命令改为“exportvar1=local”,将第2行命令改为“var2=globalvar2”,请问第3、5、7行命令的输出结果是什么?三、Linux环境变量系统环境变量实际上是在Linux系统启动、用户登录、创建Shell会话(打开命令窗口)的过程中,执行特定初始化脚本创建任务的全局变量变量描述PATH冒号隔开的目录列表,Shell将在这些目录中查找命令LD_LIBRARY_PATH程序运行过程中查找第三方动态库的目录路径,以冒号隔开多个目录C_INCLUDE_PATHC程序编译过程中查找第三方头文件的目录路径,以冒号隔开多个目录CPLUS_INCLUDE_PATHC++程序编译过程中查找第三方头文件的目录路径,以冒号隔开多个目录JAVA_HOMEJava开发环境所在目录UID当前用户IDHOME当前用户的主目录USER当前用户名SHELL当前Shell类型PWD当前工作目录表2-7Linux常用的环境变量的名称和描述四、Shell变量的删除和只读设置方法$var1=123456$echovar1123456$unsetvar1$echo$var1$$readonlyx=9$x=10bash:x:readonlyvariable #不能再给只读变量x赋值$declare–ry="wearefriends"$unsetybash:unset:x:cannotunset:readonlyvariable五、Shell数组的定义和使用方法定义格式:array_name=(value1...valuen)或array_name[i]=value1引用格式

${array_name[index]}示例脚本array.sh1 #!/bin/sh2 NAME[0]="Zara"3 NAME[1]="Qadir"4 NAME[2]="Mahnaz"5 echo"FirstIndex:${NAME[0]}"6 echo"SecondIndex:${NAME[1]}"$./array.shFirstIndex:ZaraSecondIndex:Qadir2.6Linux文件I/O、I/O重定向和管道一、

标准文件描述符文件描述符缩写描述0STDIN标准输入1STDOUT标准输出2STDERR标准错误输出二、I/O重定向1.输出重定向格式:Comrnand>outputfile$date>outfile$ls-1outfile-rw-r--r--1richrich29Sep2417:56outfile$catoutfileTueMay2417:56:58EDT2016$who>>outfile$catoutfileTueMay2417:56:58EDT2016xuqg:02016-06-2201:22(:0)2.输入重定向格式:comrnand<inputfi1e$wc<outfile313643.标准错误输出重定向$ls-albadfi1e>outfile1s:cannotaccessbadfi1e:Nosuchfi1eordirectory$catoutfile$ls-albadfi1e2>errfile$caterrfile1s:cannotaccessbadfi1e:Nosuchfi1eordirectory$ls-altesttest2test3badtest2>test61>test7$cattest61s:cannotaccesstest:Nosuchfileordirectory1s:cannotaccessbadtest:Nosuchfileordirectory$cattest7-rw-rw-r--1richrich1582007-10-2611:32test2-rw-rw-r--1richrich02007-10-2611:33test3思考题2.7找出用户当前主目录下所有的C程序文件的路径,存入文件cfile.lst。三、管道格式:commandl|commard2$cat/etc/passwd|grep/bin/bashroot:x:0:0:root:/root:/bin/bashcouchdb:x:105:113:CouchDBAdministrator,,,:/var/lib/couchdb:/bin/bashlinux:x:1000:1000:Farsight,,,:/home/linux:/bin/bashcan:x:1002:1002::/home/can:/bin/bash$cat/etc/passwd|grep/bin/bash|wc-l4四、从文件获取输入bash从标准输入读取数

温馨提示

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

评论

0/150

提交评论