Linux 中shell脚本编写教程

1.文本处理工具

1.1 grep工具

Linux grep 命令用于查找文件里符合条件的字符串。  grep [选项] '关键字 文件名

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

从文件内容查找匹配指定字符串的行:

$ grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件

grep "thermcontact" /.in
从文件内容查找与正则表达式匹配的行:

$ grep –e "正则表达式" 文件名
查找时不区分大小写:

$ grep –i "被查找的字符串" 文件名
查找匹配的行数:

$ grep -c "被查找的字符串" 文件名

从文件内容查找不匹配指定字符串的行:

$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:

$ find / -type f -name "*.log" | xargs grep "ERROR"
例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:

find . -name "*.in" | xargs grep "thermcontact"

1.2 cut工具

cut 是列截取工具,用于列的截取。   cut 选项 文件名

使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

参数:

-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除

cut 的使用:

1.3 sort工具

Linux sort命令用于将文本文件内容加以排序。

sort可针对文本文件的内容,以行为单位来排序。

sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

1.4 uniq工具

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。(去除连续的重复行)

uniq 可检查文本文件中重复出现的行列。

举例如下:

 

1.5 tee工具

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

-a或--append  附加到既有文件的后面,而非覆盖它

实例:
使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令:

$ tee file1 file2                   #在两个文件中复制内容 

将内容追加在文件后
echo hello world | tee -a 文件名

1.6 diff工具

Linux diff命令用于比较文件的差异。

diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。

 

1.6 paste工具

Linux paste 命令用于合并文件的列。

paste 指令会把每个文件以列对列的方式,一列列地加以合并。

1.7 tr工具

Linux tr 命令用于转换或删除文件中的字符。

tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备

 

2.基本特性

2.1 常见的快捷键

 

2.2 常见的通配符

shell常见的通配符,注意与正则稍有不同:

字符含义实例
*匹配0个或多个任意字符

a*b,a与b之间可以有任意长度的字符,也可以没有。

例如:aabcb,ab,azxcb...

?匹配一个任意字符

a?b,a与b之间必须但也只能存在一个字符,该字符可以是任意字符。

例如:aab,abb,acb...

[list]匹配list中的任意单个字符

a[xyz]b,a与b之间必须但也只能存在一个字符,该字符只能是x或y或z。

例如:axb,ayb,azb

[!list]匹配除list中的任意单个字符

a[!a-z]b,a与b之间必须但也只能存在一个字符,该字符不能是小写字母。

例如:aAb,a0b...

[c1-c2]匹配c1-c2间的任意单个字符

a[0-1]b,a与b之间必须但也只能存在一个字符,该字符只能是数字。

例如:a0b,a1b...

{string1,string2,...}匹配string1、string2等中的一个字符串

a{abc,xyz,opq}b,a与b之间必须但也只能存在一个字符串,字符串只能是abc或xyz或opq。

例如:aabcb,axyzb,aopqb...

实例:

[root@youxi1 ~]# ls /etc/*.conf
/etc/asound.conf  /etc/kdump.conf      /etc/man_db.conf    /etc/sudo-ldap.conf
/etc/chrony.conf  /etc/krb5.conf       /etc/mke2fs.conf    /etc/sysctl.conf
/etc/dracut.conf  /etc/ld.so.conf      /etc/nsswitch.conf  /etc/vconsole.conf
/etc/e2fsck.conf  /etc/libaudit.conf   /etc/resolv.conf    /etc/yum.conf
/etc/fuse.conf    /etc/libuser.conf    /etc/rsyslog.conf
/etc/GeoIP.conf   /etc/locale.conf     /etc/sestatus.conf
/etc/host.conf    /etc/logrotate.conf  /etc/sudo.conf
[root@youxi1 ~]# ls /etc/???.conf
/etc/yum.conf
[root@youxi1 ~]# touch file{1,2,3}
[root@youxi1 ~]# ls file*
file1  file2  file3
[root@youxi1 ~]# ls file[123]
file1  file2  file3

2.3 常见的通配符

Linux Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)。

  • 双引号(" "):在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身。
  • 单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。
  • 反引号(` `):在反引号中的字符串将解释成shell命令来执行。
  • 举例:
    
    root@gyb-ubuntu:~# echo "$PATH"
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    可以看到在双引号中,$被作为特殊字符处理,PATH被解释为变量。
    
    
    root@gyb-ubuntu:~# echo '$PATH'
    $PATH
    在单引号中,特殊字符也失去了特殊意义作为普通字符输出。
    
    root@gyb-ubuntu:~# echo ls
    ls
    ls是一个shell命令,直接echo ls shell会将ls作为普通字符输出。如果我们加上反引号就不一样了,
    root@gyb-ubuntu:~# echo `ls`
    99.sh cloud_curr_design cloud_curr_design.tar.gz exefile for.sh gyb_virsh httpd-2.2.31 qemu_help readfile.sh switch.sh temp temp10.sh temp1.sh temp2.sh temp3.sh temp4.sh temp5.sh temp6.sh temp7.sh temp8.sh temp9.sh te.sh test9.sh ubuntu1204Server.img ubuntu1204Server.xml ubuntuGuest.xml ubuntu-server.img win7.img
    加上反引号之后,shell将ls作为命令执行,并将结果返回。

     

3.shell编程模块

(1)什么时候用到脚本?

重复化、复杂化的工作,通过把工作命令写成脚本,以后仅仅需要执行脚本文件就能完成这些工作。

(2)shell能干什么?

1.自动化的部署软件 (tomcat)

2.自动化的管理        (系统初始化脚本、批量更改主机密码、推送公钥)

3.自动化分析处理    (统计网站访问量)

4.自动化备份           (数据库备份、日志转储)

5.自动化监控脚本

3.1 shell脚本基本写法

(1)脚本第一行,需#!指定解释器     (   #!/bin/bash  表示以下内容使用bash解释器解析  【必写】

注意:

如果直接将解释器路径写死在脚本中,可能在某些系统上找不到解释器的兼容性问题,所以可 #!/bin/env 解释器  ( #!/bin/env bash )

(2)变量的定义

规则:变量名区分大小写、变量名不能有特殊符号、变量名不能已数字开头、等号两边不能有任何空格

交互式的定义变量:Linux read命令用于从标准输入读取数值

定义有类型的变量(Declare)

变量的分类:

环境变量:当前进程有效,并且能够被子进程调用。

env 查看当前用户的环境变量

set 查看当前用户的所有变量(环境变量和临时变量)

export 变量名=变量值 。

全局变量:

(3)四则运算

在linux shell中,我们可以使用 $(()) 将表达式放在括号中,即可达到运算的功能。

[wang@centos5 ~]$ b=$((5*5+5-3/2)) 
[wang@centos5 ~]$ echo $b
29

expr 实现运算:

[wang@centos5 ~]$ expr 5 - 4
1

注意:将需要运算的表达式写入在expr 后面即可,保证 参数与运算符号中间有空格隔开。

let 命令实现运算: 

let 后跟的是双引号括起来的表达式。表达式中的变量不需要加$符号。

 let "x = x + (y / 2)"  <==> (( x= x+ (y / 2) ))

  1. $ echo $x

  2. 26

  3. $ let "x += 2"

  4. $ echo $x

  5. 29

  与双括号方式相比,let命令没有返回结果。赋值操作在表达式内部完成。

 

 

 

 

 

 

Shell中常用指令

linux中$#的使用

$# 是传给脚本的参数个数

$0 是脚本本身的名字

$1 是传递给该shell脚本的第一个参数

$2 是传递给该shell脚本的第二个参数

$@ 是传给脚本的所有参数的列表

$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个

$$ 是脚本运行的当前进程ID号

$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

 

Shell 输入/输出重定向:

Shell 中的表达式:

文件表达式
-e filename 如果 filename存在,则为真         文件存在(existence)
-d filename 如果 filename为目录,则为真       文件存在并是一个目录(directory)
-f filename 如果 filename为常规文件,则为真    文件存在并且是一个常规的文件(file)
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真 
-w filename 如果 filename可写,则为真 
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。


整数变量表达式
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于


字符串变量表达式
If  [ $a = $b ]                 如果string1等于string2,则为真
                                字符串允许使用赋值号做等号
if  [ $string1 !=  $string2 ]   如果string1不等于string2,则为真       
if  [ -n $string  ]             如果string 非空(非0),返回0(true)  
if  [ -z $string  ]             如果string 为空,则为真
if  [ $sting ]                  如果string 非空,返回0 (和-n类似) 


    逻辑非 !                   条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ]              如果不存在目录$num


    逻辑与 –a     或者&&        条件表达式的并列
if [ 表达式1  –a  表达式2 ]


    逻辑或 -o     或者||        条件表达式的或
if [ 表达式1  –o 表达式2 ]

if [ condition1 ]; then
    command1
elif [ condition2 ]; then 
    command2
else
    commandN
fi


shell循环:
(1)while read 的使用
while read line
do
      …
done < file
read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。

(2)for循环使用
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done
输出结果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

顺序输出字符串中的字符:
for str in 'This is a string'
do
    echo $str
done
输出结果:
This is a string


[ ]在判断空字符串的时候需要加" "
[[ ]]在判断空字符串的时候不加" "也可以
用逻辑运算符&&或者|| 连接两个表达式的时候,一个[ ]不可以,但是[[ ]]就可以

单引号'',双引号""的区别是单引号''剥夺了所有字符的特殊含义,单引号''内就变成了单纯的字符。双引号""则对于双引号""内的参数替换($)和命令替换(``)是个例外。
比如说   n=3
      echo '$n'
结果就是$n
改成双引号  echo "$n",结果就是3
反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command`,指执行的终端指令。

$( )与` `(反引号)都是用来作命令替换的。
$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
参考网站:https://www.cnblogs.com/chengd/p/7803664.html  (很详细)

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值