Linux 中shell脚本编写教程

您所在的位置:网站首页 linux如何写一个脚本 Linux 中shell脚本编写教程

Linux 中shell脚本编写教程

#Linux 中shell脚本编写教程| 来源: 网络整理| 查看: 265

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) ))

$ echo $x

26

$ let "x += 2"

$ echo $x

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 (很详细)

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3