首页 > 系统相关 >Shell脚本零基础入门

Shell脚本零基础入门

时间:2023-01-18 14:00:12浏览次数:26  
标签:脚本 shell 入门 name lixiang echo Shell 033 0m

文章目录

1.shell脚本入门

1.1.shell的简介

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

1.2.shell的应用场景

shell主要开发一些实用的、自动化的小工具,而不是用来卡法复杂的业务逻辑的
(1)监控linux环境变量的使用情况
(2)数据的处理,日志的切割、分析、统计等
(3)与数据库的交互,对数据库进行增删改查
(4)监控进程,自动化启停服务进程
(5)完成一些重复性的工作,创建100哥新用户或者配置某个文件等等

1.3.shell常见的解释器

解释器:一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行

四种解释器:
#!/bin/bash(默认)
#!/bin/ksh
#!/bin/bsh
#!/bin/sh
  • 注意:shell脚本运行不一定需要解释器,有些脚本没有解释器也可以运行

1.4.shell脚本文件权限与脚本执行

  • 文件创建默认是没有执行权限的,所以要给加上权限:chmod u+x sh结尾的文件。
  • 执行shell脚本的方法:
方法一:sh 文件名
方法二:bash 文件名
方法三:./文件名
方法四:source 文件名 

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

2.1.常见变量

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

(1)= 等号的作用

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

Shell脚本零基础入门_开发语言

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

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

Shell脚本零基础入门_开发语言_02

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

echo "$?"

Shell脚本零基础入门_shell脚本_03

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

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

Shell脚本零基础入门_bash_04

2.2.常见的符号

>				#输出重定向(覆盖)
>> 				#输出重定向(追加)
;				#执行多条命令
|				#管道符
&&				#前一条命令执行成功才会执行后面
||				#前一条命令执行失败才会执行后面
""				#输出变量识别通配符
''				#输出本身
``				#优先执行,放在``中会识别成命令执行
2>/dev/null		#错误输出到无底洞

2.3.计算运算符及linux中的计算器

整数形式

(1)整数相加

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

Shell脚本零基础入门_开发语言_05

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

Shell脚本零基础入门_shell脚本_06

(2)整数相减

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

Shell脚本零基础入门_开发语言_07

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

Shell脚本零基础入门_shell脚本_08

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

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

Shell脚本零基础入门_开发语言_09

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

Shell脚本零基础入门_shell脚本_10

(4)整数相除

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

Shell脚本零基础入门_bash_11

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

Shell脚本零基础入门_linux_12

(5)整数求余

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

Shell脚本零基础入门_shell脚本_13

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

Shell脚本零基础入门_linux_14

小数形式

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

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

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

Shell脚本零基础入门_linux_15

2.4.常见的条件判断

  • 语法:[ 判断表达式 ]

文件夹或者路径

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

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

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

Shell脚本零基础入门_linux_16

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

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

Shell脚本零基础入门_shell脚本_17

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

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

Shell脚本零基础入门_开发语言_18

权限

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

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

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

Shell脚本零基础入门_开发语言_19

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

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

Shell脚本零基础入门_linux_20

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

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

Shell脚本零基础入门_shell脚本_21

整型数值比较

-eq:等于(equals)
-ne:不等于(not equals)
-gt:大于(greater than)
-lt:小于(lesser than)
-ge:大于或等于(greater or equal)
-le:小于或等于(lesser or equal)

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

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

Shell脚本零基础入门_bash_22

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

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

Shell脚本零基础入门_bash_23

(3)判断2是否大于3

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

Shell脚本零基础入门_bash_24

字符串判断

=:相等
!=:不相等

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

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

Shell脚本零基础入门_开发语言_25

浮点型判断

(1)判断1.2是否小于1.3

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

Shell脚本零基础入门_bash_26

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

3.1.shell脚本输入之read命令

语法:read -参数

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

Shell脚本零基础入门_linux_27

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"

4.grep、cut、awk、sed命令

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

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

-v:对内容进行取反
-n:显示行号
-w:精确查找
-i:忽略大小写
^:匹配开头行首
-E:支持扩展正则

4.2.cut:通常对数据进行列的提取

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

-d:指定分割符
-f:指定截取区域
-c:以字符为单位进行分割

4.3.awk:通常对数据进行列的提取

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

NR:表示行
NF:表示列
$NF:表示最后一列
$1:表示第一列
-F:指定分隔符
BEGIN:开始模块
	RS:输入换行符
	ORS:输出换行符(默认是\n)
	FS:输入记录分隔符
	OFS:输出记录分隔符

4.4.sed:主要对数据行进行处理

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

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

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

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

(1)单个判断

if [ 执行条件 ]
then
执行语句
fi

(2)单个判断带else

if [ 执行条件 ]
then
执行语句
else
执行语句
fi

(3)多个判断

if [ 执行条件 ]
then
执行语句
elif [ 执行条件 ]
执行语句
.....
fi

5.2.for循环控制

(1)for 变量名 in 值1 值2 值3 ....
do
执行语句
done
(2)for 变量名 in `命令`
do 
执行语句
done
(3)for ((条件))
do
执行动作
done

5.3.case循环控制

语法结构

case 变量 in
值1)
执行动作1
;;
值2)
执行动作2
;;
值3)
执行动作3
;;
....
esac

5.4.while循环

语法结构

while [ 执行条件 ]
do
执行语句
done

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

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 

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

6.4.快速远程登录主机

#!/bin/bash
#远程登录机器
#by lixiang
read -p "请输入要登陆的主机名" name
IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'`
ssh ${IP}
echo "主机:${name},登录成功"

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

6.4.快速远程登录主机

#!/bin/bash
#远程登录机器
#by lixiang
read -p "请输入要登陆的主机名" name
IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'`
ssh ${IP}
echo "主机:${name},登录成功"

标签:脚本,shell,入门,name,lixiang,echo,Shell,033,0m
From: https://blog.51cto.com/u_15646271/6019235

相关文章

  • SpringShell使用说明
    一、添加依耐(pom.xml)<dependency><groupId>org.springframework.shell</groupId><artifactId>spring-shell-starter</artifactId><version>2.1.4</version><......
  • Android shell提权
    Androidshell提取原理+中转https://www.jianshu.com/p/8d30b1d42031 android内执行shell的几种解决方案熟悉adbshell的小伙伴可能知道,很多android设备的信息,是可......
  • windows关机与重启bat脚本
    电脑设置每天定时关机1、同时按下Windows徽标键+R键,调出“运行”框;在“运行”框中输入命令control,并点击“确定”,即可打开控制面板2、打开控制面板后,右上角可以切换不同......
  • Jmeter元件BeanShell 取样器调用Java代码处理时间
    在测试过程中经常会遇到一些接口中的参数需要进行处理时间格式,比如当前时间、当前日期,当月一号,下个月一号等等,下面我们就使用Jmeter元件BeanShell取样器调用Java代码进行处......
  • windows powershell运行ps1提示缺少某些package或driver
    在做自动化的时候我们用windowspowershell(命令:powershell绝对路径)运行ps1报错如下但是如果先进入powershell然后cd到ps1所在路径下运行ps1则不会报错\\如何解决:......
  • PYNQ-Z2启动NutShell(果壳处理器)——修正官方文档错误
    Compilechiselcode这里是英文版,之后会编写一个中文beforestart,gitcheckoutrelease-21228Installmill.RefertotheManualsectioninthisguide.Run......
  • Xshell连接虚拟机Linux踩坑记录
    ​​欢迎光临我的个人主页​​我使用的是桥接模式,没有做其他修改网卡配置的设置,在windows下可以ping通虚拟机上的Linux,但是Xshell依旧连不上Linux在终端输入:ps-e|g......
  • Web安全入门与靶场实战(9)- 利用Burpsuite拦截HTTP数据
    在Web安全中经常需要对HTTP请求和响应的数据进行拦截,从而来对这些数据做进一步的分析或处理,这就要用到一个非常重要的工具Burpsuite。Burpsuite可谓Web安全的神器,要学习Web......
  • pnpm : 无法加载文件 \AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本
    1.安装pnpmnpminstall-gpnpm#安装pnpmpnpm--version#查看pnpm版本安装完成后查看版本时报错pnpm:无法加载文件C:\Users\123\AppData\Roaming\npm\pnpm.p......
  • SpringCloud-入门简介
    https://www.cnblogs.com/xuwc/p/13995814.html参考:https://www.cnblogs.com/lizm166/p/11156311.htmlhttps://www.cnblogs.com/senlinyang/p/8591294.htmlhttps://zhu......