Linux 中shell脚本编写教程 |
您所在的位置:网站首页 › linux如何写一个脚本 › 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 的使用: 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 输入/输出重定向:
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |