LINUXshell基础编程介绍
3月27日 孤行者投稿 【十二】shell编程
12。1Shell环境概述
Shell的作用:命令解释器,翻译官。介于操作系统内核与用户之间,负责解释命令行。
Shell环境的切换:
1)登录Shell
etcshells文件记录了系统支持的有效登录Shell〔rootalex〕catetcshells
2)切换Shell环境
临时切换:直接执行其他Shell程序,示例ksh、zsh等。
更改用户登录Shell:
需修改etcpasswd文件中用户记录的最后一个字段
或执行:usermodsShell程序路径用户名
3)查看缺省的shell〔rootalex〕echoSHELL
binbash
【Bash的历史命令】
1)保存用户曾经执行过的命令操作
存放位置:。bashhistory文件
2)查看历史命令
使用、按键逐条翻看,允许编辑并重复执行
3)执行:history
清除历史命令historyc
4)调用历史命令
!n:执行历史记录中的第n条命令
!str:执行历史记录中最近一次以str开头的命令【这个有用】
设置历史命令能够输出的记录数,修改HISTSIZE参数(默认为1000条)【这个环境变量在etcprofile里】。
Bash的命令别名:为使用频率较高的复杂命令行设置简短的调用名称
存放位置:。bashrc
查看命令别名:格式:alias〔别名〕如:aliassqlplusrlwrapsqlplus
取消已设置的命令别名格式:unalias别名
【注】:。bashrc会被。bashprofile调用,所以也可以将别名写到。bashprofile中。
11。2Shell变量应用
变量的种类:
Shell变量是用来代表某个值的符号名,变量是shell传递数据的一种方法。为灵活管理,Linux系统提供特定参数,有两层意思:
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、依系统环境变化而变化
Shell变量的种类:
1)用户自定义变量:由用户自己定义、修改和使用
2)环境变量:由系统维护,用于设置用户的Shell工作环境,只有极少数的变量用户可以修改
3)预定义变量:Bash预定义的特殊变量,不能直接修改
4)位置变量:通过命令行给脚本传递执行参数
用户自定义变量:
定义新的变量:变量名要以英文字母或下划线开头,区分大小写
格式:变量名变量值
查看变量的值:
格式:echo变量名
在使用变量值时,要在变量名前加上前缀。
示例:〔rootalex〕abchelloworld字符串中有空格要使用引号〔rootalex〕echoabc
helloworld〔rootalex〕unsetabc删除变量
变量值可以作为某个长字符串中的一部分。如果它在长字符串的末尾,就可以利用直接引用形式,如果变量的值须出现在长字符串的开头或中间,避免shell把它与其他字符混在一起,则应该用花括号将变量名括起来。
示例:〔rootalex〕abcchina〔rootalex〕echowww。abc。com
www。china。com〔rootalex〕echowww。abcalex。com
www。。com〔rootalex〕echowww。{abc}alex。com
www。chinaalex。com
从键盘输入内容为变量赋值:
格式:read〔p提示信息〕变量名
结合不同的引号为变量赋值:
双引号:允许通过符号引用其他变量值
单引号‘’:禁止引用其他变量值,视为普通字符
示例〔rootalex〕vialex1。sh!binbashxabcprintfxisnowx。Enternewvalue:xreadxechox
【注】:printf是一个函数
验证:〔rootalex〕shalex1。sh
xisnowabc。Enternewvalue:xyz
xyz
倒引号:将命令执行的结果输出给变量
示例:〔rootalex〕finddevtypep
devinitctl〔rootalex〕lslfinddevtypep
prw1rootroot0013013:02devinitctl
【环境变量】
Shell有两类变量:临时变量和全局变量
临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。
全局变量是环境变量,其值不随shell脚本的执行结束而消失。把一个Shell变量用EXPORT命令导出,就创建了环境变量。它们对于以后在该Shell下执行的所有程序都是可见的。
设置环境变量PATH:
常用命令的目录放在PATH变量中,使用频度高命令的目录排在前面;尽量避免查询大目录,如需设置,将其路径放在PATH路径的最后位置。例:PATHbin:usrbin:etc::。
位置变量(参数)
在执行Shell脚本时,可以定义最多9个位置参数,表示为n,n为19之间的数字。
预定义变量:表示形式如下。
:命令行中位置参数的数量
:所有位置参数的内容
?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
:当前所在进程的进程号
!:后台运行的最后一个进程号
0:当前执行的进程程序名
【Shell中的通配符】:
1)匹配任何字符串。
2)?匹配任何单个字符。
3)〔。。。,〕匹配方括号所限定的任何一个字符【最终是方括符中某单个字符满足要求】
示例:〔ad,x,y〕是匹配单个字符【a、b、c、d、x、y单个字符满足要求】
〔!Z〕是匹配不是Z的所有单个字符
4)转意符,使原字符失去其特殊的含义。
基本的算数运算:计算整数表达式的运算结果
格式:expr变量1运算符变量2。。。〔运算符变量n〕
expr的常用运算符:
加法运算:
减法运算:
乘法运算:
除法运算:
求模(取余)运算:〔rootalex〕a1〔rootalex〕b2〔rootalex〕cexprab运算符号两端要空格〔rootalex〕echoc
3〔rootalex〕cexpr(ab)b运算符号两端要空格,并且()和都要使用转意符〔rootalex〕echoc
6hr使用let命令格式更友好,但有些Shell不支持。〔rootalex〕letcab〔rootalex〕echoc
3〔rootalex〕letc(ab)b〔rootalex〕echoc
6hr【逻辑操作符】:
1)逻辑与:可以把两个命令联系在一起
形式:命令1命令2
功能:先运行命令1,如果成功,才运行命令2,否则不运行命令2
2)逻辑或:命令互补
形式:命令1命令2
功能:先运行命令1,不成功运行命令2,否则不运行命令2。
试比较下面的例子:〔rootalex〕LS;ls〔rootalex〕lsldateuptimeLSls〔rootalex〕lsldateuptimeLSls〔rootalex〕LSdateuptimeLSlsLS不成功,补date
【成组命令】
在shell中可以使用2种方式将若干命令组合在一起,只返回一个逻辑结果。
使用花括号{}
使用圆括号()
以花括号括起来的命令可视为语法上的一条命令。成组命令的执行顺序是根据命令出现的先后次序,由左向右执行。
在使用花括号时在格式上应注意,左括号{后面应有一个空格;右括号}之前应有一个分号;。
在使用(){}也可以包含若干单独占一行的命令。〔rootalex〕vialex2。sh!binbashParentPechoBefore:Parent{ParentCechoAfter:Parent}echoAfter:Parent
验证:〔rootalex〕shalex2。sh
Before:P
After:C
After:C
把{}换成()后〔rootalex〕shalex2。sh
Before:P
After:C
After:P
用圆括号括起来的成组命令是在新的子shell内执行,由于不属于同一进程,因此,在圆括号内的命令不会改变父shell的变量值及工作目录。
12。3编写并执行Shell脚本(一)
【Shell脚本概念】:
用途:完成特定的、较复杂的系统管理任务
格式:集中保存多条Linux命令,普通文本文件
执行方式:按照预设的顺序依次解释执行。
【脚本文件的内容】:
运行环境设置:!binbash这句不是注释,它告诉系统后面的shell要用bash解释
注释信息:以开始的说明性文字,可执行的Linux命令行。
【脚本的可执行权限】:
1)直接执行具有x权限的脚本文件
示例:。repboot。sh
2)使用指定的解释器程序执行脚本内容
示例:bashrepboot。sh、shrepboot。sh
3)通过source命令(或。)读取脚本内容执行
示例:soucerepboot。sh或。Hello。sh
12。4编写并执行Shell脚本(二)
12。4。1条件测试操作
【测试命令test】
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test条件表达式
〔条件表达式〕
常见的测试类型:测试文件状态整数值比较字符串比较逻辑测试
条件测试测试文件
测试文件状态
格式:〔操作符文件或目录〕
常用的测试操作符:d:测试是否为目录(Directory)e:测试目录或文件是否存在(Exist)f:测试是否为文件(File)r:测试当前用户是否有权限读取(Read)w:测试当前用户是否有权限写入(Write)x:测试当前用户是否可执行(Excute)该文件L:测试是否为符号连接(Link)文件
条件测试整数值比较
整数值比较
格式:〔整数1操作符整数2〕
常用的测试操作符
eq:等于(Equal)
ne:不等于(NotEqual)
gt:大于(GreaterThan)
lt:小于(LesserThan)
le:小于或等于(LesserorEqual)
ge:大于或等于(GreaterorEqual)
条件测试字符串比较
字符串比较
格式:〔字符串1字符串2〕
〔字符串1!字符串2〕
〔z字符串〕
常用的测试操作符
:字符串内容相同
!:字符串内容不同,!号表示相反的意思
z:字符串内容为空
条件测试逻辑测试
逻辑测试
格式:〔表达式1〕操作符〔表达式2〕。。。
常用的测试条件的逻辑操作符
!逻辑非(NOT),它放在任意逻辑表达式之前,使原来的表达式由真变假,或者由假变真。
例如:〔!r1〕另一种写法!testr1这句相当于说1的内容非可读才是真
a或:逻辑与,而且的意思,
前后两个表达式都成立时整个测试结果才为真,否则为假
例如:〔fmyfilearmyfile〕myfile即是文件又可读才是真,否则为假
o或:逻辑或,或者的意思
操作符两边至少一个为真时,结果为真,否则结果为假
例如:〔age0oble100〕假如a5整个结果就是真了。有一个为真就是真
()圆括号,把一个逻辑表达式括起来,使之优先得到运算,缺省下a的优先级高于o,()可以改变这种优先级
12。4。2使用if条件语句
通常,if的测试部分是利用test命令或〔〕实现的。其实,条件测试可以利用一般命令执行成功与否来作判断。如果命令正常结束,则表示执行成功,其返回值为0,条件测试为真,如果命令执行不成功,其返回值不等于0,条件测试就为假。如果,各命令表可以由一条或者多条命令组成,那么测试条件以其最后一条命令是否执行成功为准。
单分支:当条件成立时执行相应的操作
双分支:当条件成立、条件不成立时执行不同操作
多分支:相当于if语句嵌套,针对多个条件执行不同操作
示例:〔rootalex〕vifinduser。sh!binbashif〔ne1〕thenechoUsage:pleaseinputsingleusername2exit1fiwhogrep1
【注】:2表示把标准输出和错误输出都定向到终端上〔rootalex〕bashfinduser。shroot一个位置参数
rootpts02016020108:52(192。168。3。100)〔rootalex〕bashfinduser。shrootoracle两个位置参数时没有结果
Usage:finduserusername〔rootalex〕echo?
1exit返回值是1
12。4。3使用循环语句
一)For循环
根据变量的不同取值,重复执行一组命令操作
For语句有三种格式,不同在于in的后面可以跟
For变量in值表
For变量in文件正则表达式
For变量in命令行的位置参数
示例1:for语句使用值表。计算13579的和;并且输出当前目录下的所有。sh文件。〔rootalex〕viforapp1。sh!binbashresult0foriin13579doletresultresultidoneechoresultresultj1forfilein。shdoechoThe{j}thfileis:filejexprj1done
验证〔rootalex〕bashforapp1。sh
示例2:for语句使用位置参数。显示所有位置参数〔rootalex〕viforapp2。sh!binbashj1foriindoechoThe{j}thparameteris:iletjj1done
验证〔rootalex〕bashforapp2。shp1p2
The1thparameteris:p1
The2thparameteris:p2
二)While循环语句
重复测试指定的条件,只要条件成立则反复执行对应的命令操作
示例1:whileapp1脚本:求1到10的和〔rootalex〕viwhileapp1。sh!binbashx1result0while〔xle10〕doletresultresultxletxx1doneechoresult
验证〔rootalex〕shwhileapp1。sh
55hr示例2:
批量添加20个系统用户帐号,用户名依次为stu1、stu2、、stu20,这些用户的初始密码均设置为123456viadduser。sh!binbashi1while〔ile20〕douseraddstuiecho123456passwdstdinstuidevnulliexpri1done
应用示例2:批量删除上例中添加的20个系统用户帐号videluser。shi!binbashi1while〔ile20〕douserdelrstuiiexpri1done
三)Until循环
until语句根据条件执行重复操作
形式:
Until测试条件
do
命令表
done
它与while语句很相似,只是测试条件不同;当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。
示例:
1)添加一个tim用户,并授予密码〔rootalex〕useraddtim〔rootalex〕passwdtim
2)编写untilapp1。sh脚本:等待某个用户(tim)登录,每20秒确定一次〔rootalex〕viuntilapp1。sh!binbashprintfEnterusername:readuseruntilwhogrepuserdevnulldosleep20doneechouserhaveloggedin
3)执行该脚本会一直处于执行状态〔rootalex〕shuntilapp1。sh
Enterusername:tim
4)在主控台让tim登录,则该脚本才会执行完成。
Enterusername:tim
timhaveloggedin
12。4。4CASE语句
CASE语句
根据变量的不同取值,分别执行不同的命令操作,Case语句允许进行多重条件选择。语法形式如下:
case字符串in
正则表达式1)命令
命令;;
正则表达式2)命令
命令;;
正则表达式n)命令
命令;;
esac
使用case语句应注意:
1)每个正则表达式后面可以有一条或多条命令,其最后一个命令必须以;结束,Exit命令后可以不要。
2)正则表达式中可以使用通配符。
3)如果一个正则表达式是由多个模式组成,那么各模式之间应以竖线()隔开,表示各模式是或的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。
4)各正则表达式应是唯一的,不应重复出现。并且要合理安排正则表达式的出现顺序。例如,不应将作为头一个正则表达式。因为与任何字符串匹配,它若第一个出现,就不会再检查其他表达式了。
5)Case的退出(返回)值是整个结构中最后执行的那个命令。若没有执行任何命令,则退出值为零。
示例:〔rootalex〕vicaseapp。sh!binbashnamebasename0。shcase1insstart)echostart。。。;;stop)echostop。。。;;reload)echoreload。。。;;)echoUsage:name〔startstopreload〕exit1;;esacexit0
【注】:basename这里就是取得不带路径的执行的shell脚本的名称,扩展名。sh也会去掉。
例如:basenameroottestfinduser。sh。sh
finduser
验证〔rootalex〕shcaseapp。shs
start。。。〔rootalex〕shcaseapp。shstart
start。。。〔rootalex〕shcaseapp。shstop
Stop。。。〔rootalex〕echo?
0〔rootalex〕shcaseapp。shabc
Usage:caseapp〔startstopreload〕〔rootalex〕shcaseapp。sh
Usage:caseapp〔startstopreload〕〔rootalex〕echo?
1hrSHIFT语句:
位置参数最多不能超过9个,即19。如果实际给定的命令行参数多于9个,就需要用shift命令移动位置参数。每执行一次shift命令,就把位置参数向左移一位,新的1的值是原来2的值,新2是原来3的值,依次类推。
Shift命令不能把0移走。Shift命令可以带有一个整体作为参数。如果没有带参数默认是1
示例:〔rootalex〕vishiftapp1。sh!binbashloop0while〔ne0〕doecho1done
修改权限,让其可执行〔rootalex〕chmoduxshiftapp1。sh
执行〔rootalex〕。shiftapp1。shp1p2p3
结果:死循环,而不是将所有的参数输出后结束。!binbashloop0while〔ne0〕doecho1shiftdone〔rootalex〕。myapp1。shp1p2p3
p1
p2
p3。。。
如果改成shift2如何
【循环控制语句】:break语句
在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体后的语句
continue
在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环
Shell函数应用:
在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数,合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率。
应用示例:
在脚本中定义一个加法函数,名叫adder,用于计算2个整数的求和
调用该函数计算(1234)、(56789)的和〔rootalex〕viaddderfun。sh!binbashadder(){echoexpr12}adder1234adder56789
验证〔rootalex〕shadderfun。sh
46hr845hrtheend!!!
jackman共筑美好!
投诉 评论
留给比亚迪的时间还有三年这是一场危险的游戏。文华商韬略张静波2011年,比亚迪遭遇了创业以来最大一次挫败。那年9月,中国汽车产业发展论坛上,它成了众人的炮轰对象,有专家愤慨道:政府对……
一边看三十五号03组卫星发射直播,一边看独行月球,啥感觉?北京时间7月29日21时28分,中国在西昌卫星发射中心使用长征二号丁运载火箭,成功将遥感三十五号03组卫星发射升空。卫星顺利进入预定轨道,发射任务获得圆满成功。在这样的一……
47岁知名影后近照曝光!素颜出镜有气质,面容白嫩长发飘逸显年47岁梅婷近照曝光7月27日。有网友在某社媒上发现了影后梅婷的身影,久未露面的梅婷,突然现身某酒吧,与朋友聚会喝酒。其中,有一位胡须邋遢的男演员,也在其中。……
学会自己治愈自己又是一个周末,可以放下工作,翻开书本度过一个宁静的早晨了。今天看到路遥在《平凡的世界》里写的这样一句话,人生啊,是这样不可测,没有永恒的痛苦,也没有永恒的幸福,生活像流水一般,……
口碑好的华为手机推荐,品控在线几乎零差评华为作为国产率最高的手机,一直以来都是中国的榜样,但这也并不代表所有华为的产品都值得入手,今天我就来推荐三款入股不亏的华为手机第一款:华为Nova9处理器:骁龙778G影像:5……
2022年戛纳电影节红地毯上的所有最佳造型现在颁奖季已经结束,很容易陷入时尚低谷。值得庆幸的是,每年春天,戛纳电影节都会以可与大都会和奥斯卡相媲美的红地毯来拯救我们。年复一年,戛纳电影节推出了一些最令人瞠目结舌、……
核心玩法缺失,模式数量来凑像素危城《像素危城》的美漫像素风和武器战斗系统,是其两大闪光点。但就整体体验来说,对爽感的强调,导致危机感缺失,与其说是末日生存,不如说是丧尸版传奇,更适合喜欢刷刷刷的休闲玩家,而非向……
科普午睡的三个误区正确的午睡方式具有消除困乏、增强记忆力、预防冠心病、调节心情、保护心脏、提高免疫力等好处,但错误的午睡方法会危害我们的健康。午睡有三个误区第一就是想睡多久就睡多久,很多人……
从世界第一到98,31岁刘诗雯转型成谜,因三次丢冠被国乒彻底刘诗雯未来何去何从?目前随着2022年WTT欧洲系列赛的结束,国乒女队的格局进一步明朗化,那就是从原先的三人竞争变成了陈梦,孙颖莎王曼昱和王艺迪4人领先的局面。由于目前这4人正……
冬季蔬菜品种冬天最该吃的当季蔬菜冬季时令蔬菜有哪些时令蔬菜是指那些根据蔬菜生长特点,在自然环境条件下,通过人工栽培管理或野生,采收后新鲜上市的蔬菜。相比反季节蔬菜,时令蔬菜营养更丰富。冬天该吃哪些……
人性密码第五篇人性不可直视一味的学习,不但不会让人进步,还会让人退步。光学习并没有什么卵用。人只有一天到晚的实干才有用。所以大部分人学习,只是为了逃避现实、缓解焦虑。想当作家,天天读书学习没有用。……
詹姆斯和湖人达成两年9710万提前续约,总薪水历史第一ESPN记者Woj报道,勒布朗詹姆斯的经纪人里奇保罗告知ESPN,湖人和詹姆斯达成了两年9710万美元的提前续约合同。合同包括202425赛季的球员选项,新合同起薪为46……