Linux初学(九)shell 脚本

一、shell 脚本编程

1.1 简介

shell脚本就是一个文件

在这个文件中包含了要批量自动执行的命令

写shell脚本的基本规范

第一步:用vi/vim创建一个后缀是.sh的文件

第二步:在文件中写入内容

  • 第一行是:#!/bin/bash 指定程序的解释器
  • 从第二行开始是文件的正文

第三步:保存退出

第四步:给shell脚本赋权【赋予执行权限x】

第五步:执行shell脚本

vi/vim

  • vim是vi的升级版
  • 建议使用vim
  • 可能需要安装vim
  • 安装vim的方法:
    • 配置好yum源
    • 开始安装:yum install vim -y

shell脚本的注释

shell脚本中,是用#进行注释

关于脚本赋权

写法1:

        chmod +x 脚本

写法2:

        chmod 777 脚本

执行shell脚本

./脚本

案例:

#!/bin/bashecho "Hello boys"
echo "程序开始执行....."
whoamiecho "当前用户是`whoami`"
echo "当前主机的地址是:·ip addr s ens33 | awk -F "[/ ]+" 'NR==3{print $3}'`"
# [/ ]+ 匹配一个或多个斜杠或空格字符useradd aaa01echo "程序执行结束....."

1.2 变量

什么是变量

值会发生变量的对象
name='tom'

  • name 是变量名
  • tom 是变量的值

定义变量

1. 定义的格式

  • 变量名=变量值 【=两边不能有空格】
  • 变量名不能用引号
  • 变量值可以用引号

2. 变量名的要求

  • 只能有数字、字母、下划线(_)
  • 不能以数字为开头
  • 变量名要做到见名知意
  • 建议定义格式
    • 单驼峰格式:stuName
    • 双驼峰格式:StuName
    • 下划线拼接:stu_name

使用变量

$变量名

撤销变量

unset 变量名

注意:关于单引号的问题

' '无法将变量名替换成变量的值

案例:定义变量Animal=log,输出结果是 there are many dogs

#!/bin/bashAnimal="dog"echo "there are many ${Animal}s"

1.3 用户交互

格式:

read -p "给用户的提示:" 变量名

提示信息是给用户看的

用户输入的内容会保存到后面这个变量中

案例:

#!/bin/bashread -p "请输入你的姓名:" stuName
read -p "请输入你的年龄:" stuAge
read -p "请输入你的性别:" stuGenderecho "姓名:$stuName,年龄:$stuAge,性别:$stuGender"

1.4 四则运算

shell中,默认会将变量作为字符串,包括数字

格式:

$[数学表达式]

案例:让用户输入三个数字,输出三个数字的和

#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
read -p "请输入第三个数字:" num3sum=$[$num1+$num2+$num3]echo "三个数字的和:$sum"

1.5 补充内容

命令执行状态值

输出结果重定向

命令执行状态值

执行状态是用来表示命令执行成功还是执行失败

命令的执行状态值,默认是不显示的

  • Linux命令执行成功,用0表示
  • Linux命令执行失败,用非0表示

用Linux的内置变量$?可以查看最近的一个命令的执行状态值

命令的执行输出有两种结果

输出结果:直接显示在终端上,给用户看的

状态结果:是给系统看的

输出重定向

输出重定向就是将原本要输出在终端中的内容,保存到一个文件中

重定向分为三种:

  • 正确输出重定向(1,默认就是1,所以可以省略)
  • 错误输出重定向(2,)
  • 全部输出重定向(&)

两种方法

>        将命令的输出结果保存到一个文件中

          如果文件不存在,就会创建一个新文件,然后将命令输出结果保存进去

          如果文件存在,那么会将原有内容清空,然后将命令输出结果保存进去

>>      将命令的输出结果保存到一个文件中

          如果文件不存在,就会创建一个新文件,然后将命令输出结果保存进去

          如果文件存在,那么在文件原有内容后追加

案例:让用户输入一个用户名,判断这个用户是否存在

#!/bin/bashread -p "请输入一个用户:" userNameid $userName &>/dev/null
echo "判断用户执行结果:$?"

1.6 if 判断

1.6.1 判断格式

单分支

if 判断表达式;then执行的命令     #判断条件成立的情况下,执行这里的语句执行的命令     #判断条件成立的情况下,执行这里的语句执行的命令     #判断条件成立的情况下,执行这里的语句
fi

双分支

if 判断表达式;then执行的命令     #判断条件成立的情况下,执行这里的语句执行的命令     #判断条件成立的情况下,执行这里的语句执行的命令     #判断条件成立的情况下,执行这里的语句
else执行的命令     #判断条件不成立的情况下,执行这里的语句执行的命令     #判断条件不成立的情况下,执行这里的语句执行的命令     #判断条件不成立的情况下,执行这里的语句
fi

多分支
 

if 判断表达式1;then执行的命令     #判断条件1成立的情况下,执行这里的语句执行的命令     #判断条件1成立的情况下,执行这里的语句
elif 判断表达式2;then执行的命令     #判断条件2成立的情况下,执行这里的语句执行的命令     #判断条件2成立的情况下,执行这里的语句
elif 判断表达式3;then执行的命令     #判断条件3成立的情况下,执行这里的语句执行的命令     #判断条件3成立的情况下,执行这里的语句
else执行的命令     #判断条件不成立的情况下,执行这里的语句执行的命令     #判断条件不成立的情况下,执行这里的语句
fi
1.6.2 判断对象

判断数字

  • 大小
  • 相等
  • 不相等

判断字符串

  • 相同
  • 不相同

判断文件

  • 判断文件类型

判断命令

  • 命令执行成功
  • 命令执行失败
1.6.3 判断数字

格式

[ 数字 判断符 数字 ]

判断符

-gt        大于

-lt         小于

-ge       大于等于

-le        小于等于

-ne       不等于

-eq       等于

案例:让用户输入两个数字,判断两个数字的和是否大于100

read -p "请输入一个数字:" num1
read -p "请输入另一个数字:" num2sum=$[$num1+$num2]if [ $sum -gt 100 ];thenecho "和大于100"
elif [ $sum -lt 100];thenecho "和小于100"
elseecho "等于100"
fi
1.6.4 判断字符串

==        判断相等

!=         判断不相等

判断格式

[ 字符串1 判断符 字符串2 ]

案例:让用户输入一个用户名,判断这个用户名的shell类型是/bin/bash

#!/bin/bashread -p "请输入用户名:" userName# 判断用户名是否存在
# 如果用户不存在,退出程序
grep "^$userName\>" /etc/passwd &>/dev/null
num=$?
if [ $num -ne 0 ];thenecho "没有${userName}这个用户"exit 5  # 退出程序,返回一个数字5
fi# 如果用户存在的情况下,执行这里的操作
# 获取这个用户的shell类型
shellType=`grep "^userName\>" /etcpasswd | awk -F ":" '{print $7}'`
# 判断shell类型
if [ $shellType == "/bin/bash" ];thenecho "用户的shell类型是/bin/bash"
elseecho "用户的shell类型不是/bin/bash"
fi
1.6.5 组合条件

&& 逻辑与,要求多个条件要同时满足,则为真

||    逻辑或,要求多个条件满足任意一个,则为真

!   逻辑非,对条件进行取反

案例:让用户输入账号和密码,检查用户的输入,如果账号是root,并且密码是123321,则提示登录成功,否则登录失败

#!/bin/bashread -p "请输入账号:" userName
read -p "请输入密码: " userPassif [ "a$userName:" == "aroot" ] && [ "a$userPass" == "a123321" ];thenecho "ok"
elseecho "error"
fi

扩展

&&    可以依次执行多个命令
        只有前面的命令执行成功,后面的才执行;如果前面的执行失败,后面的就不执行了
||      可以依次执行多个命令
        只有前面的命令执行失败,后面的命令才执行;如果前面的命令执行成功,后面就不执行了
1.6.6 判断文件

-a 判读文件是存在

-e 判读文件是存在

-f 判读文件是一般文件

-d 判断文件是目录文件

格式

[ 判断符号 文件名 ]

案例:让用户输入一个文件,判断文件类型

#!/bin/bash
read -p "请输入输入一个文件:" fileName
if [ -e $fileName ];thenif [ -f $fileName ];thenecho "这个文件是一般文件"elif [ -d $fileName ];thenecho "这个文件是目录文件"elseecho "我也不知道是个啥玩意"fi
elseecho "no such file"
fi
1.6.7 判断命令
判断命令执行成功还是执行失败
判断命令有两种格式
格式1:获取命令的状态值,然后判断这个值是否为0
格式2:直接判断命令
案例:让用户输入一个用户名,判断这个用户是否存在
read -p "请输入输入一个用户:" userNameid $userName &>/dev/null
num=$?
if [ $num -eq 0 ];thenecho "存在"
elseecho "不存在"
fi
1.6.8 判断变量是否为空

-n:当变量的值为非空的时候,返回真【条件成立】

-z:当变量的值为空的之后,返回则很难【条件成立】

 案例1:让用户输入一个ip,判断这个ip是否在线

方法一:

#!/bin/bashread -p "请输入一个ip:"ipAddrnum=`echo $ipAddr | wc -c`
if [ $num -le 1 ];thenecho "你没有输入内容,你想干啥?"exit 9
elseif ping -c1 -W1 $ipAddr &>/dev/null;thenecho "存在"elseecho "不存在"fi
fi

方法二:

#!/bin/bashread -p "请输入一个ip:"ipAddrif [ -z $ipAddr ];thenecho "你没有输入内容,你想干啥?"exit 3
elseif ping -c1 -W1 $ipAddr &>/dev/null;thenecho "存在"elseecho "不存在"fi
fi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络层介绍,IP地址分类以及作用

IP地址组成: TTL:生存时间 基于ICMP报文 特殊地址: 0.0.0.0-0.255.255.255 1.代表未指定的地址 默认路由 DHCP下发地址的时候,发个报文给DHCP服务器 临时用0.0.0.0借用地址,未指定地址。 2.全网地址:目…

nginx 日志配置

access_log access_log用来记录客户端请求访问日志,可以出现在http,server,location,if块中。语法如下: access_log path [format [buffersize] [gzip[level]] [flushtime] [ifcondition]];path用来指定日志存放路径&#xff0c…

【pytorch】安装合集

使用conda或者pip安装的指令 https://pytorch.org/get-started/previous-versions/ 测试pytorch_gpu是否可用的代码 # 测试pytorch是否安装成功 import torch print(torch.__version__) print(torch.cuda.is_available())

阐述el-dropdown(下拉菜单)的基本知识

目录 1. 基本知识2. Demo3. 实战 1. 基本知识 el-dropdown是一个常用的UI组件,用于创建下拉菜单,通常用于实现各种交互式菜单、导航栏或下拉选项 确保安装Element UI库,它包含了el-dropdown组件 npm install element-ui # 或者 yarn add e…

配置Web运行环境与第一个网页

安装与配置Web环境: 如下使用了VSC作为web的运行环境。 下面是VSC的官网点击进入:Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 1.下载 进入官网后可以看到有windows,linux,还有苹果按照自己的系统下载&…

Node Sass does not yet support your current environment

项目运行时报错:Node Sass does not yet support your current environment 原因是node版本过高。 解决办法: 使用nvm管理node版本,(如何安装nvm?请点击跳转) 具体步骤如下: 1.查看当前node…

Element UI中日期选择日(date-picker)等其他选择器下拉显示错位、位置错误解决

省流版 给选择器加上唯一key(下面的想看就看) 问题复现 需求是用一个下拉切换时间维度的选择,分别为年度、季度、月度,但是开发的时候发现,当切换的时候,视图可正常切换,但点击选择时却发现选…

软考系统架构设计师(摘抄)01

架构师承担的责任 系统架构师设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。系统架构师就是项目的总设计师,他是一个既需要掌控整体又需要洞悉局部瓶颈&a…

Vue 2 组件发布到 npm 的常见问题解决

按照 Vue 2 组件打包并发布到 npm 的方法配置项目后,项目在实际开发过程中,随着代码写法的多样性增加而遇到的各种打包问题,本文将予以逐一解决: 本文目录 同时导出多个组件 样式表 import 问题解决 Json 文件 import 问题解决…

图论最短路径以及floyd算法的MATLAB实现

图论是数学的一个分支,起源于18世纪。1736年,数学家欧拉通过解决“哥尼斯堡七桥问题”,将问题抽象成点和线的关系,并通过理论分析得出结论,这个过程标志着图论的产生,欧拉也因此被称为“图论之父”。图论研…

智慧城市解决方案大全:标准规范顶层设计指南、整体解决方案、厂商售前宣讲PPT、招投标、智慧城市白皮书等全套680份,一次性打包下载

关键词:智慧城市,智慧城市解决方案,智慧城市发展的前景与趋势,智慧城市概念主力流出,智慧城市项目包括哪些方面,智慧城市项目方案,智慧城市宣传片,智慧城市白皮书,智慧城…

MySQL之MVCC如何实现可重复读和提交读

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:Github传送门 🍹 本人24应届生一枚,技术和水平有…

教程3_图像的轮廓

目录 目标 1. 特征矩 2、轮廓质心 3. 轮廓面积 4. 轮廓周长 5. 轮廓近似 6. 轮廓凸包 7. 边界矩形 7.1.直角矩形 7.2. 旋转矩形 8. 最小闭合圈 9. 拟合一个椭圆 10. 拟合直线 目标 在本文中,我们将学习 - 如何找到轮廓的不同特征,例如面积&…

力扣 217.存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true 示例 2: 输入:num…

Ansible剧本playbooks详解

一、playbook简介 playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装&#x…

nginx负载均衡模式

轮询 (Round Robin) 用法:这是Nginx默认的负载均衡策略。每个请求会按顺序分配给upstream中的后端服务器,即按照配置的服务器列表顺序依次分配。 upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.c…

【Java】LinkedList vs. ArrayList:Java中的数据结构选择

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

docker日志大小设置(doker logs)

参考文章docker logs日志上限(日志容量上限、日志大小上限)(默认大小、默认日志大小)_docker 日志限制-CSDN博客 如果想要更改 Docker daemon 的全局默认设置,可以修改 Docker daemon 的配置文件 /etc/docker/daemon…

zookeeper--Znode类型详解---面试宝典

一、Znode分类 1、persistent_node 持久化节点 是默认类型,该类型节点,并不会随着客户端断开就会自动删除;zookeeper服务重启该节点也不会被删除,只有手动删除的时候才会删除;可以创建子节点; # create …

uniapp开发小程序遇到的问题,持续更新中

一、uniapp引入全局scss 在App.vue中引入uni.scss <style lang"scss">/* #ifndef APP-NVUE */import "uni.scss";/* #endif */ </style>注意&#xff1a;nvue页面的样式在编译时&#xff0c;有很多样式写法被限制了&#xff0c;容易报错。所…