shell脚本
shell的介绍
Shell是一种脚本语言,又是一种命令语言。通俗来讲,Shell脚本就是一系列命令的集合,可以在Unix/linux上面 直接使用,并且直接调用大量系统内部的功能来解释执行程序,把一些重复性工作交给shell做,来实现自动化运维。Shell 虽 然没有C/C++、Java、Python等强大,但也支持了基本的编程元素。例如:if、for、while等循环,还有变量、数组、字符 串、注释、加减乘除逻辑运算等。运维工程师、网络管理员、程序开发等人员应该把shell进行熟练的掌握。
shell的应用场景
主要用来开发一些实用的、自动化运维的脚本,而不是用来开发具有复杂业务逻辑的中大型软件。
监控linux系统环境的使用情况;
数据的处理,如日志的切割、分析、统计等;
与数据库的交互,如对数据库进行增,删,改,查等操作;
监控进程,自动化启停服务进程;
完成一些重复性的工作,如创建多个新用户;
在服务器集群配置文件
远程连接软件
SecureCRT、Xshell、putty
Xshell
链接:https://pan.baidu.com/s/1sHGiNiuGbK2nLkSlur-vnQ
提取码:6cae
SecureCRT
链接:https://pan.baidu.com/s/12A7vycGDm2vZaER_VuELxg
提取码:ihg4
linux的基本操作命令(常用命令)
linux之vi编辑器
单独整理,详情地址:
https://www.cnblogs.com/fujingtao5470/p/12715152.html
linux文件权限
文件权限(- rw- r-- r-- )和 目录权限(d rw- r-- r--)
都是可以分三列:每三个为一列,分别是所有者(owner),所属组(group),其他(others)
rwx说明:
r:读的权限用4表示 w:写的权限用2表示 x:执行权限用1表示
7:表示rwx
6:表示rw
5:表示rx
3:表示wx
shell脚本基本编写与执行
解释器:是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行。shell不一定得有解释器(shell脚本不加解释器,一般情况也可以用,但是容易出现问题,强烈建议shell脚本中标明解释器)
常见解释器: # !/bin/bash(linux默认解释器) # !/bin/ksh # !/bin/bsh # !/bin/sh
一般放在shell脚本的第一行,进行定义解释器。
shell脚本书写过程中: # 表示注释,但是 #! 表示定义解释器(第一行)
1.书写第一个shell脚本:
#!/bin/bash
#注释脚本功能说明
#作者及日期
echo 'Hello World !!!'
保存为shell.sh文件
2.如果脚本在本地通过CRT上传至linux服务器
3.通过远程工具(CRT)执行shell.sh的方法
shell脚本中的常见变量
1.
变量赋值:a = 3
输出变量a的值:echo $a 或 echo ${b}
2.
echo $? :如果输出的是0,说明此命令(echo $?)之前的上一条命令正确执行,没有异常错误;如果输出的不是0,说明此命令(echo $?)的上一条命令执行时出现异常错误。
3.
$0 :输出脚本的文件名称
$n :n表示1-任意整数,表示输出执行脚本时的第n个参数的值是多少
$# :输出执行脚本时一共输入参数的总个数
$* :输出执行脚本时输入的所有参数
示例说明:此处用shell Scrip 进行演示,这是一个shell脚本,文件内容如下,文件名为shell01.sh
执行脚本:用sh ./shell01.sh 命令执行脚本,同时后面传输15个参数,分别是:1-15
执行结果:
shell脚本中的常见变量
1. > :追加信息,但是会覆盖原有的内容 示例: cat > demo.txt 然后输入你要录入的内容,但是你的内容会将demo.txt的原有内容覆盖掉 Ctrl+C 退出
2. >> :追加信息,只会在原有内容的后面追加你要录入的内容 示例: cat >> demo.txt 然后输入你要录入的内容,你的内容会在原有内容的后面进行追加(类似于append) Ctrl+C 退出
3. ; :可以同时书写多条命令并执行 示例 cat demo.txt;ls -lrt
4. | :管道符 示例: cat demo.txt | grep xxx 示例说明:通过cat命令将demo.txt内容读取出来,并交由grep命令进行检索含有xxx字符的数据
5. && :与,符号前后书写命令 当符号前面的命令执行成功后,后面的命令才能执行,否则,后面的命令不执行(类似java的按位与) cat demo.txt && ls
6. || :或,符号前后书写命令 当符号前面的命令执行成功后,后面的命令不执行,否则,后面的命令才能执行(类似Java的按位或) cat demo.xxx || ls
7. "" :如果其中含有变量的话,可以输出变量的值
8. '' :如果其中含有变量的话,只能输出变量名称,不会输出变量的值
"" 与 '' 的区别
9. `` :可以输出命令执行的结果 示例: echo `date` 示例说明 因为date是linux命令,放在``中 ,可以执行并打印出当前时间的结果
10. 2/dev/null :错误输出到无底洞 ,前面书写命令,如果命令执行的结果是正确的,则直接输出执行结果,如果命令执行是错误的,则不会输出错误信息
11. 1/dev/null :正常输出到无底洞 ,前面书写命令,如果命令执行的结果是正确的,则不会输出执行结果,如果命令执行是错误的,则会输出错误信息
shell脚本的常见运算符
整数
加:
expr 2 + 3 expr $a + $b
echo $[2 + 3] echo $[a + b]
echo $((2 + 3)) echo $((a + b))
减:
expr 2 - 3 expr $a - $b
echo $[2 - 3] echo $[a - b]
echo $((2 - 3)) echo $((a - b))
乘:
expr 2 * 3 expr $a * $b
echo $[2 * 3] echo $[a * b]
echo $((2 * 3)) echo $((a * b))
除:
expr 2 / 3 expr $a / $b
echo $[2 / 3] echo $[a / b]
echo $((2 / 3)) echo $((a / b))
余:
expr 2 % 3 expr $a % $b
echo $[2 % 3] echo $[a % b]
echo $((2 % 3)) echo $((a % b))
含有小数的
bc:
bc是Linux自带的计算器
输入bc命令,直接输入运算,几个得到结果 Ctrl+C退出
shell脚本中如何使用:
echo "3.5+6.5" | bc a=3.5;b=6.5;echo "$a+$b" | bc
保留xx位小数:可以用scale命令 示例: scale = 2
注意:
scale只对乘幂/除法/取余 有效,对加/减 无效,加减可以通过对运算结果 乘1或除1 的方式来保留指定小数位,示例:echo "scale=2;(3.5+6.5)/1" | bc
整数位如果是零:echo "scale=2;(0.2+0.3)/1" | bc 输出结果是 .50 而不是 0.50
shell脚本的常见条件判断
[ 条件判断表达式 ]
一般情况下可以和 && || 进行配合使用 如果true && 如果false ||
文件/文件夹或路径的判断
-e 目标是否存在(exist) [ -e demo.sh ] && echo '存在' [ -e demoxx.sh ] || echo '不存在'
-d 是否是路径或文件夹(directory) [ -d /test ] && echo '路径存在'
-f 是否是文件(file) [ -f demo.sh ] && echo '是文件'
权限的判断
-r 是否有读取权限(read) [ -r shell.sh ] && echo '有读取的权限'
-w 是否有写入权限(write) [ -w shell.sh ] && echo '有写入的权限'
-x 是否有执行权限(excute) [ -x shell.sh ] || echo '没有执行的权限'
整数型(int)的判断
-eq 等于(equal) [ 1eq2 ] && echo '1不等于2' a=1;b=2;[ aeqb ] && echo 'a不等于b'
-ne 不同于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于等于(greater or equal)
-le 小于等于(lesser or equal)
小数型(浮点型)的判断
利用bc计算进行判断 bc 计算机支持浮点型判断 如果比较正确返回1,否则返回0,利用这一点,我们实现在shell脚本中对浮点型进行判断
示例: [ `echo "7.2 < 8"|bc` -eq 1 ] && echo 'ture'
字符串的判断
= 相等 [ 'a'='a' ] && echo '等于'
!= 不相等 [ 'a'='b' ] && echo '不等于'
panduan.sh(比较两个整数的大小的脚本)
#!/bin/bash
#参数1与参数2做比较
#by FJT create by 2020/04/19
if [ $1 -eq $2 ]
then
echo "$1等于$2"
else
echo "$1不等于$2"
fi
createFile.sh(创建文件的脚本)
#!/bin/bash
#创建文件或文件夹的shellscript
#by FJT 2020/04/19
touch $1
if [ $? -eq 0 ];then
echo "$1 创建成功!!!"
else
echo "$1 创建失败!!!!!"
fi
shell脚本的输入/输出(特效效果)
1.输入命令read: shell script 中的语法:read -p "请输入密码:" -s -t "5" (类似于html中的input) read后携带的常用参数主要有:
-p : 提示信息,默认不支持" "换行 (read -p "请输入密码")
-s : 隐藏输入的内容,例如输入密码的时候 (read -s)
-t : 设置等待时间,超时会自动退出read输入 ,秒(read -t "5")
-n : 设置读取字符的个数,触发临界值会自动执行read输入 (read -n "8")
注意:
脚本书写:read.sh,说明 param即传入的参数,这个变量可以随意定义,如pass,p......
脚本中换行操作:echo -e " "
第一种脚本输入方式(read)
#!/bin/bash
#功能描述:用来测试输入命令read
#by fjt 2020-04-20
read -p "请输入密码:" -s -t 5 -n 7 param
echo -e "
"
echo "$param"
第二种脚本输入方式(read)
#!/bin/bash
#功能描述,输入命令read的第二种方式
#by fjt 2020-04-20
echo "请输入用户名:"
read usr
echo -e "
"
echo "您输入的用户名是:$usr"
第三种脚本输入方式($n):换行操作(echo -e " ")
panduan.sh(比较两个整数的大小的脚本)
#!/bin/bash
#参数1与参数2做比较
#by FJT create by 2020/04/19
if [ $1 -eq $2 ]
then
echo "$1等于$2"
else
echo "$1不等于$2"
fi
2.语法: echo -e " 33[字背景颜色;字体颜色;特效字符串 33[关闭属性"
#字体色范围:30-37 echo -e " 33[30m 黑色字 33[0m" echo -e " 33[31m 红色字 33[0m" echo -e " 33[32m 绿色字 33[0m" echo -e " 33[33m 黄色字 33[0m" echo -e " 33[34m 蓝色字 33[0m" echo -e " 33[35m 紫色字 33[0m" echo -e " 33[36m 天蓝字 33[0m" echo -e " 33[37m 白色字 33[0m" #字背景颜色范围:40-47 echo -e " 33[40;37m 黑底白字 33[0m" echo -e " 33[41;30m 红底黑字 33[0m" echo -e " 33[42;34m 绿底蓝字 33[0m" echo -e " 33[43;34m 黄底蓝字 33[0m" echo -e " 33[44;30m 蓝底黑字 33[0m" echo -e " 33[45;30m 紫底黑字 33[0m" echo -e " 33[46;30m 天蓝底黑字 33[0m" echo -e " 33[47;34m 白底蓝字 33[0m" # 特效范围 echo -e " 33[0m 无任何特效 33[0m" echo -e " 33[1m 高亮度 33[0m" echo -e " 33[4m 下划线 33[0m" echo -e " 33[5m 闪烁 33[0m"
处理海量数据常用命令
grep、cut、awk、sed 常用于查找日志、数据、输出结果等等,并对我们想要的数据进行提取, 通常grep、sed命令是对行进行提取,cut、awk是对列进行提取。
处理海量数据值grep
使用语法:grep [选项]...[内容]...[file]
常用的选项如下:
-v #对内容进行取反提取 -n #对提取的内容显示行号 -w #精确匹配 -i #忽略大小写 ^ #匹配开头行首 -E #正则匹配
处理海量数据值cut
应用场景:通常对数据进行列的提取。
使用语法:语法:cut [选项]...[file]
常用语法如下:
-d #指定分割符
-f #指定截取区域
-c #以字符为单位进行分割
注意:不加-d选项,默认为制表符,不是空格
/bin/bash #代表可以登录的用户
/sbin/nologin #代表不可以登录的用户
-d与-f:
eg:以':'为分隔符,截取出/etc/passwd的第一列跟第三列
cut -d ':' -f 1,3 /etc/passwd
eg:以':'为分隔符,截取出/etc/passwd的第一列到第三列
cut -d ':' -f 1-3 /etc/passwd
eg:以':'为分隔符,截取出/etc/passwd的第二列到最后一列
cut -d ':' -f 2- /etc/passwd
-c:
eg:截取/etc/passwd文件从第二个字符到第九个字符
cut -c 2-9 /etc/passwd
eg:比如领导想叫你截取linux上面所有可登陆普通用户 grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v root