当前位置: 首页 > 科技观察

Linux-shell编程入门-适合初学者

时间:2023-03-16 13:07:48 科技观察

一、变量的使用1.变量名定义变量时,变量名不加美元符号($,PHP语言中变量必须加),如:your_name="yikoulinux"注意,变量名和等号之间不能有空格,这在你熟悉的任何编程语言中可能都不是这样。同时,变量名的命名必须遵循以下规则:命名只能使用英文字母、数字和下划线,首字符不能以数字开头。中间不能有空格,可以使用下划线(_)。不能使用标点符号。bash中的关键字不能使用(使用help命令查看保留关键字)。变量名通常是大写的。有效的Shell变量名示例如下:RUNOOBLD_LIBRARY_PATH_varvar2无效的变量名:?var=123user*name=runoob2。常用变量LinuxShell中的变量分为:系统变量和用户自定义变量。1、系统变量:、PWD、、USER等例如:echo$HOME等2、用户自定义变量:定义变量:variable=value2)显示当前shell中的所有变量:set3)unsetvariables:unset变量声明staticvariable:readonlyvariable,注意:不能unset将命令的返回值赋值给变量(重要)除了显式直接赋值外,还可以使用语句给变量赋值,如:1)A=ls-labackticks,运行里面的命令,返回结果给变量A2)A=$(ls-la)$相当于backticks3)forfilein`ls/etc`orforfilein$(ls/etc)上面的语句将/etc目录的文件名循环出来。3、例1:含义如下:定义一个名为name的变量,值为linux输出变量名value定义一个名为number的变量,初始值为22输出变量number的值,直接用变量String输出双引号输出带变量的字符串使用单引号输出带变量的字符串使用大括号{&变量名}声明字符串中的变量注意:以上变量为临时变量。当终端关闭时,变量将消失。例2:删除一个变量,查看指定变量unsetname删除变量name,查看name变量2、字符串操作在做shell批处理程序的时候,经常会涉及到字符串相关的操作。命令语句有很多,如:awk、sed可以对字符串进行各种操作。其实shell内置了一系列的操作符,可以达到类似的效果。众所周知,使用内部算子会省去启动外部程序的时间,所以速度会非常快。1、字符串操作(长度、读取、替换)说明:“*$substring”可以是正则表达式。2.字符串操作示例a)计算字符串长度root@ubuntu:/home/peng#test='Ilovechina'root@ubuntu:/home/peng#echo${#test}12${#variablename}得到字符串lengthb)截取字符串root@ubuntu:/home/peng#test='Ilovechina'root@ubuntu:/home/peng#echo${test:5}echinaroot@ubuntu:/home/peng#echo${test:5:10}echinaroot@ubuntu:/home/peng#root@ubuntu:/home/peng#echo${test:4:10}vechina${变量名:开始:长度}获取子字符串c)字符串删除root@ubuntu:/home/peng#test='c:/windows/boot.ini'root@ubuntu:/home/peng#echo${test#/}c:/windows/boot.iniroot@ubuntu:/home/peng#echo${test#*/}windows/boot.iniroot@ubuntu:/home/peng#echo${test##*/}boot.iniroot@ubuntu:/home/peng#echo${test%/*}c:/windowsroot@ubuntu:/home/peng#echo${test%%/*}c:${变量名#substring正则表达式}从字符串开头开始substring,删除匹配的表达式。${变量名%子串正则表达式}从字符串末尾开始配备子串,删除匹配的表达式。注意:${test##*/}、${test%/*}分别是最简单的获取文件名或目录地址的方式。d)字符串替换root@ubuntu:/home/peng#test='c:/windows/boot.ini'root@ubuntu:/home/peng#echo${test/\//\\}c:\windows/boot.iniroot@ubuntu:/home/peng#echo${test//\//\\}c:\windows\boot.ini${variable/find/replacevalue}一个“/”表示替换第一个,“//”表示全部替换,当搜索中出现“/”时,请加上转义符“\/”表示。注意:字符串的位置从0开始,-1表示字符串的最后位置;截取字符串时左闭右开,从左边位置开始到右边位置结束,不包括右边的s位置。3、脚本的创建和执行Shell脚本不能作为正式的编程语言使用,因为它们运行在Linuxshell中,所以称为shell脚本。实际上,shell脚本是命令的集合。我们通常把所有的操作都记录在一个文件中,然后调用文件中的命令,这样就可以一步完成操作。一般shell脚本都放在/usr/local/sbin目录下。1)shell脚本是在linux系统中创建的。Shell脚本(bashshell程序)通常在编辑器(如vi/vim)中编写,由unix/linux命令、bashshell命令、程序结构控制语句和注释等组成,推荐使用vim编辑器.2)脚本的开头(第一行)标准的shell脚本的第一行会指明哪个程序(解释器)将执行脚本中的内容。在Linuxbash编程中,一般是:#!/bin/bash或#!/bin/sh<==255个字符,“#!”一开始也被称为幻数。执行bash脚本时,内核会根据“#!”后的解释器来决定使用哪个程序。脚本中的内容,注意:这一行必须是每个脚本最前面的第一行,如果不是第一行就是脚本注释行,比如下面的例子。root@ubuntu:/home/peng#cattest1.sh#!/bin/bashecho"scajystart"#!/bin/bash<==这里写的是注释#!/bin/shecho"scajyen:"sh和bashroot@ubuntu:/home/peng#ls-l/bin/shlrwxrwxrwx1rootroot4Sep212015/bin/sh->bash提示:sh是bash的软连接,这里推荐使用标准写法#!/bin/bashBash是GNU/Linux的默认shell,与Bourneshell(sh)兼容,Bash使用了Kornshell(Ksh)和Cshell(csh)的特性。符合IEEEPOISIXP10003.2/ISO9945.2外壳和工具标准。Centos和redhatlinux下默认的shell都是bash。因此,在编写shell脚本时,我们不需要在脚本的开头添加#!/bin/bash。但是如果当前的shell不是你默认的shell,比如tcsh,你一定要写#!许久。否则脚本文件只能执行一组命令,不能使用shell的内置命令。建议读者养成习惯。不管是什么脚本,最好在开头加上语言标记,这在后面的shell编程规范中会有说明。再次提到。如果在脚本的开头没有指定解析器,则使用相应的解释器来执行脚本。例如:bashtest.sh3)脚本注释在shell脚本中,(#)#后面的内容表示注释,用于对脚本进行注释。注释部分不会被执行,只是给人看,注释可以在一行,也可以跟在脚本命令后面跟命令在同一行。开发脚本的时候,如果没有注释,别人就很难理解脚本是干什么的,时间长了就会忘记。因此,我们应该尽量养成为自己所做的工作(脚本等)写注释的习惯,不仅是为了方便别人,也是为了自己方便。否则,写完剧本后,可能不记得剧本的用途,大量宝贵的时间会浪费在重新阅读上。也不利于团队合作。4)比如新建一个文件first.sh,将以下信息复制到文件中:#cdusr/local/sbin#vimfirst.sh#!/bin/bash##thisismyfirstshellscript#wirtenbyaLinux2021.5.3dateecho"Helloworld"shell脚本通常以.sh是执行脚本的后缀名。可以使用以下方法:#shfirst.sh#bashfirst.sh#./first.sh#./first.sh会报权限不够:#chmod+xfirst.sh四、环境变量使用1.详解知识点讲解1、LinuxShell中的变量分为:系统变量和用户自定义变量。2、系统变量:、PWD、、USER等例如:echo$HOME等3、用户自定义变量:1)定义变量:variable=value2)显示当前shell中的所有变量:set3)undovariables:Unsetvariable4)声明静态变量:readonlyvariable,注意:不能unset4.变量定义规则1)变量名可以由字母、数字和下划线组成,但不能以数字开头。2)等号两边不能有空格3)变量名一般大写5.将命令的返回值赋值给变量(关键点)1)A=`ls-la`backtick,运行命令里面,把结果返回给变量A2)A=$(ls-la)相当于反引号6.设置环境变量的基本语法:exportvariablename=variablevalue(功能说明:输出shell变量作为环境变量)源配置文件(功能说明:让修改的配置信息立即生效)echo$变量名(功能说明:查询环境变量的值)2.查看环境变量HOME和PATH的值的详细操作:root@ubuntu:/home/peng#echo$HOME/rootroot@ubuntu:/home/peng#echo$PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin查看环境变量windows系统中的les查看环境变量PATH中的所有路径脚本路径安装示例方法一:修改环境变量:在PATH中添加指定的“软件安装”目录:root@ubuntu:/home/peng/yikou#pwd/home/peng/yikouroot@ubuntu:/home/peng/yikou#lsa.shroot@ubuntu:/home/peng/yikou#sha.shSunMay217:00:14PDT2021Helloworldroot@ubuntu:/home/peng/yikou#exportPATH=$PATH:/home/peng/yikou/root@ubuntu:/home/peng/yikou#echo$PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin:/home/peng/yikou/root@ubuntu:/home/peng/yikou#a.shbash:/home/peng/yikou/a.sh:权限不足root@ubuntu:/home/peng/yikou#chmod777a.shroot@ubuntu:/home/peng/yikou#a.shSunMay217:01:34PDT2021Helloworld方法二:修改环境变量配置文件,使修改后的环境变量永久生效vim/etc/bash.bashrcsource.bash.rc使配置文件重新生效关闭终端,打开,重新输入:sh仍然有效执行root@ubuntu:/home/peng/#a.shSunMay217:10:00PDT2021Helloworld五、数学运算1、知识点运算符使用语法详解:expr运算符对照表运算符含义2、运算详解1.比较大小,只能比较整数,需要加空格,linux保留关键字必须转义root@ubuntu:/home/peng/yikou#num1=30root@ubuntu:/home/peng/yikou#num2=50root@ubuntu:/home/peng/yikou#expr$num1\>$num20查看上一条命令是否执行成功:成功返回0s、其他失败2、小于、小于等于、大于等于expr$num1\<$num2expr$num1\<=$num2expr$num1\>=$num23。运算加减乘除#addnum1=17num2=5expr$num1+$num2#subtractnum3=`expr$num1+$num2`echo$num3expr$num1-$num2#multiplyexpr$num1\*$num2expr$num1/$num2#获取余数expr$num1%$num2需要注意:两个括号的计算方式必须赋值,否则会报错取参数bashshell使用位置参数变量(positionalparameters)来存储所有输入的参数在命令行上,包括程序名称。其中,表示程序名,1表示第一个参数,9表示第一个参数,9表示第九个参数。如果参数个数超过9个,变量必须这样表示:,{11},...#!/bin/bash#author:一口Linuxfor((count=1;count<=$1;count++))doechoThenumberis$count.done执行结果:修改脚本如下:echo$1,$2,$3,$4执行结果如下:2读程序名首先想到的是使用,但是0获取的文件名包含./和路径等前缀信息,如下:echoThecommandenteredis:$0#Run:./#Output:Thecommandenteredis:./14.sh如果只想获取文件名不带./,可以使用basename命令:name=`basename$0`echoThecommandenteredis:$name#Run:./#Output:Thecommandenteredis:14.sh3特殊变量$#表示命令行参数个数:#!/bin/bash#作者:一口Linuxparams=$#echoThenumberofparamsis:$paramsfor((i=1;i<=params;i++))doechoTheparamis:$idone执行结果如果想得到所有的参数,当然可以用#and循环逐一遍历。还可以使用下面两个特殊变量:*将所有命令行参数作为一个整体存储,$@将命令行中以空格分隔的参数单独存储,如下:#!/bin/bash#author:一口Linuxcount=1forparamin"$*"doecho"\$*parameter$count=$param"count=$[$count+1]donecount=1forparamin"$@"doecho"\$@parameter$count=$param"count=$[$count+1]done4基本读取读取命令接受来自键盘或文件描述符的输入数据,并将其存储在指定变量中。选项:-p:指定读取值时的提示;-t:指定读取值时的等待时间(秒)。如未在规定时间内进入,则不再等待。.-n:设置允许输入的字符数参数variable:指定读取值的变量名操作详解1..例1#!/bin/bash#author:一口Linux#testingthereadoptionread-p"Pleaseenteryourname:“nameecho”你好$名字。执行结果二例二在读命令中,输入的数据可以根据需要保存在多个变量中。如果指定的变量比较小,那么最后一个变量将包含所有剩余的输入,如下所示:$val2"echo"$val3"执行结果:3、综合示例提示用户输入一个正整数num,然后计算出1+2+3+...+num的值;需要判断num是否为正整数。如果不符合要求,应重新运行并输入。思路:expr只能对整数进行计算,直接用expr和一个整数计算$?用expr$num1>0判断是否为整数#!/bin/bash#author:一口Linuxwhiletruedoread-p"pleaseinputpositivenumber:"num#判断数字是否为整数expr$num+1&>/dev/nullif[$?-eq0];then#判断整数是否大于0,大于0则返回1if[`expr$num\>0`-eq1];then#echo"yes,positivenumber"#$sum没有赋值,默认为0foriin`seq0$num`dosum=`expr$sum+$i`doneecho"1+2+3+...+$num=$sum"#执行计算需要退出exitfifiecho"error,inputenlegal"continueddonetest:7.关系运算符有时候我们需要比较两个数之间的大小关系,这时候就需要用到关系运算符了。关系运算符只支持数值运算,不支持字符运算。一、知识点详解shell语言支持以下关系运算符:-eq:检查两个数是否相等,相等则返回真。-ne:检查两个数是否不相等,相等则返回真。-gt:检查左边的数是否大于右边的数,如果是则返回真。-lt:检查左边的数是否小于右边的数,如果是则返回真。-ge:检查左边的数是否大于等于右边的数,如果是则返回true。-le:检查左边的数是否小于等于右边的数,如果是则返回true。二、操作详解#!/bin/bash#author:一口Linuxa=10b=20if[$a-gt$b]thenecho"agreatthanb"elseecho"anotgreatthanb"fi八、字符串运算符一、知识详解points=比较两个字符串是否相等!=比较两个字符串是否不相等-z检测字符串长度是否为零-n检测字符串长度是否不为零$charactername变量有负值(empty),yesReturnsTrue,doesnotreturnFalse2.操作详解#!/bin/bash#作者:满口Linux###本脚本主要用于字符串运算符if[!$1]thenecho"第一个参数是空的“回声”********************************************************************“回声”******************************************************************“回声”**************执行用例格式For:sh$0variable1variable2***************"echo"********************************************************************“回声”**********************************************************************"breakelseif[!$2]thenecho"第二个参数为空"echo"**************************************************************************“回声”*********************************************************************"echo"***************执行用例格式为:sh$0variable1variable2***************"回声?“********************************************************************“回声”***********************************************************************”断言###1。检查两个字符串是否相等;if[$1=$2]thenecho"这是第一个判断语句"echo"变量1等于变量2"elseecho"这是第一个判断语句"echo"变量1不等于变量2"fi###2,检测两个字符串是否不相等;if[$1!=$2]thenecho"这是第二个判断语句"echo"变量1不等于变量2"elseecho"这是第二个判断语句"echo"表示变量1等于变量2"fi###3。检查字符串长度是否为0if[-z$1]thenecho”这是第三条判断语句“echo”变量1字符串长度为0“elseecho”这是第三条判断语句“echo$1fi###4.检查字符串长度是否不为0if[-n$2]thenecho"这是第四条判断语句"echo"变量2字符串长度不为0"echo$2elseecho"这是第4条判断语句"echo"变量2字符串长度is0"fi###5,检查字符串是否不为空if[$1]thenecho"这是第五条判断语句"echo"变量1不为空"elsecho"这是第五条判断语句"echo"变量1isempty"fififi测试结果:9.shell文件和目录常用操作的几个例子1.解压路径的目录和文件名解压目录:dirname$path解压文件名:basename$path2.批量重命名带空格的文件functionprocessFilePathWithSpace(){find$1-name"**"|whilereadlinedonewFile=`echo$line|sed's/[][]*/_/g'`mv"$line"$newFilelogInfo"mv$line$newFile$?"done}3.遍历文件内容cat/tmp/text.txt|whilereadlinedoecho$linedone4。如果该文件不存在,则创建一个文件[-f$logFile]||touch$logFile5。递归遍历目录functiongetFile(){forfilein`ls$1`doelement=$1"/"$fileif[-d$element]thengetFile$elementelseecho$elementfidone}6.清空文件内容cat/dev/null>$filePath公众号.