天天看点

shell脚本篇一---shell脚本初步

一、概念

shell就是用户和linux进行沟通的一个桥梁,也即是一个盒子,用户通过这个盒子去操作内核,完成对系统的操作。这个盒子有很多功能,包括命令补全(tab)、历史命令记录( history)、命令别名设置(alias)、程序化脚本(shell脚本)、通配符(如*代替任意字符等)、查询是否为shell的内建命令(type  COMMAND)

alias  lm="ls  -al"    定义lm为命令ls  -al的别名;

二、shell变量

1、变量的取用与设定

(1)变量的取用  echo

要知道一个变量的值,则echo  ${变量名称}

(2)变量的设定

设置一个变量,即  变量名称=变量值

a、变量名称只能是字母或者数字,但是开头不能是数字;

b、变量内容若有空格符等,可以用""或者''将变量内容结合起来,但是""将不改变引号内的特殊字符(如$)的特性,而''内的字符则仅为纯文本的字符而已;

c、可用转译符\将特殊符号(如$,\,',空格等)转译为一般的字符;

d、在变量值中,若还引用了其他命令提供的信息,则可以使用反单引号``或者$(命令),例如version=$(uname  -r)

e、若该变量需要在其他子程序引用,则可以 export  ${变量名称},例如export  ${name}  ,使其变为环境变量;若要使环境变量变为自定义变量,则使用declare

f、一般的,大写字符用来表示系统的环境变量,小写为自定义变量;

g、取消变量的方法为 unset  变量名称,例如unset  name

(3)其他

a、观察环境变量,则使用命令 env ;观察所有变量,则使用命令 set

b、?也是一个变量,$?这个命令来查看上次执行命令是否成功,0代表成功;

c、变量是存在有效范围的,环境变量对当前shell均生效,自定义变量则仅对当前shell生效;

(4)变量的键盘读取,数组和宣告

a、变量的键盘读取

除了直接通过命令设定变量之外,也可以让用户通过键盘输入,即使用read这个命令,常用语法为  read  -p "please keyin your name:" named,即用户根据提示语输入一个变量值,将此变量值传给变量named,注意这里-p "***" 可以输入提示语;

b、declare

基本语法  declare  [-aixr]  variable,-a定义变量为数组array类型;-i定义变量为整数(int)型;-x定义变量为环境变量(再+x则可以取消为环境变量);-r定义变量为只读变量;

PS:bash对变量的一些默认处理方式

-->默认情况下,bash对变量有一些基本的定义,即默认变量类型为字符串,如sum=1+2,则echo $sum则输出为1+2,因为不指定变量sum的类型的话,默认为1+2是一个字符串;因此当变量类型不为字符串时,要进行变量宣告;

-->它的数值运算默认最多到达整数形态,如1/3结果是0;

c、数组(array)变量类型

数组的设定方式    var[index]=concent,例如var[1]=xiaoming;

在读取数组时,一般用echo  ${var[1]},这比较无误;

PS:限制用户可使用资源的大小,用ulimit命令来限制用户“可以打开的文件数量, 可以使用的 CPU时间,可以使用的内存总量”

(5)变量内容的删除,取代和替换

某些时候常需要判断某个变量是否存在,若存在则使用该变量,若不存在则设定该变量。------暂时略过

三、命令别名设定alias  unalias

为了方便自己的使用,将很长的一段命令取一个名字,即alias  [别名]='命令' ,这里的[别名]可以和现在的命令名字重复,即取代现有的命令;若查看现有的命令别名有多少 则 直接alias,若去掉别名,则unalias [别名]

PS1:history出历史命令后,然后!number即执行那个数字的命令;

PS2:取得bash是需要完整的登录流程的,这个就是login shell,在登录流程时,读取的环境配置文件最重要的为/etc/profile,但是/etc/profile在起来时也会唤起/etc/profile.d/*.sh,即这俩个文件都会在登录时被读取,创建好的bash中有这个了就,配置文件的读取是通过source来读取的,因此source [环境变量文件]也即再次读取环境变量文件;

四、通配符与特殊符号

1、bash的操作环境还有一些通配符,如下

*:代表0到无穷多个任何字符,如/etc/cron*,意思就是/etc下以cron开头的任意文件

?:代表一定有一个字符,如/etc/????,意思就是/etc下的名称为五个字符的文件;

[abcd]:代表这四个中的任意一个

[0-9]:代表0-9内的任意数字,如/etc/*[0-9]*,意思是etc下的还有数字的文件;

[^abc]:代表只要非adc即可,如/etc/[^a-z]*,意思是etc下的非小写字母开头的文件;

2、除了通配符之外,bash还有一些特殊字符,如下

#:即注释掉此行,不执行

\:转移符号,即将一些特殊符号或者通配符如.,$,*等转移为普通(文本)字符;

|:管道,传递给下一个命令

;:连续性命令的界定

~:用户的家目录

$:取用变量的前导符号

&:工作控制,将指令变成背景下工作  ----->??

!:逻辑“非”的意思

/:路径分隔符号

>  >>:数据流重导向,输出导向,意思为“替换”和“追加”

<  <<:数据流重导向,输入导向

' ':单引号,内的字符均为普通字符,不有特殊含义

" ":双引号,保留内的字符的特殊含义

` `:反引号,内的为命令串,也可使用$()

():为一个字shell的开始与结束  ----->??

{}:在中间为命令串的组合

五、数据流重定向

1、输出重定向

一般的,输出都是输出到设备上(即屏幕上),而当想把输出的东西传递到另外一个文件中,则可使用输出重定向

>覆盖重定向,输出的东西会覆盖当前文件中的内容,当然,若没有该文件,则会创建文件

>>追加重定向,从当前文件的最后开始进行追加

PS:tee  [-a]  file  意思为将前面输出的信息存储到一制定文件,同时可以输出到信息到屏幕,例如 ls  /etc/passwd  | tee -a  ./tmp |more 既可以屏幕打印,又可以存储一份到文件;

2>将输出的错误的信息,重定向到一个文件中,常用的为2> /dev/null,即将报错信息扔进垃圾筐,而不展示,一般脚本中使用,若知道这个错误信息可以忽略,则经常使用,为了不再屏幕上出现错误的信息;

2、输入重定向

一般的输入都是通过键盘进行,这里的输入重定向,即由文件进行导入,而不再是通过键盘输入文件

<即把某文件A的内容输入到文件B中,例如:cat  my.cof   <   /usr/local/mysql/my.cnf.delaut,经常用于数据库导库的命令中,把文件导入or导出为什么文件;

<<结束的输入字符,例如:<<  EOF 即,在键盘输入了EOF时,就结束输入,一般也用于脚本中,和后面的EOF配对出现,即圈定一段范围,即输入完毕;

3、命令执行的判断依据

命令执行时可以几条命令一起执行,那么如何才能进行命令的判断,使用&&和||的连接符,例如  command1&&command2||command3 ,若命令1成功则执行命令2,命令2成功则停止,不成功则执行命令3。&&连接符是前者为真,则后者可执行,||指的是前者为真则后者不再执行,前者为假则执行后者;

;符号可以使命令连续执行,不管前面的命令是什么状态;

六、正则表达式

用在字符串处理上面的一项“表达式”,以行为单位进行字符串的处理,通过一些特殊符号的辅助,“搜寻、删除、取代”特定的字符串;在支持正则表达式的程序如awk、grep、sed等中,正则表达式的使用很普遍,而不支持的如ls,cp等,只能使用bash中的通配符 ;

注意:正则表达式和通配符是不一样的,前者是处理字符串的,后者是bash中的文字接口,其俩者没有任何关系;

1、正则表达式中的一些特殊的符号含义(基于LANG=C语系)

[:alnum:]:代表英文大小写字符及数字,亦卲 0-9, A-Z, a-z

[:alpha:]:代表任何英文大小写字符,亦卲 A-Z, a-z

[:upper:]:代表大写字符,亦卲 A-Z

[:lower:]:代表小写字符,亦卲 a-z

[:digit:]:代表数字而已,亦卲 0-9

2、grep的一些进阶选项

dmesg | grep -n -A3 -B2 --color=auto   'eth'        筛选出有eth的行,并且其前3行和后两行也都列示出来,且在最前面加上行号(-n的功能);

grep -n  't[ae]st'  regular_express.txt        这里搜寻的其实是有『tast』戒『test』两个字符串,因为[ae]中的意思是只取一个字符;

grep -n '[^a-z]oo' regular_express.txt      搜寻有oo的行,但是前面不要有小写字母的行,此命令行等同于  grep  -n  '[^[:lower:]]oo'  regular_express.txt

grep -n '^[a-z]' regular_express.txt    搜寻以小写字母开头的行(可以看到,^在[]里面还是外面,完全是不同的两个体系,在里面是bash的特殊字符,意思是反向选择,而在外面是正则表达式的定位 在行的开头)

 grep -n '\.$' regular_express.txt      搜寻出以.结尾的行(注意,因为.在正则表达式中有特殊含义,因此这里使用转译符\把.转译为普通的字符)

grep -v '^$' /etc/syslog.conf | grep -v '^#'    第一个代表不要空白行(-v为不要的意思,反的意思),第二个代表不要以#开头的行;

PS:正则表达式中的特别说明

(1).代表一定有一个字符,*代表重复前面的字符0次或者n次;

       ‘g..d’则是找出有g??d的字符的行;'oo*'则代表的是一定有一个o;'g.*g'则代表的是g???g即两个g之间还有任意字符的行都会显示出来,可知.*代表任意个字符(因为.代表一定有一个字符);'[0-9][0-9]*' 和 '[0-9]' 都是一个意思,均为含有任意数字的行;

(2)限定连续的次数的符号{},因为{}有特殊含义,因此需要\来转译;

         'go\{2,5\}g'找出g 后面接 2 到 5 个 o ,然后再接一个 g 的字符串;'go\{2\}g'找到 2 个 o的 即goog ,也可以是 'gooo*g'; 'go\{2,\}g'找到 2 个 o 以上的 goooo....g ,也可以是 'gooo*g'; 

 3、sed的常用方法

暂时省略;

4、awk的常用方法

操作对象为每一行的数据,处理对象为该行的每一列的数据;

(1)语法:awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

示例1:last -n 5 | awk '{print $1 "\t" $3}'        #可知,对于每一列的每个字段,都是有变量名称的,就是$1,$2......等,另外$0代表的是整行

(2)awk的一些内在变量

NF:每一行拥有的字段总数

NR:目前awk所处理的是第几行数据

FS:目前的分隔符,默认是空格

示例:【[email protected]~】#  last -n 5| awk '{print $1 "\t lines: " NR "\t columes: " NF}'    

                                root lines: 1 columes: 10

                                root lines: 2 columes: 10                                                          #对于awk而言,{}里面若出现非变量的内容,则必须以" "括起来,另外内建变量不需要加$;

(3)awk的逻辑运算符号

>  大亍

<  小亍

>=  大亍或等亍

<=  小亍或等亍

==  等亍

!=  不等亍

示例1:[[email protected] ~]# cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'

                                       root 0

                                       bin 1

                                       daemon 2                                                                           #这里以BEGIN作为起始条件,以:为分隔符,指定第三列的值小于10时才执行打印动作;另外,                                                                                                                                     在awk中,若{}中有多个动作,可以以;进行分割开;

示例2:[[email protected] ~]# cat pay.txt |  awk 'NR==1{printf  "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }  NR>=2{total = $2 + $3 + $4  printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

                                         Name      1st         2nd     3th        Total

                                         VBird     23000  24000  25000  72000.00

                                         DMTsai   21000  20000  23000  64000.00

                                         Bird2     43000  42000  41000  126000.00

继续阅读