Skip to content

shell脚本

一、介绍

Shell是一种脚本语言,又是一种命令语言。可以通俗一点来讲,Shell脚本就是一系列命令的集合,可以在Unix/linux上面直接使用,并且直接调用大量系统内部的功能来解释执行程序把一些重复性工作交给shell做, 来实现自动化运维。Shell 虽然没有C/C++、Java、Python等强大,但也支持了基本的编程元素。例如:if、for、while等循环,还有变量、数组、字符串、注释、加减乘除逻辑运算等

二、应用场景

Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件

  • 第一方面:监控linux系统环境的使用情况

  • 第二方面:数据的处理。eg:日志的切割、分析、统计等

  • 第三方面:与数据库的交互,对数据库进行增,删,改,查等操作

  • 第四方面:监控进程,自动化启停服务进程

  • 第五方面:完成一些重复性的工作。eg:创建100个新用户;到服务器集群配置某个文件等

三、shell脚本使用

shell脚本第一行注释是解释器,解释器是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行。shell脚本不一定需要解释器,但是不指定解释器, 复杂的命令有可能会出现问题。

解释器有以下四种:

  • !/bin/bash(默认)

  • !/bin/ksh

  • !/bin/bsh

  • !/bin/sh

四、shell变量

不同于其它语言需要先声明变量,shell的变量直接使用

如:a=15,调用变量的话 $a 或者 $

加{}的区别,如:a=b,$a和 ${a}打印的都是b,如果需要拼接成book字符,$aook是不显示的,${a}ook是会显示book

  • $?:判断上一条命令执行的是否成功

  • $0:返回脚本的文件名称

  • $1-$9:返回对应的参数值,如$1表示传入的第一个参数

  • $*:返回所有的参数值是什么

  • $#:返回参数的个数和

五、shell符号

>   #追加内容,会覆盖原有的内容
>>  #追加内容,不会覆盖原有的内容

; #执行多条命令

|  #管道符

&& #前面的命令执行成功,后面的才可以执行

|| #前面的命令执行失败,后面的才可以执行

"" #会输出变量值,如a=123,输出"变量 $a",会输出:变量 123 '' #输出本身,如a=123,输出"变量 $a",会输出:变量 $a `` #输出命令结果,里面是命令,如a=date;echo $a 2>/dev/null #错误输出到无底洞 1>/dev/null #正确输出到无底洞,错误提示

六、运算符

  • 整数:加减乘除的运算都一样,有三种方式计算,建议变量跟运算符直接都使用空格

    • expr:变量与运算符直接必须加空格,如expr 12 + 6 ,12后面和6前面都加了空格。乘法注意加转义

    • echo $[12 + 6]:方括号里带有公式,可以不加空格

    • echo $((12 + 6)):括号里带有公式,可以不加空格

加:expr 12 + 6 expr $a + $b echo $[12 + 6] echo $[a + b] echo $((12 + 6)) echo $((a + b)) 乘:expr 12 * 6 expr $a * $b echo $[12 * 6] echo $[a * b] echo $((12 * 6)) echo $((a * b))

  • 小数:

bc计算器 保留多少位小数可以通过scale 但是scale只对除法,取余数,乘幂 有效,对加减没有效。

echo "scale=2;(0.2+0.3)/1" | bc     #计算出0.2+0.3的和并保留俩位小数,此时bc计算器会省略掉个位数的0

echo "scale=2;(1.2+1.3)/1" | bc   #计算出1.2+1.3的和并保留俩位小数

七、常见的条件判断

  • 语法:[ 判断表达式 ]

判断文件(夹)或者路径:

  • -e:目标是否存在(exist)

  • -d:是否为路径(directory)

  • -f:是否为文件(file)

#判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh文件
[ -e foer.sh ] || touch foer.sh
  • 权限:

    • -r:是否有读取权限(read)

    • -w:是否有写入权限(write)

    • -x:是否有执行权限(excute)

    [ -x 123.txt ] && echo '有执行权限'
  • 整数值(int型):

    • -eq:等于(equal)

    • -ne:不等于(not equal)

    • -gt:大于(greater than)

    • -lt:小于(lesser than)

    • -ge:大于或者等于(greater or equal)

    • -le:小于或者等于(lesser or equal)

    [ 9 -gt 8 ] && echo '大于'
  • 小数(浮点型):

通过bc计算器进行判断

[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo '小于'
  • 字符串:

    • =:相等

    • !=:不相等

    [ 'kkkkk' != 'kkkk' ] && echo '不等于'

八、read语法

语法:read -参数''

  • -p:给出提示符。默认不支持"\n"换行

  • -s:隐藏输入的内容

  • -t:给出等待的时间,超时会退出read

  • -n:限制读取字符的个数,触发到临界值会自动执行

九、输出上色

语法: echo -e "\033[字背景颜色;字体颜色;特效字符串\033[关闭属性"

  • 字体色范围:30-37

echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[37m 白色字 \033[0m"

  • #字背景颜色范围:40-47

echo -e "\033[40;37m 黑底白字 \033[0m" echo -e "\033[41;30m 红底黑字 \033[0m" echo -e "\033[42;34m 绿底蓝字 \033[0m" echo -e "\033[43;34m 黄底蓝字 \033[0m" echo -e "\033[44;30m 蓝底黑字 \033[0m" echo -e "\033[45;30m 紫底黑字 \033[0m" echo -e "\033[46;30m 天蓝底黑字 \033[0m" echo -e "\033[47;34m 白底蓝字 \033[0m"

  • 特效范围

echo -e "\033[0m 无任何特效 \033[0m" echo -e "\033[1m 高亮度 \033[0m" echo -e "\033[4m 下划线 \033[0m" echo -e "\033[5m 闪烁 \033[0m"