shell脚本--文本处理以及编程原理
一、文本处理工具
wc命令
wc(Word count)用于统计文本文件中的字符个数
15是行数 78是字符个数 805是文件大小(字节)【1字节等于8比特】
2、参数:-l(统计行数)、-w(统计单词数)、-c(统计字节数)
cut(切片)命令
1、指定分隔符,切割文件
2、常见参数:-d(指定分割符)、-f(指定提取哪一列)、--output-delimiter=‘’(将输出的分隔符,替换为自己想用的分隔符)
示例:cut -d” ” -f1 /etc/fstab(取第一列)
cut -d” ” -f1,3 /etc/fstab(取第1、3列)
cut -d” ” -f1-3 /etc/fstab(取第1到3列)
cut -d[:] -f1d /etc/fstab(指定分隔符为空格和冒号)([ ]代表括号里的 任意字符都匹配)
3、cut无法指定多个分隔符,awk可以指定多个分隔符
【cut的局限性:1、-d指定分隔符,不能同时指定多个 2、不能做高级的格式化输出;所以要掌握awk命令】
sort命令
1、sort命令根据ASCII码来进行排序,并不是数值大小
2、常用参数:-r(逆序)、-f(忽略字符的大小写)
-t(指定字段分隔符)、-n(以数值大小排序)
-u(排序去除重复,重复的不显示)
-k(指定哪一列进行排序)
uniq命令
1、uniq命令用于去重,但是只有连续且相同的命令才被视为重复【所以要先排序在去重】
2、常用参数:-c(统计某些字符重复的字数)【例:sort filename | uniq -c】
-d(仅仅显示未重复过的行)
练习:取出/etc/passwd文件的第6到10行,并将这些信息按照第3个字段的数值大小进行排序,最后仅显示各自的第一个字段
Head /etc/passwd | tail -5 | sort -t: -k3 -n |cut -d” “ -f1
二、编程原理
1、机械码(16进制)的局限性:识别机器,各种品牌不兼容
2、机器只能识别二进制指令
3、程序=指令+数据
4、驱动硬件设备默认不能使用;CPU控制硬件资源,CPU由控制器与运算器组成
5、驱动程序:不同的厂家的硬件设备之间需要进行指令沟通时,我们需要驱动程序来进行“翻译”
6、更接近于硬件开发的工程师要学习“汇编语言”,但是汇编语言被厂家所限制
7、C语言与C++的底层为汇编语言
8、操作系统用来分配硬件资源(操作系统用C语言来写)
9、现在的编程基于高级语言及超高级语言,更好的让程序员能够实现编程功能。高级语言及超高级语言需要翻译成计算机可读的语言(二进制语言),翻译分为两种:解释型(逐行翻译,逐行执行, 例:bash -x filename(方便排错))与编译型(一次编译,全部执行)
10、Shell,Python为解释型语言,编译安装大多使用C语言、C++、C#
11、编程语言的分类:根据服务的重心不同,编程分为面向对象编程(侧重于数据的语言)和面向过程编程(侧重于指令的语言)。
12、编程语言的执行方式【一行一行】:顺序执行(没有逻辑关系)、循环执行(for(遍历,常用)、While(循环条件,True的时候开始循环)、unti(与while相反,False的时候开始循环))、选择 执行(分支if语句、case(重点使用))
13、Shell编程介绍:shell语句是面向过程的,侧重于指令集;
shell语句的基本结构组成:命令、数据-变量、逻辑关系
shell没有内嵌函数,没有函数库调用
没调用的接口,这一点限制了shell脚本的功能,不像Python,可以调用各种模块接口
优点:shell的功能更好的兼容系统,可以直接调用系统命令,执行效率更高
14、shell脚本的第一句话必须写(#!/bin/bash)---->定义脚本解释器
15、/etc/shells----------查看当前系统支持的shell程序
echo $SHELL-----查看当前会话的shell程序
/etc/passwd----------制定了用户默认支持的shell程序(/bin/nologin)
16、shell的执行:1、bash命令来执行脚本
参数:-n 查看shell脚本的逻辑错误
-x 逐行显示执行的脚本程序(方便排错)
2、授权 chmod +x filename,然后使用全路径执行脚本
17、变量:环境变量
局部变量(declare 命令--定义变量类型)
本地变量(local在函数中使用)
18、变量类型:数值型(浮点型(float),整型(int),布尔值(bollean,0、1 及false、true))
字符串:(普通字符及字符串、数组)
19、编程语言的分类:根据变量的不同,分为强类型语言(数值必须被定义,才能进行处理或运算)和弱类型语言(编程语言可以自动识别变量类型)
20、多态:一个数据有多个属性,而最后使用的属性取决于和它进行运算的数据
21、传参:$?(上一条命令的执行状态,0代表正确,1-255表示错误)
$1、$2、${10}--------命令后面传入脚本的数据,以空格为分隔符
$#(统计传参数量,${$#}统计传参量)
$*(表示所有传参,所有的传参以字符串形式输出)
$@(表示所有传参,所有的传参以列表形式输出)
22、定义变量格式:NAME=VALUE(中间不要有空格,一个等号是赋值,两个等号是判断)
通过命令declare定义变量参数(例:declare -i a=10 int() str())
declare -a(代表数组)、declare -i (代表整数)
23、变量命名:下划线的方式指定变量名称
驼峰命名方式
24、文件测试、条件判断:在脚本语言中,我们需要进行语句分支,就是要做判断,判断就是使用test命令来实现的。
使用格式:test [option] file
[ 条件语句 ]
【不用test做判断时不加[ ]】
常见的test选项:
比较选项:-eq(等于)、-en(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)【用于数值的判断,字符用=、!=】
判断选项:-f(判断是否为普通文件)、-d(判断是否为目录件)、-L(判断是否为链接文件)、-r、-w、-x(判断是否具有读 写 执行的权限))
关联选项:-o(或)、-a(与)、!(非)
字符串测试:=(等于为真)、!=(不等于为假)、-z(判断字符串是否存在,存在为真,不存在为假)、-n(与-z相反)
25、逻辑运算:与 && :两边的命令都为真时结果才为真
或 || :两边的命令,一边为真就是真,同时为假才是假
非 !
[ $? -eq 0 ] && exit 0 || exit 1
前后对接的都是单独的存在的命令,前后的两个命令没有任何关系只是通过逻辑运算符联系在一起
26、算数运算:let(1+1) 例:let a=1+1 echo $a
expr(1*1) 例:exor 1* 10
$[] [$1+10] 例:a=$[2+3] echo $a
$(()) (($1/$2)) 例:a=$((2/4)) echo $a
27、编程练习
输出100以内的书的和
1
2
3
4
5
6
7
8
|
#!/bin/bash declare -i i=0 declare -i sum =0 while [ $i - le 100 ] ; do sum +=$i let i=i+1 done |
执行结果:
传参
1
2
3
4
5
6
7
|
#!/bin/bash echo "$1 $2 ...${10}" echo $? echo $ # echo $* echo $@ echo ${$ #} |
执行结果:
判断文件是否存在
1
2
3
4
5
6
7
8
|
#!/bin/bash #判断文件是否存在 if [ -f $1 -a -w $1 ]; then echo "$1 文件不存在" else echo "$1 文件已存在" fi |
判断用户类型
1
2
3
4
5
6
7
8
9
10
|
#!/bin/bash #判断用户类型 declare -i uid=`uid -u $1` if [ $uid - eq 0 ]; then echo "这个是管理员" else echo "这是个普通用户" fi |
执行结果: