您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 常用shell脚本指令
常用shell脚本命令1、显示包含文字aaa的下一行的内容:sed-n'/aaa/{n;p;}'filename2、删除当前行与下一行的内容:sed-i'/aaa/{N;d;}'filename3、删除当前行与下两行的内容:sed-i'/aaa/{N;N;d;}'filename依次类推,删除三行,则为{N;N;N;d;},分析知:N为next4、得出以空格为分割的字符串中单词的个数,即统计个数:awk'{printNF}'如显示字符串VALUE中的单词个数,其中VALUE为:aaabbbcccdddeef则执行echo$VALUE|awk'{printNF}'后的结果为65、在linux中建立一个文件与另一文件的链接,即符号链接ln-s/var/named/chroot/etc/named.confnamed.conf这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf的符号链接。即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf,这时用ll命令查看的结果如:lrwxrwxrwx1rootroot32Mar2212:29named.conf-/var/named/chroot/etc/named.conf注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。所以需对实际文件进行删除操作。6、显示指定字符范围内的内容:如:显示文件test.txt中字符#testbegin与#testend之间所有的字符sed-n/#testbegin/,/#testend/ptest.txt或awk/#testbegin/,/#testend/test.txt在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.1.单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。请看如下例子:[root@linux~]#name=HaHa[root@linux~]#echo$nameHaHa[root@linux~]#myname=$nameiswow[root@linux~]#echo$mynameHaHaiswow[root@linux~]#myname='$nameiswow'[root@linux~]#echo$myname$nameiswow从上面例子可以看出,使用了单引号的时候,那么$name只是普通字符,直接输出而已!2.逐行读取文件使用for循环来读取文件forlinein`catfile.txt`doecho$linedone注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件使用while循环读取文件catfile.txt|whilereadlinedoecho$linedone或者:whilereadlinedoecho$linedonefile.txt注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件3.bashshell脚本中常用隐含变量$0当前执行的脚本或者命令名称$1-$9代表参数的位置.举例$1代表第一个参数.$#脚本调用的参数的个数$@所有参数的内容$*所有参数的内容$$当前运行脚本的进程号$?命令执行后返回的状态$!后台运行的最后一个进程号注意:$?用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。$*和$@如果输出是一样的,但是在使用for循环,在使用双引号()引用时$*会输出成一个元素而$@会按照每个参数是一个元素方式输出请看测试例子#cattest.sh#!/bin/shecho'$@output.....'foriin$@doecho$idoneecho'$*output....'foriin$*doecho$idone输出结果#shtest.shabcd$@output.....abcd$*output....abcd从输出结果可以看出$*输出是一行而$@输出则是四行4.变量内容的删除与替换我们在一些情况下,需要对变量中的字符窜进行查找删除或者替换,就需要使用下表列出的方法变量设定方式说明${变量#关键字}若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除${变量##关键字}若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除${变量%关键字}若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除${变量%%关键字}若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除${变量/旧字串/新字串}若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代${变量//旧字串/新字串}若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代举例如下(删除字符窜中的某个字符):[root@linux~]#exporttest_str=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin[root@linux~]#echo${test_str#/*kerberos/bin:}/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin5.变量条件测试赋值在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.变量设定方式str未定义str为空字串str已赋值为非空字串var=${str-expr}var=exprvar=var=$strvar=${str:-expr}var=exprvar=exprvar=$strvar=${str+expr}var=var=exprvar=exprvar=${str:+expr}var=var=var=exprvar=${str?expr}expr输出至stderrvar=var=$strvar=${str:?expr}expr输出至stderrexpr输出至stderrvar=$strvar=${str=expr}var=exprvar=var=$strvar=${str:=expr}var=exprvar=exprvar=$str举例如下:[root@linux~]#test_name=[root@linux~]#test_name=${test_name-root}[root@linux~]#echo$test_name==因为test_name被设定为空字符窜!所以当然还是保留为空字符窜![root@linux~]#test_name=${test_name:-root}[root@linux~]#echo$test_nameroot==加上‘:’后若变量内容为空或者是未设定,都能够以后面的内容替换!基本上这种变量的测试也能够透过shellscript内的if...then...来处理,不过通过上述提及的简单的方法来测试变量,是程序看起来更精简一些!6.shell中分隔符:变量IFS使用shell脚本中,如果使用for循环一个字符窜的话,默认使用空格来分割字符窜.还有前面所提到的使用for循环逐行读取文件内容时候,文件行中如果有空格的话输出的结果也会变乱.这个时候使用IFS变量来设置特定的字符窜分割符来,达到输出正确的目的.默认情况下IFS是使用spacetabnewline,空格\t\n来作为默认的分割符的.我们将前面使用for逐行读取文件的例子改进下就可以输出正确了,请看下面#!/bin/bashIFS_old=$IFS#将原IFS值保存,以便用完后恢复IFS=$’\n’#更改IFS值为$’\n’forlinein`catfile.txt`doecho$linedonefile.txt文件内容如下[root@linux]$catfile.txtsdfsdfsdfsdfssssssssssssssssssssssssdfsdfsdfsdfsdf执行测试程序输出结果如下(正确输出)[root@linux]$shtest.shsdfsdfsdfsdfssssssssssssssssssssssssdfsdfsdfsdfsdf如果未设置IFS变量,使用默认的IFS变量值,输出结果如下[root@linux]$shtest.shsdfsdfsdfsdfssssssssssssssssssssssssdfsdfsdfsdfsdf从以上测试程序输出结果,可以根据自己的需求来设定IFS变量,在举一个例子如下:whileIFS=:readuserNamepassWorduserIDgroupIDgeCoshomeDiruserShelldoecho$userName-$homeDirdone/etc/passwd7.shell数组的使用数组赋值方式:(1)array=(var1var2var3...varN)(2)array=([0]=var1[1]=var2[2]=var3...[n]=varN)(3)array[0]=var1arrya[1]=var2...array[n]=varN计算数组元素个数或者长度:(1)${#array[@]}(2)${#array[*]}了解了数组基础语法,举例说明,请看:#!/bin/bashNAMESERVERS=(ns1.)#得到数组长度tLen=${#NAMESERVERS[@]}#循环数组for((i=0;i${tLen};i++));doecho${NAMESERVERS[$i]}done在看一个复杂一点的例子,将文件内容读取到数组中:#!/bin/bash#设置IFS将分割符设置为换行符(\n)OLDIFS=$IFSIFS=$'\n'#读取文件内容到数组fileArray=($(catfile.txt))#restoreitIFS=$OLDIFStLen=${#fileArray[@]}#循环显示文件内容for((i=0;i${tLen};i++));doecho${fileArray[$i]}done8.逻辑判断条件测试文件属性的判断操作符测试结果-efilename文件存在返回1,否则返回0-rfilename文件可读返回1,否则返回0-wfilename文件可写返回1,否则返回0-xfilename文件可执行返回1,否则返回0-ofilename文件属于用户本人返回1,否则返回0-zfilename文件长度为0返回1,否则返回0-ffilename文件为普通文件返回1,否则返回0-dfilename文件为目录文件时返回1,否则返回0举例如下,测试文件是否存在:#!/bin/bashechocheckstheexistenceofthemessagesfile.echo-nChecking...if[-f/var/log/messages];thenecho/var/log/messagesexists.fiechoecho...done.字符串比较操作符比较结果str1=str2当两个字串相等时为真str1!=str2当两个字串不等时为真-nstr1当字符串的长度大于0时为真-z
本文标题:常用shell脚本指令
链接地址:https://www.777doc.com/doc-5732821 .html