shell脚本编程学习笔记(一)
一、脚本格式
vim shell.sh
#!/bin/bash //声明脚本解释器,这个‘#’号不是注释,其余是注释
#Program: //程序内容说明
#History: //时间和作者
二、shell变量的种类
用户自定义变量:由用户自己定义、修改和使用
与定义变量:Bash与定义的特殊变量,不能直接修改
位置变量:通过命令行给程序传递执行的参数
1、定义变量:
变量名要以英文字母或下划线开头,区分大小写。
格式:变量名=值
输出变量:echo $变量名
2、键盘输入为变量内容:
格式:read [-p "信息"] 变量名
如:read -p "pewase input your name:" name
3、不同引号对变量的作用
双引号"":可解析变量,$符号为变量前缀。
单引号'':不解析变量,$为普通字符。
反引号``:将命令执行的结果输出给变量。
三、shell条件测试
1、test命令:
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。
格式:test 条件表达式 [ 条件表达式 ] (注意:[]与表达式之间存在空格)
2、常见的测试类型:
测试文件状态
格式:[ 操作符 文件或目录 ]
如:if [ -d /etc ]
then
echo "exists"
else
echo "not exists"
fi
常见的测试操作符:
-d:测试是否为目录
-e:测试目录或文件是否存在
-f:测试是否为文件
-r:测试当前用户是否有读权限
-w:测试当前用户是否有写权限
-x:测试当前用户是否有执行权限
-L:测试是否为符号链接文件
字符串比较
格式:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
如:read -p 'name:' name
read -p 'pass:' pass
if [ $name = 'admin' ] && [ $pass = '123']
then
echo '登录成功'
else
echo '登录失败'
if
常用的测试操作符:
=:字符串内容相同。
!=:字符串内容不同。
-z:字符串内容为空。
整数值比较
格式:[ 整数1 操作符 整数2 ]
如:age=30
if [ $age -ge 18 ]
then
echo "已成年"
else
echo "未成年"
fi
常用的测试操作符:
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-le:大于或等于
-ge:小于或等于
逻辑测试
格式:[ 表达式1 ] 操作符 [ 表达式2 ]
常用操作符:
-a或&&:逻辑与
-o或||:逻辑或
!:逻辑非
四、流程判断:
1、条件判断
a、if语句
格式:
单分支:
if 条件表达式
then 命令序列
fi
如:age=30
if [ $age -ge 18 ]
then
echo "已成年"
else
echo "未成年"
fi
多分枝:
if 条件表达式
then 命令序列
elif 命令序列
fi
如:score=87
if [ $score -lt 60 ];then
echo '60以下'
elif [ $score -gt 60 ] && [ $score -lt 70 ];then
echo '60~70之间'
elif [ $score -ge 70 ] && [ $score -lt 80 ];then
echo '70~ 80之间'
else
echo '优秀'
fi
b、case
格式:case $变量名称 in
"第一个变量内容")
;;
"第二个变量内容")
;;
*) //最后一个变量内容都会用*来代表其它值,不包含前面的变量内容
;;
esac
如:case $1 in
start)
echo 'start MYSQL service.'
;;
stop)
echo 'stop MYSQL service.'
;;
*)
echo "Usage: $0 start|stop"
;;
esac
2、循环控制
跳出本次循环:continue
结束循环:break
a、while循环
格式:while [ 条件表达式 ]
do
程序段落
done
如:num=3
while [ $num -gt 0 ]
do
echo $num
num=$(($num-1))
done
b、for循环
格式:for var in con1 con2 con3
do
程序段
done
如:
for i in user0 user1 user2 user3
echo $i
done
格式:for ((i=0;i<10 1++))
do
程序段
done
如:for ((i=0;i<10;i++))
do
echo $i
useradd user$i
echo 123 | password --stdin_user$i
done
3、函数使用
定义一个函数:在程序的最前面
function 函数名(){}或者function 函数名{}
如:function printit(){
echo "your choice is $1"
}
调用:直接使用函数名
如:printit 1
传递参数:函数名 参数1 参数1
如:printit 2
五、Shell文本操作
1、Find查找命令的使用
find . -name "*.text" //在当前目录下查找已txt为后缀的文件
fing .-name "[a-z]*" //在当前目录下查找开头字母的文件
find /etc -name "host*" //查找/etc目录下以host开头的文件
find . -perm 755 //在当前目录下查找属性为755的文件
find -user root //在当前目录下查找属主为root的文件
find /var -mtime -5 //在/var下查找更改时间在5天内的文件
find /var -mtime +3 //在/var下查找更改时间在3天以前的文件
find /etc -type d //查找文件类型为d的目录文件
find /etc -typt l //查找文件类型为l的链接文件
find . -size +1000000c //查找文件大小在1M的文件
2、正则表达式
^linux //以linux开头的
$php //以php结尾的
. //匹配任意单字符
.+ //匹配任意多个字符
.* //匹配0个或多个字符
[0-9a-z] //匹配[]内任意一个字符
(linux)+ //出现多次linux单词
(web){2} //web出现了2次以上
\ //转译
3、grep详解
grep "li qq"* //在所有文件中查找li qq文件
grep -c "file" a //在文件中查找有多少行匹配到file
grep -n "file" a //在文件中查找有多少行匹配file,同时显示行和行号
grep -i "file" a //在文件中查找file,并不区分大小写
grep -v "file" a //在文件中过滤掉file所在的行
grep -E "2017:22:5[0-9]" a //在文件中查找在时间在2017:22:50到59的所在行
grep -E "^[^210]" a //在文件中查找不号寒210的行
grep -E "h*p" a //查找包含h和p的行
grep -E "[5-8][6-9][0-3]" a //查找大于560小于893的行
grep -E "^d" a //在文件中查找以d开头的行
grep -E "^[^d]" a //在文件中查找不是以d开头的行
4、awk命令:
简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
格式:awk '{pattern + action}' {filenames}
pattern:查找内容
action:匹配规则
awk '{pring $0}' access.log //查找文件中的每一列
awk '{print $1"\t"$7}' access.log //查找文件中第一列和第七列
cat file | awk '$0 !~ /192.168.31.25/'|grep "php" //匹配Ip 地址的统计,!~为不匹配
例:for i in `cat /etc/passwd | head | awk -F:'{print $1}'`
do
echo $i
done
-F---以什么符号分割
head---去前多少行,默认是10行
5、sed行定位使用
简介:sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
选项 | 功能 |
-e | 进行多项编辑,即对输入行应用多条sed命令时使用 |
-n | 取消默认的输出 |
-f | 指定sed脚本的文件名 |
sed -n '2'p file //只打印第二行,不打印其他行
sed -n '1,4'p file //从第一行到第四行的记录
sed -n '/los/'p file //打印匹配los的行
sed -n '4,/los/'p file //打印从第四行到匹配los的之间所有行
sed '1,2'd file //吧第一行和第二行全部删除
6、Uniq行定位使用
简介:uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
语法 uniq(选项)(参数)
选项 :
-c或——count:在每列旁边显示该行重复出现的次数;
-d或--repeated:仅显示重复出现的行列;
-f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;
-s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
-u或——unique:仅显示出一次的行列;
-w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。
uniq -c file //打印紧挨的重复行出现的次数
uniq -d file //只打印重复的行
awk '{print $1}' /var/log/httpd/access_log | sort|uniq -c //把apache网站的所有访问ip全部统计出来,并打印出统计次数。
7、spli行定位
简介:可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志。
语法:split(选项)(file)PREFIX
选项:
-b:值为每一输出档案的大小,单位为 byte。
-C:每一输出档中,单行的最大 byte 数。
-d:使用数字作为后缀。
-l:值为每一输出档的列数大小。
PREFIX:代表前导符,可作为切割文件的前导文件。
split -2 file spt //生成fileab,fileac....fileai等多个文件,把a文件每行分割成一个文件,每个文件的前缀都是以file开头的。
shell脚本编程学习笔记(一)的更多相关文章
- Linux Shell脚本编程学习笔记和实战
http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...
- shell脚本编程学习笔记(三)编写邮件报警脚本
一.shell编写邮件报警脚本 1.POSTFIX邮件服务器准备 a.首先卸载服务器上自带的sendmail rpm -qa sendmail* //查看安装的sendmail rpm -e send ...
- shell脚本编程学习笔记(四)shell操作数据库
一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...
- shell脚本编程学习笔记(二)linux服务器启动流程
一.linux服务器启动流程 1.bios找到磁盘上的mbr主引导扇区 2.进入grub洁面选择相应的启动内核 3.读取kernel内核文件-/boot/vmlinuz-* 4.读取init的镜像文件 ...
- Bash脚本编程学习笔记08:函数
官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...
- Bash脚本编程学习笔记07:循环结构体
本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...
- Shell脚本编程学习入门 02
Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #! ...
- Bash脚本编程学习笔记06:条件结构体
简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...
- Shell脚本编程学习入门 01
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
随机推荐
- 三星正在改善1Gb MRAM寿命问题
据报道三星已经成功研发出有望替代嵌入式闪存存储器(eFlash)的嵌入式磁阻随机访问内存(eMRAM),容量为1Gb,测试芯片的优良率已达90%. 随着5G物联网时代的来临,存储器领域发展快速,而在这 ...
- python基礎學習第二天
字符编码 # 需知:## 1.在python2默认编码是ASCII, python3里默认是unicode## 2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf ...
- python中class的定义及使用
#类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法. #对象:它是类的实例化. #方法:类中定义的函数. #类(Class) 由3个部分构成: ...
- RHEL6 yum本地源配置
RHEL6 yum本地源配置 将RHEL6 的iso上传到/file1/xxx 新建目录/file1/xxx/mnt,将iso挂载到mnt目录 mount rhel-server-6.3-x86_64 ...
- 纪中21日c组模拟赛
AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL 题解传送 T1 ...
- npm常用模块之bable使用
更多npm常用模块使用请访问:npm常用模块汇总 bable这是JavaScript编译器. Babel是一个工具链,主要用于在当前和较旧的浏览器或环境中将ECMAScript 2015+代码转换为J ...
- 剑指offer-面试题7-重建二叉树-二叉树
/* 题目: 输入二叉树的前序遍历和中序遍历的结果,重建二叉树.假设输入的前序遍历和中序遍历的结果中不包含重复的数字. */ /* 思路: 使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树. ...
- Nessus 8.2.3无IP限制VM版虚拟机
根据“西门吹雪”http://ximcx.cn/m/?post=151的文章自己下载配置的过程 VM版本>=12都行,我用的是VM14 下载地址 https://moehu-my.sharepo ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(6.5-加-8.2-加-8.3)End-to-end_Data_Protection
6.5 End-to-end Protection Information 端到端保护信息 包含数据转存的命令可以使用端到端数据保护.在这些命令内部[位于Command Dword 12 的 [29: ...
- 变量 Variables
是为了存储(store)程序(program)运算过程中的一些信息(informations),为了方便日后调用.操作和更改 变量名应该简明,见名识意,让读者和我们自己能更清晰的了解 如果我们把变量看 ...