当前位置:   article > 正文

【脚本编程】Shell脚本零基础入门_shell编程入门

shell编程入门

1.shell脚本入门

1.1.shell的简介
shell是一种脚本语言,又是一种命令语言,可以通俗一点讲,shell脚本就是一些列命令的集合,可以在Unix、linux上直接使用,并且直接调用大量系统内部的功能来解释执行程序把一些重复性的工作交给shell做,来实现自动化运维。shell虽然没有java、c++、python等强大,但也支持了基本的编程元素,例如if、for、while等,还有变量数组、字符串、注释、加减乘除逻辑运算等。
  • 1
1.2.shell的应用场景
shell主要开发一些实用的、自动化的小工具,而不是用来卡法复杂的业务逻辑的
(1)监控linux环境变量的使用情况
(2)数据的处理,日志的切割、分析、统计等
(3)与数据库的交互,对数据库进行增删改查
(4)监控进程,自动化启停服务进程
(5)完成一些重复性的工作,创建100哥新用户或者配置某个文件等等
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
1.3.shell常见的解释器
解释器:一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行

四种解释器:
#!/bin/bash(默认)
#!/bin/ksh
#!/bin/bsh
#!/bin/sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 注意:shell脚本运行不一定需要解释器,有些脚本没有解释器也可以运行
1.4.shell脚本文件权限与脚本执行
  • 文件创建默认是没有执行权限的,所以要给加上权限:chmod u+x sh结尾的文件。
  • 执行shell脚本的方法:
方法一:sh 文件名
方法二:bash 文件名
方法三:./文件名
方法四:source 文件名 
  • 1
  • 2
  • 3
  • 4

2.shell的变量以及常见符号

2.1.常见变量
  • =:等于号赋值,a=15
  • $a:调取a变量的值
  • ${a}:调取a变量的值,当{a}后面有其他字符时,不会影响a的获取
  • $?:判断上一条命令执行的结果,成功为0,失败为1
  • $1-$9:返回对应的第几个参数
  • $*:返回所有的参数的值是什么
  • $#:返回参数的个数

(1)= 等号的作用

a=15;b=20;echo "$a,$b"
  • 1

在这里插入图片描述

(2) a 和 a和 a{a}的区别

echo "$abbbbb";echo "${a}bbbbb"
  • 1

在这里插入图片描述

(3)$?显示上一条命令执行的结果

echo "$?"
  • 1

在这里插入图片描述

(4)编写脚本,验证 ∗ , *, ,#.$0-$9的用途

#!/bin/bash
#测试$*,$#,$0-$9的作用
#by lixiang 2021年8月
echo "当前执行的脚本为:$0"
echo "第一个参数:$1"
echo ”第二个参数:$2"
echo "一共输入多少个参数:$#"
echo ”所有的参数为:$*"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

2.2.常见的符号
>				#输出重定向(覆盖)
>> 				#输出重定向(追加)
;				#执行多条命令
|				#管道符
&&				#前一条命令执行成功才会执行后面
||				#前一条命令执行失败才会执行后面
""				#输出变量识别通配符
''				#输出本身
``				#优先执行,放在``中会识别成命令执行
2>/dev/null		#错误输出到无底洞
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
2.3.计算运算符及linux中的计算器

整数形式

(1)整数相加

  • 常量
方式一:expr 13 + 12
方式二:echo $[13 + 12]
方式三:echo $((13 + 12))
  • 1
  • 2
  • 3

在这里插入图片描述

  • 变量
方式一:expr $a + $b
方式二:echo $[a + b]
方式三:echo $((a + b))
  • 1
  • 2
  • 3

在这里插入图片描述

(2)整数相减

  • 常量
方式一:expr 13 - 12
方式二:echo $[13 - 12]
方式三:echo $((13 - 12))
  • 1
  • 2
  • 3

在这里插入图片描述

  • 变量
方式一:expr $a - $b
方式二:echo $[a - b]
方式三:echo $((a - b))
  • 1
  • 2
  • 3

在这里插入图片描述

(3)整数相乘(注意:expr 执行 *为通配符,需要加 \ *进行转义)

  • 常量
方式一:expr 13 \* 12
方式二:echo $[13 * 12]
方式三:echo $((13 * 12))
  • 1
  • 2
  • 3

在这里插入图片描述

  • 变量
方式一:expr $a \* $b
方式二:echo $[a * b]
方式三:echo $((a * b))
  • 1
  • 2
  • 3

在这里插入图片描述

(4)整数相除

  • 常量
方式一:expr 13 / 12
方式二:echo $[13 / 12]
方式三:echo $((13 / 12))
  • 1
  • 2
  • 3

在这里插入图片描述

  • 变量
方式一:expr $a / $b
方式二:echo $[a / b]
方式三:echo $((a / b))
  • 1
  • 2
  • 3

在这里插入图片描述

(5)整数求余

  • 常量
方式一:expr 13 % 12
方式二:echo $[13 % 12]
方式三:echo $((13 % 12))
  • 1
  • 2
  • 3

在这里插入图片描述

  • 变量
方式一:expr $a % $b
方式二:echo $[a % b]
方式三:echo $((a % b))
  • 1
  • 2
  • 3

在这里插入图片描述

小数形式

  • 借助bc计算器,保留多少为小数可以通过sacle,但是scale只对除法,取余数,乘法有效,对加减无效

(1)1.2+1.3 保留两位小数

 echo "scale=2;(1.2 + 1.2)/1" | bc
  • 1

在这里插入图片描述

2.4.常见的条件判断
  • 语法:[ 判断表达式 ]

文件夹或者路径

-e:目标是否存在(exist)
-d:是否为目录(directory)
-f:是否为文件(file)
  • 1
  • 2
  • 3

(1)判断是否存在lixiang.sh文件

[ -e lixiang.sh ] && echo "存在"
  • 1

在这里插入图片描述

(2)判断lixiang.sh是不是一个文件

[ -f lixiang.sh ] && echo "YES"
  • 1

在这里插入图片描述

(3)判断lixiang.sh谁不是一个目录

[ -d lixiang.sh ] || echo "NO"
  • 1

在这里插入图片描述

权限

-r:是否有读权限(read)
-w:是否有写入权限(write)
-x:是否有执行权限(excute)
  • 1
  • 2
  • 3

(1)判断lixiang.sh是否有读权限

[ -r lixiang.sh ] && echo "YES"
  • 1

在这里插入图片描述

(2)判断lixiang.sh是否有写权限

[ -w lixiang.sh ] && echo "YES"
  • 1

在这里插入图片描述

(2)判断lixiang.sh是否有执行权限

[ -x lixiang.sh ] || echo "NO"
  • 1

在这里插入图片描述

整型数值比较

-eq:等于(equals)
-ne:不等于(not equals)
-gt:大于(greater than)
-lt:小于(lesser than)
-ge:大于或等于(greater or equal)
-le:小于或等于(lesser or equal)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(1)判断2和2是否相等

[ 2 -eq 2 ] && echo "YES"
  • 1

在这里插入图片描述

(2)判断2和3是否相等

[ 2 -ne 3 ] && echo "YES"
  • 1

在这里插入图片描述

(3)判断2是否大于3

[ 2 -gt 3 ] || echo "NO"
  • 1

在这里插入图片描述

字符串判断

=:相等
!=:不相等
  • 1
  • 2

(1)判断字符串是否相等

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

在这里插入图片描述

浮点型判断

(1)判断1.2是否小于1.3

[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo "YES" 
  • 1

在这里插入图片描述

3.shell脚本的输入以及特效的输出

3.1.shell脚本输入之read命令

语法:read -参数

-p:给出提示符,默认不支持”\n“换行
-s:隐藏输入的内容
-t:给出等待的时间,超出会推出read
-n:限制读取自渡川的个数,触发时到临界的值会自动执行
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

3.2.shell脚本输出上色

语法: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;37;5m 伟哥哥牛X!!! \033[0m"
		echo -e "\033[41;30;5m 轩哥哥牛X!!! \033[0m"
		echo -e "\033[42;34;5m 军哥哥牛X!!! \033[0m"
		echo -e "\033[43;34;5m 峰哥哥牛X!!! \033[0m"
		echo -e "\033[44;30;5m 博哥哥牛X!!! \033[0m"
		echo -e "\033[45;30;5m 杰哥哥牛X!!! \033[0m"
		echo -e "\033[46;30;5m 磊哥哥牛X!!! \033[0m"
		echo -e "\033[47;34;5m 想哥哥牛X!!! \033[0m"
		echo -e "\033[41;30;5m 琪哥哥牛X!!! \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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

4.grep、cut、awk、sed命令

4.1.grep:通常对数据进行行的提取

语法:grep [选项]…[内容]…file

-v:对内容进行取反
-n:显示行号
-w:精确查找
-i:忽略大小写
^:匹配开头行首
-E:支持扩展正则
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
4.2.cut:通常对数据进行列的提取

语法:cut [选项] …[file]

-d:指定分割符
-f:指定截取区域
-c:以字符为单位进行分割
  • 1
  • 2
  • 3
4.3.awk:通常对数据进行列的提取

语法:awk ‘条件{执行动作}’ 文件名

NR:表示行
NF:表示列
$NF:表示最后一列
$1:表示第一列
-F:指定分隔符
BEGIN:开始模块
	RS:输入换行符
	ORS:输出换行符(默认是\n)
	FS:输入记录分隔符
	OFS:输出记录分隔符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
4.4.sed:主要对数据行进行处理

语法:sed [选项] [动作] 文件名

-n:把匹配的行输出打印到屏幕
-p:通常与n一起使用
d:删除
a:在行的下面插入
i:在行的上面插入
c:整行替换
s###g:替换字符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.shell编程的循环控制语句

5.1.if循环控制(单分支与多分支)

(1)单个判断

if [ 执行条件 ]
then
执行语句
fi
  • 1
  • 2
  • 3
  • 4

(2)单个判断带else

if [ 执行条件 ]
then
执行语句
else
执行语句
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(3)多个判断

if [ 执行条件 ]
then
执行语句
elif [ 执行条件 ]
执行语句
.....
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
5.2.for循环控制
(1)for 变量名 in 值1 值2 值3 ....
do
执行语句
done
  • 1
  • 2
  • 3
  • 4
(2)for 变量名 in `命令`
do 
执行语句
done
  • 1
  • 2
  • 3
  • 4
(3)for ((条件))
do
执行动作
done
  • 1
  • 2
  • 3
  • 4
5.3.case循环控制

语法结构

case 变量 in
值1)
执行动作1
;;
值2)
执行动作2
;;
值3)
执行动作3
;;
....
esac
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
5.4.while循环

语法结构

while [ 执行条件 ]
do
执行语句
done
  • 1
  • 2
  • 3
  • 4

6.shell的常见用法

6.1.查看内存的使用量
#!/bin/bash
#查询内存的使用率
#by lixiang

total=`free -m | sed -n '2p' | awk '{print$2}'`
use=`free -m | sed -n '2p' | awk '{print$3}'`
free=`free -m | sed -n '2p' | awk '{print$4}'`

echo -e "当前内存总量:$total"
echo -e "当前内存使用情况:$use"
echo -e "当前内存剩余:$free"

used=`echo "scale=2;$use / $total * 100" | bc`
if [ `echo "$used > 10.00" | bc` -eq 1 ] 
then
echo "当前超出预警,内存使用率:$used%"
else
echo "当前内存正常,内存使用率:$used%"
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
6.2.批量创建新用户
  • 密码设置成用户名一样
#!/bin/bash
#批量创建用户
#by lixiang

read -p "请输入您要创建的用户前缀:" name
read -p "请输入您要创建的个数:" num

for ((i=1;i<=num;i++))
do
#先判断用户存不存在
cat /etc/passwd | awk -F ":" '{print$1}' | grep -E "${name}$i" 1>/dev/null
exist=`echo $?`
if [ $exist -eq 1 ]
then
#创建用户
useradd ${name}$i
#设置用户的密码
echo "${name}$i" | passwd --stdin ${name}$i > /dev/null && echo -e "用户名为:${name}$i , 密码为:${name}$i" >> new_user.txt
echo "用户${name}$i创建成功,密码请去/root/shell/new_user.txt中查看"
else
echo "${name}$i 用户已存在"
fi
done 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
6.3.数据库查询
#!/bin/bash
#查询数据库数据
#by lixiang 2021年8月
read -p "请输入要查询的人员姓名:" name
read -s -p "请输入数据库的用户名:" username

selectSql="select * from student.user where name = ${name}"

mysql -u${username} -p -e "${selectSql}"

exit

#登录数据库交互界面:/usr/local/mysql/bin/mysql -uroot -p 
#登录数据库非交互界面:/usr/local/mysql/bin/mysql -uroot -p -e "sql"
#查询当前数据库的所有库:show databases
#使用当前库:use student
#展示当前库的所有表:show tables
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
6.4.快速远程登录主机
#!/bin/bash
#远程登录机器
#by lixiang
read -p "请输入要登陆的主机名" name
IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'`
ssh ${IP}
echo "主机:${name},登录成功"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

done


#### 6.3.数据库查询

```bash
#!/bin/bash
#查询数据库数据
#by lixiang 2021年8月
read -p "请输入要查询的人员姓名:" name
read -s -p "请输入数据库的用户名:" username

selectSql="select * from student.user where name = ${name}"

mysql -u${username} -p -e "${selectSql}"

exit

#登录数据库交互界面:/usr/local/mysql/bin/mysql -uroot -p 
#登录数据库非交互界面:/usr/local/mysql/bin/mysql -uroot -p -e "sql"
#查询当前数据库的所有库:show databases
#使用当前库:use student
#展示当前库的所有表:show tables
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
6.4.快速远程登录主机
#!/bin/bash
#远程登录机器
#by lixiang
read -p "请输入要登陆的主机名" name
IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'`
ssh ${IP}
echo "主机:${name},登录成功"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/216075?site
推荐阅读
相关标签
  

闽ICP备14008679号