版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目四
用Vim编辑器编写shell脚本目录任务4.1初识shell01任务4.2编写shell程序02任务4.3利用输入/输出重定向获取/输出信息03任务4.4使用Vim编辑器04任务4.1初识shell014.1.1了解shellShell是用户与操作系统内核之间的交互接口,属于命令行解释器。它接收用户输入的命令,解析并执行这些命令,同时将结果反馈给用户。Shell不仅支持直接输入命令,还允许用户编写由命令组成的脚本,实现自动化任务。shell定义了各种选项和变量,支持各种高级语言所具有的程序结构,例如条件、循环、函数等。Linux中的shell命令可分为内部命令和外部命令。内置在Bash中的命令称为内部命令。以可执行文件的形式存储在Linux文件系统中的命令称为外部命令。4.1.2shell的核心功能shell的核心功能命令解释与执行将用户输入的命令转换为操作系统可识别的指令。例如,输入ls-l会列出当前目录下的文件详细信息。01脚本编程支持编写Shell脚本(如.sh文件),通过逻辑控制实现复杂任务的自动化。例如,定期备份文件或批量处理数据。024.1.2shell的核心功能环境与变量管理提供系统变量(如PATH)和用户自定义变量,方便配置环境。例如,$HOME表示用户主目录。04流程控制支持条件判断(if)、循环(for、while)等结构,实现复杂逻辑。例如,遍历目录中的文件并执行操作。05进程管理可启动、暂停或终止进程。例如,通过ps查看进程,kill终止进程。064.1.3常见Shell类型1.Bash(BourneAgainShell)Bash是Linux默认Shell,兼容sh并扩展了功能(如命令补全、历史记录)。语法简单,适合新手。2.Zsh
功能强大,支持插件和主题,语法更灵活(如自动补全、拼写纠正)。3.Ksh(KornShell)
结合csh和sh的优点,支持高级编程特性。4.Csh(CShell)
语法类似C语言,适合熟悉C的用户,但已逐渐被Bash/Zsh取代。4.1.4使用BashShellBashShell是Linux系统中最常用的Shell之一,它能运行于大多数类UNIX操作系统之上。Bash是一种命令行解释器,负责用户与操作系统内核之间的交互。用户输入命令后,Bash将其解释并传递给内核执行,再将结果返回给用户。Linux操作系统下的Bash提示符分为#与$两种,其中#代表超级账户root,$代表普通账户。Bash命令的格式如下:$command[[-]option(s)][optionargument(s)][commandargument(s)]选项说明:
$:计算机的提示符。
[]:可选的。
Command:命令,均为小写。
[[-]option(s)]:Bash的命令选项。
[optionargument(s)]:定制命令选项的一个或多个修饰符号。
[commandargument(s)]:命令对象。4.1.4使用BashShellBash有以下功能:(1)命令记忆功能,即它能记忆使用过的命令。Bash能自动跟踪用户每次输入的命令,并把输入的命令保存在历史列表缓冲区中。(2)命令与文件补全功能。在Bash命令提示符下输入命令或程序名时,若没有输全命令或程序名,按Tab键,Bash将自动补全命令或程序名。在Bash的提示符后面连续按两次Tab键可以显示所有的可执行命令。(3)命令别名设置功能。在Bash下,可用im这个自定义的命令来替换“Is-al”这样的命令串。4.1.4使用BashShell(4)作业控制。作业控制是指在一个作业执行过程中控制执行的状态。可以挂起一个正在执行的进程,并在以后恢复执行该进程。(5)程序脚本。在Linux系统中可以使用shellscript将平时管理系统常需要执行的连续命令写成一个文件。(6)拥有通配符。在Bash下可以使用通配符“*”和“?”。“*”可以替代多个字符,而“?”则替代一个字符。任务4.2编写shell程序024.2.1创建shell脚本Linux中的脚本(Shell程序)是一个文本文件,包含各类Linux的Shell命令。通过脚本文件,这些命令汇集在一起,可连续执行Shell命令。shell脚本的后缀为.sh。
语法格式如下:#!/bin/sh#comments
#!/bin/sh:表示其后路径所指定的程序即是解释此脚本文件的shell程序,不可缺少。
#comments:主程序。
注释行:以#开头直到此行的结束。如果一行未完成,可以在行尾加上“\”,这个符号表明下一行与此行会合并为同一行。示例编写shell程序,在终端输出“这是第一个shell程序”。#!/bin/sh#var="这是第一个shell程序"#echo$var4.2.2使用变量Shell变量是存储数据(如字符串、数字等)的容器,用于在Shell脚本或命令行中动态引用和操作数据。它们是Shell编程的核心概念,直接影响脚本的灵活性和可维护性。Shell变量分为环境变量、用户自定义变量、引用变量等。1.环境变量
在Linux系统中,每个用户登录系统后都会有一个专用的运行环境。用户可以通过一些变量来完成自己的个性化设置。Linux环境由许多变量和这些变量的值组成,通过设置这些环境变量来控制用户环境。Linux系统的环境变量通常以大写字符来表示。4.2.2使用变量(1)使用常见环境变量。shell中的常见环境变量如表所示:变量名描述HOME用户主目录的全路径名。主目录是开始工作的位置,默认情况下普通用户的主目录为/home/用户名,root用户的主目录为/rootLOGNAME用户名,由Linux自动设置,系统通过LOGNAME变量确认文件的所有者以及执行某个命令的权限等HISTSIZE保存历史的条数PATH目录。PATH变量中的字符串顺序决定了先从哪个目录查找HOSTNAME主机的名称LANG系统目前的工作语言PWD当前工作目录的路径,它指出目前所在的位置SHELL当前用户的shell类型MAIL当前用户的邮件存放目录4.2.2使用变量(2)使用特殊变量。在shell中有一些特殊变量,如表所示:变量名描述$#:表示命令行中参数的个数$$当前进程的进程号$@表示命令行中输入的所有参数串$0命令行中输入的shell程序名$?表示上一条命令执行后的返回值$*表示shell程序的所有参数串【示例】改变目录HOME/Desktop。[root@localhost~]
#cd$HOME/Desktop4.2.2使用变量(3)显示环境变量。可以用echo和env命令显示环境变量,echo命令用于显示单个变量,env命令用于显示所有环境变量。使用环境变量时,要在其名称前面加上“$”符号。【示例】显示环境变量$HOME。[root@localhost~]
#echo
$HOME
(4)清除环境变量。【示例】清除环境变量的命令为:Unset
$HOME4.2.2使用变量(5)设置环境变量的文件。使用Bashshell时,有以下几个文件和用户的作业环境有关:1)改变系统所有用户环境变量的文件:/etc/profile/etc/bashrc/etc/inputrc2)改变单一用户用户环境文件:$HOME/.bash_profile$HOME/.bashrc$HOME/.inputrc$HOME/.bash_login4.2.2使用变量2.用户定义变量用户可以按照一定的语法规则自定义变量。(1)给变量起名。shell的变量名与其他高级语言一样遵循表示符命名规则,即以字母或下划线开头,其余部分可由字母、数字和下划线组成,shell变量名的长度不受限制。shell的变量名对大小写敏感。比如,dir与Dir是不同的变量。(2)给变量赋值。用户可以给自定义的变量赋值,格式为:
变量名=值变量赋值的注意事项说明如下:
在赋值语句中,如果赋值号“=”的右边有空格,则需要用双引号括起来。
若有空格符可以使用双引号“"”或单引号“'”来将变量内容结合起来,但需要特别留意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
必要时需要以跳脱字符“\”来将特殊符号(如$、\、空格符等)变成一般符号。示例1.给变量myname赋值。myname=/root/Desktop/newvi.shmyname是变量名,“=”是赋值号,字符串“/root/Desktop/newvi/sh”是赋予变量myname的值。变量的值可以改变,只需利用赋值语句重新给它赋值。例如myname=/etc/apt/lin.list。此时,变量myname的值就是/etc/apt/lin.list。2.将字符串centos
linux赋值给cm。cm="centos
linux"
说明:等号右边有空格,因此要用引号括起来。4.2.3使用算术运算符shell是一种弱编程语言,算术运算不算强大,整数算术运算表达式与C语言中表达式的语法相同。shell中的算术运算符及每个符号的优先级如表4-3所示。优先级是由高到低的,1代表最高。同级运算符在同一个表达式中出现时,其执行顺序由结合性表示,“→”表示从左至右,“←”表示从右至左。运算符优先级结合性作用+、-1→正、负!、~2←非、按位求反**3→幂*、/、%4→乘、除、取模+、-5→加、减<<、>>6→左移、右移>、>=、<、<=7→关系==、!=8→相等、不相等&9→与4.2.4使用输入输出命令
在LinuxShell脚本中,read和echo是两个最常用的输入输出命令,分别用于从用户或文件中读取输入,以及向终端或文件输出内容。1.输入命令readread用于从标准输入(如键盘或文件)读取用户输入,并将值赋给变量。格式如下:read[选项]变量名选项说明:
-p:显示提示信息(等待用户输入前)。
-s:静默模式(输入不显示,适用于密码等敏感信息)。
-t:设置超时时间(秒),超时后返回非零状态。
-a:将输入按空格分隔后存入数组。4.2.4使用输入输出命令2.输出命令echoecho用于输出文本或变量的值到标准输出(通常是终端屏幕)。echo命令格式如下:echo[选项][字符串或变量]选项说明:
-e:启用转义字符解释(如\n换行、\t制表符)。
-n:不输出末尾的换行符。
-E:禁用转义字符解释(默认行为)【示例】编写一个shell程序,从键盘输出两个字符串,然后将这两个字符串显示在终端上。具体步骤如下:#!/bin/shecho请输入第一个字符串:readStr1echo请输入第二个字符串:readStr2echo$Str1,$Str2运行结果为:请输入第一个字符串:Hello请输入第二个字符串:TomHello,Tom4.2.5使用分支语句在Shell脚本中,分支语句主要通过if、elif、else和case实现。1.if单分支语句命令格式为:【示例】
输入文件名,判断文件是否为目录,若是,则输出“是个目录”。if[-d$fname];thenecho"是个目录"fiif[条件];then#条件成立时执行的代码fi4.2.5使用分支语句2.if-else双分支语句命令格式为:【示例】判断数字是否大于10,如果大于10,输出“数字大于10”,否则输出“数字小于等于10”。if[$num-gt10];thenecho"数字大于10"elseecho"数字小于等于10"fiif[条件];then#条件成立时执行的代码else#条件不成立时执行的代码fi4.2.5使用分支语句3.多分支if语句多分支if语句的格式如下:if语句可根据表达式的值是真还是假来决定要执行的程序段落。如果if后面的表达式为真,则执行语句段落1,如果表达式2成立,则执行语句段落2,依此类推。如果表达式都不成立,则执行else后面的语句段落n。if表达式1then语句段落1elseif表达式2then语句段落2...else..语句段落nfi【示例】
在键盘上读取一个字符,然后根据字符的值来判断对错。#!/bin/bashecho-n"输入一个字母:" //-n不换行readInput //从键盘读入数据if[$Input=m]thenecho"youareright"elseif[$Input=t]thenecho"youarewrong"elseecho"error."fi#end【示例】
在键盘上读取一个字符,然后根据字符的值来判断对错。#!/bin/bashecho-n"输入一个字母:" //-n不换行readInput //从键盘读入数据if[$Input=m]thenecho"youareright"elseif[$Input=t]thenecho"youarewrong"elseecho"error."fi#end4.2.5使用分支语句4.case语句语法格式如下:casevarin //var用来接收输入参数的值。value1) //测试条件1,如果变量值为value1则执行以下命令
语句段落1;;;;value2) //测试条件2
语句段落2;;...*) //如果以上类型都不满足则执行以下命令
语句段落n;;esac //这个case的设定结束处【示例】依照用户的选择决定程序执行。case$1in//变量$1接收执行时的第一个参数one)echo"yourchoiceisone";;two)echo"yourchoiceistwo";;three)echo"yourchoiceisthree";;*)echo"error"esac//case语句结束4.2.6使用条件测试命令testtest命令格式为:testexpression或[expression]改用中括号形式,注意等号操作符两边和中括号内侧都要有空格。#[6=6]#echo$?0【示例】字符串测试。注意:等号操作符两边都要有空格。特殊变量“$?”表示上一条命令执行后的返回值,如果返回值为假,“$?”返回1,如果返回值为真,“$?”返回0。#test6=7#echo$?1【示例】字符串测试。4.2.6使用条件测试命令testtest命令可以和多种系统运算符一起使用。这些运算符可以分为4类:字符串运算符、算术运算符、文件运算符和逻辑运算符。条件描述str1=str2如果str1和str2相同,则为真str1!=str2如果str1和str2不相同,则为真str如果str不为空,则为真-nstr如果str的长度大于零,则为真-zstr如果str的长度等于零,则为真(1)字符串运算符4.2.6使用条件测试命令test(2)算术运算符:用来判断数值表达式的真假。条件描述int1-eqint2如果int1=int2,则为真int1-geint2如果int1>=int2,则为真int1-gtint2如果int1>int2,则为真int1-leint2如果int1<=int2,则为真int1-ltint2如果int1<int2,则为真int1-neint2如果int1!=int2,则为真4.2.6使用条件测试命令test(3)文件运算符:用来判断文件是否存在、类型及属性,如表4-6所示。条件描述-dfilename如果filename为目录,则为真-ffilename如果filename为普通文件,则为真-rfilename如果filename为只读,则为真-sfilename如果filename的长度大于零,则为真-wfilename如果filename为可写,则为真-xfilename如果filename为可执行,则为真示例【示例】
判断/etc是否为目录。【示例】
判断用户对目录/etc是否有写的权限。
#[-w/etc]#[-d/etc]#echo$?04.2.6使用条件测试命令test(4)逻辑运算符:用来结合表达式或取得表达式相反值。条件描述!expr如果expr为假,则返回真expr1-aexpr2如果expr1和expr2同时为真,则返回真expr2-oexpr2如果expr1或expr2有一个为真,则返回真【示例】判断文件存在且具有可写的权限。#[-f/etc/passwd-a-w/etc/passwd]4.2.7使用循环语句
循环语句可以将多次重复运算凝聚在简短的程序中,从而减少代码量。shell中提供了几种执行循环的命令,比较常见的循环命令是for循环、while循环和until循环。
其中变量是在当前循环中使用的一个对象,用来接收变量列表中的元素;变量列表是整个循环要操作的对象的集合,可以是字符串集合或文件名、参数等,变量列表的值会被逐个赋给变量。for语句有多种格式,也是比较灵活的一种循环语句。for循环的格式如下:for变量in变量列表dodone使用for语句循环forfilein*.txt //对目录下的每个txt文件doecho$file //输出文件名cat$file //输出文件内容done4.2.7使用循环语句【示例】把列表中的几个值显示出来。【示例】使用通配符显示当前目录下所有文本文件(*.txt)的名称和内容。
其中,循环的序列中可以使用通配符。forpinabcdedoecho$pdone4.2.7使用循环语句【示例】计算1+2+3+…+100的和。含义:由i=1开始到i<=100,每次i都加1来执行设定的程序段(就是s=+i),当i>100(也就是i=101)时就跳出for循环语句接着往下执行。执行结果:结果为5050。for(i=1;i<=100;i=i+1)dos=s+idoneecho"结果为$s"4.2.7使用循环语句2.使用while语句循环while循环中,当表达式的值为假时停止循环,否则循环将一直进行。语法格式如下:letss=0;i=1whiletest$i-le5doletss=$ss+$ileti=$i+1doneecho"ss=$ss"【示例】用while实现求1+2+3+4+5的和。while表达式do
程序段done4.2.7使用循环语句3.使用until语句循环until语句与while语句正好相反,它会在其测试条件为假时循环执行,语法格式如下:letss=0;i=1untiltest$i-gt5doletss=$ss+$ileti=$i+1doneecho"ss=$ss"【示例】用until实现求1+2+3+4+5的和。until表达式do
程序段done4.2.7使用循环语句4.使用break和continue语句跳出循环【示例】观察程序执行结果。forxin1234doecho"hello"breakecho"bay"done
在shell的循环语句中,可以使用break和continue语句实现跳离现有的循环。break语句用于中断循环的执行,将程序流程移至循环语句结束之后的下一个命令。而continue语句则忽略之后的命令,将程序流程转移至循环开始的地方。break和continue语句都可以加上数字,以指示要跳出的循环数目。4.2.8使用函数在shell脚本中,函数(Function)用于封装可重复使用的代码块,提高脚本的模块化和可读性。1.定义函数定义函数的语法如下:[]中的内容为可选部分,如果函数有返回值,则加入returnint语句。[function]函数名[()]{
程序段[returnint]}4.2.8使用函数2.执行函数函数的使用方法与外部命令一样,只需直接输入函数名即可。语法如下:函数名
3.传递参数函数通过位置参数($1,$2,...)函数处理参数的方式与脚本文件处理命令行参数的方法是一样的。在函数中,$1是指传入函数的第一个参数,$2是指传入函数的第二个参数,同时也可以使用shift命令移动函数参数。【示例】
定义函数exce,输出两个传入的参数。然后,调用函数,给两个参数传递参数。exce(){echo"第一个参数:$1"echo"第二个参数:$2"}
执行函数exce。exce"Hello""World"
运行结果:输出:HelloWorld任务4.3利用输入/输出重定向获取/输出信息03
在Linux中,输入/输出重定向是Shell脚本和命令行操作中非常强大的功能,它允许你控制命令的输入来源和输出目标。通过重定向,你可以将命令的输出保存到文件中,或者从文件中读取输入,甚至可以将输出作为另一个命令的输入。
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用。标准输入:/dev/stdin(键盘),描述符号是0。标准输出:/dev/stdout(屏幕),描述符号是1。错误输出:/dev/stderr(错误消息输出到屏幕上),描述符号是2。4.3.1输出重定向1.将新内容输出到文件并覆盖原内容,格式如下:2.将新内容添加在文件末尾,命令格式为:command>filecommand>>file4.3.1输出重定向重定向命令如表所示。命令说明command>file将输出重定向到filecommand<file将输入重定向到filecommand>>file将输出以追加的方式重定向到filen>file将文件描述符为n的文件重定向到filen>>file将文件描述符为n的文件以追加的方式重定向到filen>&m将输出文件m和n合并n<&m将输入文件m和n合并<<tag将开始标记tag和结束标记tag之间的内容作为输入【示例】(1)使用输入输出重定向实现将“最后更新于:2025.05.30”信息输出重定向到文件logfile中,然后将“确认更新”信息追加到文件末尾,不要覆盖原文件内容。查看该文件的内容,以确认输出效果。1)将“最后更新于:2025.05.30”输出重定向到文件logfile使用“>”。echo"最后更新于:2025.05.30">logfile2)使用cat命令查看logfile文件的内容。
catusers最后更新于:2025.05.303)使用“>>”追加到文件末尾。echo"确认更新">>logfile4)查看logfile文件的内容。
catlogfile最后更新于:2025.05.30
确认更新【示例】
(2)统计logfile文件的行数,将输入重定向到logfile文件。说明:Linux命令可以从文件获取输入,格式为:
command<file操作步骤:wc-l<users2【示例】(3)新建文件file1,将文件权限重定向到file1文件,然后查看file1文件。
[root@localhost~]#touchfile1
[root@localhost~]#ls-a>file1
[root@localhost~]#catfile1
【示例】(4)统计/etc/passwd文件中的行数和字符数,需要用到输入重定向,将命令输入到文件中。【示例】(5)按要求操作。1)创建logfile1文件,将日期重定向到logfile1文件并保存。#touchlogfile1#date
>logfile1
2)将logfile1中的内容重定向到新建的logfile2文件中。#touchlogfile2#cat<logfile1>logfile23)查看logfile2文件的内容。【示例】
4)创建logfile3文件,将在线用户信息写入logfile3文件并保存。#touchlogfile3#who>logfile35)查看logfile3文件的内容。#catlogfile3【示例】
6)将logfile3文件中的内容重定向输出到文件logfile2,并且追加在文件末尾。
#cat<logfile3>>logfile2
图4-5
重定向到logfile2文件的结果7)查看logfile2文件的内容。#catlogfile24.3.2输入重定向
将文件内容作为标准输入使用<
grep"pattern"<input.txt<<(HereDocument):从脚本中读取输入,直到遇到指定的结束标记。bashgrep"pattern"<<EOFThisisalineoftext.Thislinecontainsthepattern.EOF<<<(HereString):将字符串作为标准输入。bashgrep"pattern"<<<"Thisisalineoftextcontainingthepattern."
任务4.4使用Vim编辑04Vim有3种工作模式:命令模式编辑模式底行模式4.4.1Vim的工作模式命令模式命令模式是用来编辑、存盘和退出文件的模式。运行Vim后,默认进入命令模式。此时输入的任何字符都被视为命令,不会在屏幕上显示。命令模式下可以输入命令进行光标的移动,字符、单词、行的复制、粘贴、删除等操作。4.4.1Vim的工作模式4.4.1Vim的工作模式logo命令模式
命令模式是用来编辑、存盘和退出文件的模式。运行Vim后,默认进入命令模式。此时输入的任何字符都被视为命令,不会在屏幕上显示。命令模式下可以输入命令进行光标的移动,字符、单词、行的复制、粘贴、删除等操作。4.4.1Vim的工作模式logo插入模式
编辑模式是用来输入和编辑文件的模式,屏幕上会显示用户的输入信息,按键不是被解释为命令执行,而是作为文本写到用户的文件中。4.4.1Vim的工作模式logo底行模式
状态行被Vim编辑器用来反馈编辑操作结果,通常在文件的底行。错误消息或者提供信息的消息会在状态行中显示出来。4.4.2启动和编辑Vi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床微量泵计算公式原理式原理
- 注册会计师审计中生产存货循环存货计价测试的审计程序
- 陕西省咸阳市2026届高三二模语文试题及参考答案
- 某包装厂产品包装标准细则
- 麻纺车间生产调度办法
- 构网型新能源并网特性及实测
- 某铝业厂原材料入库流程
- 2026中科院生态环境研究中心生态环境研究中心科技和支撑岗位招聘备考题库(补充)及答案详解(必刷)
- 2026黑龙江五大连池市乡镇卫生院招聘医学相关专业毕业生1人备考题库附答案详解
- 企业所得税账务处理流程及案例解析
- 乐鑫2025嵌入式社招跳槽涨薪必刷笔试题及答案
- 出口业务流程内控制度
- 2025年商丘职业技术学院单招综合素质考试试题及答案解析
- 劳动课《凉拌米粉》课件
- 大学生化学实验竞赛试题及答案
- 高标准农田建设劳务分包合同(2篇)
- 更年期妇女健康管理专家共识(基层版)
- GB/T 22517.2-2024体育场地使用要求及检验方法第2部分:游泳场地
- 河南国有资本运营集团有限公司招聘笔试题库2024
- 2024年工程机械维修工(中级)职业鉴定考试题库(含答案)
- 招标代理档案管理制度
评论
0/150
提交评论