今天将对shell脚本的知识进行一个复习。
shell基础
#shell基础就不讲了,随便搜搜博客看看几篇文章啥都知道了,直接上干货吧。
shell命令实战
知识点1:
/etc/profile/etc/bashrc系统级文件
~/.bashrc~/.bash_profile用户级文件
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
[root
foundation0/]#cat/etc/profile#/etc/profile#Systemwideenvironmentandstartupprograms,forloginsetup#Functionsandaliasesgoin/etc/bashrc#ItsNOTagoodideatochangethisfileunlessyouknowwhatyou#aredoing.Itsmuchbettertocreateacustom.shshellscriptin#/etc/profile.d/tomakecustomchangestoyourenvironment,asthis#willpreventtheneedformerginginfutureupdates./etc/bashrc:为每一个运行bashshell的用户执行此文件.当bashshell被打开时,该文件被读取.
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:该文件包含专用于你的bashshell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.
[root
foundation0/]#cat~/.bash_profile#.bash_profile#Getthealiasesandfunctionsif[-f~/.bashrc];then.~/.bashrcfi#UserspecificenvironmentandstartupprogramsPATH=$PATH:$HOME/binexportPATH[rootfoundation0/]#cat~/.bash.bash_history.bash_logout.bash_profile.bashrc[rootfoundation0/]#cat~/.bashrc#.bashrc#Userspecificaliasesandfunctionsaliasrm=rm-ialiascp=cp-ialiasmv=mv-i#Sourceglobaldefinitionsif[-f/etc/bashrc];then./etc/bashrcfi知识点2:
tee是保存到别的文件(覆盖),tee-a是追加到别的文件tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令:
[root
foundation0/]#cat/etc/shadowtee/tmp/file{1,2}
知识点3:
#Touchchao\kaidi创建带有空格的文件名。
[root
foundation0/]#touchchao\kaidi[rootfoundation0/]#lsgrepchao\kaidichaokaidi
知识点4:
Echo带有颜色的文字输出#echo-e“\e[1;31mThisistext.\e[0m”带有背景色的输出:#echo-e“\e[1;41mThisistext.\e[0m”注意:可以尝试下结尾不加\e[0m,看看会是怎样的效果,此台一般用于脚本结果的突出显示。
知识点5:
测试IP地址连通性
#!/bin/bashRead-p“pleaseinputaip:”ipPing$ip/dev/nullIf[$?-eq0];thenEcho“$ipisup”Else:Echo“$ipisdown”这是最简单的,可以配合for循环对ping测试次数作以限制
知识点6:
export定义环境变量为全局
#vi/etc/profile在里面加入:exportPATH="$PATH:/opt/au_rm/build_tools/bin"让环境变量立即生效需要执行如下命令:#source/etc/profile
知识点7:
监控CPU/内存/硬盘使用率
#!/bin/shfree-m
awkNR==2{printf"MemoryUsage:%s/%sMB(%.2f%%)\n",$3,$2,$3*/$2}df-h
awk$NF=="/"{printf"DiskUsage:%d/%dGB(%s)\n",$3,$2,$5}top-bn1
grepload
awk{printf"CPULoad:%.2f\n",$(NF-2)}
知识点8:
Shell循环新建用户并设置密码
#!/bin/sh#设置变量name接收第一个参数(要创建的用户名),$n表示第n个参数,且=两边不能有空格name=$1#设置变量pass接收第二个参数(要为其设置的密码)pass=$2#echo语句会输出到控制台,${变量}或者$变量表示变量代表的字符串echo"youaresettingusername:${name}"echo"youaresettingpassword:$passfor${name}"#添加用户$name,此处sudo需要设置为无密码,后面将会作出说明sudouseradd$name#如果上一个命令正常运行,则输出成功,否则提示失败并以非正常状态退出程序#$?表示上一个命令的执行状态,-eq表示等于,[也是一个命令#iffi是成对使用的,后面是前面的倒置,很多这样的用法。if[$?-eq0];thenecho"user${name}iscreatedsuccessfully!!!"elseecho"user${name}iscreatedfailly!!!"exit1fi#sudopasswd$name会要求填入密码,下面将$pass作为密码传入echo$pass
sudopasswd$name--stdin/dev/nullif[$?-eq0];thenecho"${name}spasswordissetsuccessfully"elseecho"${name}spasswordissetfailly!!!"fi
知识点9:
测试shell脚本语法
命令格式#sh-n***.sh
若是没有异常输出,证明脚本没有明显的语法问题。
模拟运行脚本程序
命令格式#sh-vx***.sh
知识点10:
awk有3个不同版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是AWK的GNU版本。
[root
foundation0~]#last-n5awk{print$1}rootrootroot(unknownreboot
awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,1表示第一个域,1表示第一个域,1表示第一个域,n表示第n个域。默认域分隔符是"空白键"或“[tab]键”,所以$1表示登录用户,$3表示登录用户ip,以此类推。
搜索/etc/passwd有root关键字的所有行
#awk-F:/root//etc/passwdroot:x:0:0:root:/root:/bin/bash例如找root开头的:awk-F:/^root//etc/passwd
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
#awk-F:/root/{print$7}/etc/passwd/bin/bash
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC命令行参数个数ARGV命令行参数排列ENVIRON支持队列中系统环境变量的使用FILENAMEawk浏览的文件名FNR浏览文件的记录数FS设置输入域分隔符,等价于命令行-F选项NF浏览记录的域的个数NR已读的记录数OFS输出域分隔符ORS输出记录分隔符RS控制记录分隔符
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
#awk-F:{print"filename:"FILENAME",linenumber:"NR",columns:"NF",linecontent:"$0}/etc/passwdfilename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bashfilename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/shfilename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/shfilename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
知识点11:sed关键字
替换文本中的字符串:
seds/book/books/file
-n选项和p命令一起使用表示只打印那些发生替换的行:
sed-ns/test/TEST/pfile
直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books:
sed-is/book/books/gfile
使用后缀/g标记会替换每一行中的所有匹配:
seds/book/books/gfile
当需要从第N处匹配开始替换时,可以使用/Ng:
echosksksksksksk
seds/sk/SK/2gskSKSKSKSKSKechosksksksksksk
seds/sk/SK/3gskskSKSKSKSK
删除空白行:
sed/^$/dfile
删除文件的第2行到末尾所有行:
sed2,$dfile
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:
sed/test/rfilefilename
在example中所有包含test的行都被写入file里:
[root
foundation0tmp]#sed-n/ntp/wfilefile2[rootfoundation0tmp]#lsfilefile[rootfoundation0tmp]#cat-bfile1ntp:!!:::::::将thisisatestline追加到以test开头的行后面:
sed/^test/a\thisisatestlinefile
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:
[root
foundation0tmp]#sed1,10y/abcde/ABCDE/file2head-n5root:$6$LjZD80zX$SCB3xrqwrBBxvrrDlh6KJgxf/qvufP0SikDFqQPCsDvR4yjtHEfISXn1lzQrF7iXDBGUEA0Jq8E76pG.gQmmK.::0::7:::Bin:*::0::7:::DAEmon:*::0::7:::ADm:*::0::7:::lp:*::0::7:::
打印奇数行或偶数行
sed-n1~2ptest.txt#奇数行sed-n2~2ptest.txt#偶数行
知识点12:
Linuxdeclare命令用于声明shell变量。
declare命令有如下选项:
-a声明一个数组
-i声明一个整型
-f打印所有函数定义
-F仅打印函数名字
-r声明一个readonly变量,该变量的值无法改变,并且不能为unset
-x和export的作用类似
#!/bin/bashfunc() {
echoThisisafunction }declare-f//列出上面的函数echodeclare-ivar=echo"vardeclareas$var"var=.23//将已声明为整数的变量的值更改为浮点值,引起一个错误信息,此变量的值保持原样echo"varis$var"echodeclare-rvar1=1.1//声明一个只读变量echo"var1declaredas$var1"var1=1.2echo"var1is$var1"exit0预览时标签不可点收录于话题#个上一篇下一篇