- A+
一,介绍
什么是解释性语言?什么是编译型语言?
程序不需要编译,程序在运行时由解释器翻译成机器语言。每执行一次都要翻译一次因此效率比较低。
程序在执行前需要一个专门的编译过程,把程序编译成为假期语言文件,运行时不需要重新翻译,直接使用编译的结果。
二,脚本的作用
脚本的格式
#!/bin/bash
脚本的作用
1.自动化软件部署 2.自动化分析处理 3.自动化备份 4.自动化监控脚本
三,she怎末用
脚本运行方式
sh/bash 绝对路径|相对路径
chmod+x 脚本名称 ./脚本名称
在任意地方执行脚本 将脚本移动至bin目录 脚本名称
四,shell变量
定义用户变量
变量名=值
变量名=`执行命令`
变量名=$(执行命)
读取变量
echo ${A:2:3} 2下标 3往后截取的长度
echo ${A}
echo $A
作用域 只在当前会话的当前用户下有效
export 变量名=值
作用域 针对于当前会话的所有用户有效
需要在 vim /etc/profile 定义变量 export 变量名=值
变量生效 source /etc/profile
$n 语法:$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$# 获取所有参数的个数
$* 获取所有参数 加“”会把参数看作一个整体
$@ 获取所有参数 加“”也是 把每个参数分区对待
$? 返回上一次执行命令的将结果 正确返回0 错误返回一
案例:
for i in "$@"
do
echo $i
done
do
echo $i
done
五,shell数组
Shell 数组用括号来表示,元素用"空格"符号分割开,如果元素中包含空格,则该元素使用双引号引起来,例如"hello word"
语法:arr=(1 2 3 4 5 6 7 8)
echo ${arr[*]} echo ${arr[@]} 获取数组中所有元素
echo ${arr[2]} 通过下表获取元素
echo ${#arr[*]} echo ${#arr[@]} 获取数组的长度
unset arr[2] 通过下表删除数组的元素 并删除这这个下标
六,shell运算符
整数运算符
$((运算式)) $[运算是] “+,-,*,/,%” 运算符间可以不要空格
echo $[(2*2)+4]
expr +,-,*,/,%, 运算是之间要有空格
expr `expr 2 * 2` * 4
小数运算
bc:Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计
算小数就得使用 bc这个外部的计算器
案例:
计算3*8/7 结果保留4位小数: echo "scale=4; 3*8/7" | bc
计算4/9,保留2位,结果赋值给ret变量 ret=$(echo "scale=2;4/9"|bc) echo $ret
七,shell条件判断
语法 []条件非空即true
[ condition ] (注意:condition前后要有空格)
(1)两个整数之间比较
== 字符串比较
-lt 小于(less than)
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并是一个目录(directory)
案例:
判断文件是否具有写权限
[jinghang@hadoop101 datas]$ [ -w helloworld.sh ]
[jinghang@hadoop101 datas]$ echo $? 代表上一条命令执行结果 正确返回0 错误返回1
0
判断目录中的文件是否存在
[jinghang@hadoop101 datas]$ [ -e /home/jinghang/cls.txt ]
[jinghang@hadoop101 datas]$ echo $?
1
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,
|| 表示上一条命令执行失败后,才执行下一条命令)
[jinghang@hadoop101 ~]$ [ condition ] && echo OK || echo NOTOK
OK
[jinghang@hadoop101 ~]$ [ condition ] && [ ] || echo NOTOK
NOTOK
八,shell流程控制
(一),if 判断语句
语法1: if [ 条件判断式 ]
then
主体代码
fi
语法2: if [ 条件判断式 ]
then
主体代码
else
主体代码
fi
语法3: if [ 条件判断式 ]
then
主体代码
elif [条件判断式]
then
主体代码
else
主体代码
fi
注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须要有空格
(2)if后要有空格
案例:
编写一个脚本,传入文件或者目录名称
(1)判断文件或者目录是否存在,存在则完成(2)(3)步骤,不存在则输出文件或目录不存在
(2)如果是文件输出路径并打印"该路径为文件路径",并往文件中写入 "你真好看"
(3)如果是目录,输出路径并打印"该路径为目录路径",并在该路径下创建bbb.txt文件
(二),case 判断语句
语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“;;”表示命令序列结束,相当于java中的break。
(3)最后的“*)”表示默认模式,相当于java中的default。
(三),for 循环语句
语法1:
for (( i=0;i<100;i++ ))
do
程序
done
语法2:
$*:读取传入脚本中的全部参数,把参数看作一个整体
$@:读取传入脚本中的全部参数,把参数区分对待
do
程序
done
do
程序
done
案例:
从1加到100
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
sum=$[ sum+i ]
done
echo $sum
[jinghang@hadoop101 datas]$ ./for1.sh
“5050”
(四),while 循环语句
语法
while [ 条件判断式 ] 注意 :while 和条件判断式 与[之间都要有空格
do
程序
done
until 循环执行一系列命令直至条件为 true 时停止
until [ 条件判断式 ]
do
主题代码
done
案例:
#!/bin/bash
i=0
sum=0
until [ $i -eq 101 ]
do
sum=$[sum+i]
i=$[i+1]
done
echo $sum
echo $i
九,read读取控制台输入
语法
read [选项] [参数]
选项 功能
-p 指定读取值时的提示符
-t 指定读取值时等待的时间(秒)
参数:指定读取的值的变量名
案例:
1.使用read命令读取命令行输入参数,提示“Enter your name in 7 seconds”,
把用户输入参数赋值给NAME变量
十,shell函数
(一),系统函数
basename
basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来
basename [string / pathname] [suffix]
可选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
案例:
dirname
从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
dirname 文件绝对路径
案例
(二),自定义函数
语法:
[ function ] funname()
{
Action;
[return int;]
}
funname
经验技巧
(1)必须在调用函数地方之前,先声明函数,shell脚本逐行运行。不会先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
案例
输入两个参数,计算两个参数的和
用户函数定义在当前用户主目录下的.bashrc文件里在当前用户下所有的会话都有效
调用前要source一下
系统函数定义在/etc/profile文件下 对所有用户所有会话都有效
也要source一下
十一,shell文本处理
(一),cut
功能描述:cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的,cut指令用
户显示行中的指定部分,删除文件中的指定字段。
cut [选项] [文件]
选项 功能
-b -b <起始字节位置-结束字节位置>仅显示行中指定字节范围的内容。例如,“-b
2-10”将显示第2~10个字节位置的内容,当只有一个数字时,则仅显示指定字符
位置的内容.
-f <起始列位置-结束列位置> 显示指定的字段内容
-d <分隔符> 指定字段的分隔符,默认的字段分隔符为“TAB”
-c <起始字符位置-结束字符位置> 仅显示行中指定范围的字符。例如,
“-c2-10” 将显示第2~10个字符位置的内容。当只有一个数字时,则仅显示指定
字符位置的内容
案例:
(1)切割cut.txt第一列
cut -d " " -f 1 cut.txt
(2)切割cut.txt第二、三列
cut -d " " -f 2,3 cut.txt
(3)切割ifconfig 后打印的IP地址
(二),sort
功能描述:它将文件进行排序,并将排序结果标准输出
语法:sort 【选项】【参数】
选项 功能
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
参数:是指待排序的文件
案例:如有以下数据
按照整数排序:
按照小数排序
(三),正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为
regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)
的文本单字符匹配
d 匹配一个数字字符。等价于[0-9]
D 匹配一个非数字字符。等价于[^0-9]
w 匹配包括下划线的任何单词字符。类似但不等价于[A-Za-z0-9_]
W 匹配任何非单词字符。等价于 [^A-Za-z0-9_]
s 匹配空白字符,包括空格、制表符、换页符等等,等价于[ fnrtv]
S 匹配任何可见字符。等价于[^ fnrtv]
.点 匹配除“n”和"r"之外的任何单个字符
[a-z] 字符范围,匹配a~z之间的任意字符
[^a-z] 匹配除了a~z之间的其他字符
n 匹配换行符
多字符匹配
+ 匹配前面的子表达式一次或多次(大于等于1次)
* 匹配前面的子表达式任意次
? 匹配前面的子表达式零次或一次
{n} n是一个非负整数。匹配确定的n次
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
其他
^ 匹配输入字行首
$ 匹配输入行尾
| 将两个匹配条件进行逻辑“或”(or)运算
x|y 匹配x或y
(四),sed
功能描述:sed是一种单行文本流式编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件结束。文件内容并没有改变,除非你使用重定向存储输出。
语法:sed [选项] ’命令‘ 文件名
选项 功能
-e 直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
-i 直接编辑文件
-n 取消默认输出sed默认会输出所有文本内容,使用-n
参数后只显示处理过的行
命令 功能
p 打印一般 -n 配合使用
a 新增,在指定的行之后插入内容
i 新增,在指定的行之前插入内容
d 删除
s 查找并替换 (注意:如果进行全局的查找替换 sed -i ‘s/查找条件/替换字符串/g’ global)
案例:
数据准备
(1)将“mei nv”这个单词插入到sed.txt第二行下,打印。
(2)删除sed.txt文件所有包含wo的行
注意:‘g’表示global,全部替换
(4)将sed.txt将wo替换为ni只打印处理后的行
(5)批量添加注释
(6)批量取消注释
(五),awk
功能描述:是一门编程语言,也是一个强大的文本分析工具,逐行扫描文件,
默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要
的操作。
语法:awk 选项 ‘pattern1{action1} pattern2{action2}...’ 文件名
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项 功能
-F 指定输入文件的分隔符
-v 赋值一个用户定义变量
案例1:
passwd文件
(1)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列。
注意:只有匹配了pattern的行才会执行action
(2)搜索passwd文件以root和lisi关键字开头的所有行,并输出该行的第1列和第7列。
注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
(4)将passwd文件中的用户id增加数值1并输出计算后的用户id和用户名
(5)切割IP
(6)统计passwd文件用户id大于500的用户数,和统计id小于500的用户数
awk的内置变量
变量 说明
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数(切割后,列的个数)
案例2:
(1)统计passwd文件名,每行的行号,每行的列数
(2)查询sed.txt中空行所在的行号并统计行号总数