shell 脚本语句

目录

条件语句

test 命令

比较整数数值

字符串比较

命令举

条件逻辑测试操作

组合写法

举例

双中括号

​编辑

( ) / { }

if 语句的结构

case 语句

脚本举例

识别 yes 和 no 脚本

检查磁盘使用情况脚本

新建用户以及随机设置用户密码的脚本

补充命令

[RANDOM%3+1]

ping 小脚本

make -j2

df -h |grep boot|awk '{print $5}'|tr -d %

grep -q

id -u

文件表达式


条件语句

test 命令

test作用
-d测试是否为目录
-e测试文件是否存在,不分文件和目录
-a测试目录或文件是否存在,有 bug 不建议使用
-f测试是否为文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行
-l检测是否为软连接文件

比较整数数值

—— 格式:[ 整数1 -选项 整数2 ] 公式

选项作用
-eq第一个数 等于(Equal) 第二个数
-ne第一个数 不等于(Not Equal) 第二个数
-gt第一个数 大于(Greater Than) 第二个数
-lt第一个数 小于(Lesser Than) 第二个数
-le第一个数 小于或等于(Lesser or Equal) 第二个数
-ge第一个数 大于或等于(Greater or Equal) 第二个数

字符串比较

符号格式作用
=[ 字符串1 = 字符串2 ]字符串内容相同
!=[ 字符串1 != 字符串2 ]字符串内容不同,!号表示取反
-z[ -z 字符串 ]字符串内容为空
-n[ -n 字符串 ]字符是否存在
命令举
[root@localhost ~]# text1=yuan      #定义 text1
[root@localhost ~]# text2=shen      #定义 text2

#因为二者不同,此举是比较相同字符串,所以命令错误,显示为 1
[root@localhost ~]# [ $text1 = $text2 ];echo $?
1     #正确则显示 0 ,反之为错误输出 
#因为二者不同,此举是比较不同字符串,所以命令正确,显示为 0
[root@localhost ~]# [ $text1 != $text2 ];echo $?
0

[root@localhost ~]# text3=          #定义 text3,不输入内容
#因为 text3 没有内容,此举是查看字符串内容为空
[root@localhost ~]# [ -z $text3 ];echo $?
0
[root@localhost ~]# [ -z $text2 ];echo $?
1

条件逻辑测试操作

—— 格式:[ 表达式1 ] 操作符 [ 表达式2 ]

命令1 操作符 命令2

选项注释
-a 或 &&逻辑与,表示且的意思
-o 或 ||逻辑或,表示或的意思
逻辑否,取反

短路与 &&

全真才为真

一假即为假

—— 例:命令1 操作符 命令2 / [ 表达式1 ] 操作符 [ 表达式2 ]

其中一个错则不执行,必须两个都是正确的才能执行

短路或 ||

一真即为真

全假才为假

—— 例:命令1 操作符 命令2 / [ 表达式1 ] 操作符 [ 表达式2 ]

其中一个正确的就可以执行,必须两个都错才不执行

组合写法

先 短路与 后 短路或

—— 只有这一种组合写法

举例
#上一条命令执行成功
[root@localhost opt]# echo $?
0
#等于0,执行成功,所以直接显示且(&&)后面的内容
[root@localhost opt]# [ $? -eq 0 ] && echo "成功" || echo "失败"
成功
#不大于0,执行失败,所以直接显示或(||)后面的内容
[root@localhost opt]# [ $? -gt 0 ] && echo "成功" || echo "失败"
失败

双中括号

—— [[ ]] 加强版的单个 [ ] ,可以支持正则表达式和通配符(字符)

[[ ]] 用法

[[ == ]] :左侧字符串是否和右侧的 pattern 相同

右侧接通配符

[[ =~ ]] :左侧字符串是否能够被右侧的正则表达式的 pattern 所匹配

右侧接正则表达式

[[ != ]] :取反

[root@localhost opt]# q=text.log
​
[root@localhost opt]# [[ "$q" == *.log ]] ;echo $?
0
[root@localhost opt]# [[ "$q" != *.log ]] ;echo $?
1
[root@localhost opt]# [[ "$q" =~ *.log ]] ;echo $?
2
​
[root@localhost ~]# w=text.sh
​
[root@localhost ~]# [[ "$w" =~ sh$ ]];echo $?
0
[root@localhost ~]# [[ "$w" =~ *.sh ]];echo $?
2
[root@localhost ~]# [[ "$w" =~ *.sh$ ]];echo $?
2


( ) / { }

—— 作用:二者都可以将多个命令组合在一起,批量执行

—— ( ) :会开启子 shell

—— { }:不会开启子shell


if 语句的结构

#单分支
​
if 判断条件
then
条件为真的分支代码       #当判断条件成立,执行一跳或多条命令
fi                    #结尾
​
​
#双分支
​
if 判断条件
then
条件为真的分支代码       #当条件判断成立时,可以执行一条或多条命令
else
条件为假的分支代码       #当条件判断不成立时,可以执行一条或多条命令
fi             
​
​
#多分支
​
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3
then
条件3为真的分支代码
​
......
else
以上条件都为假的分支代码     #托底,当上述都不成立,执行一条或多条命令
​

case 语句

​
#格式
​
case 变量名称 in
模式1)
命令序列
;;
模式2)
命令序列
;;
​
.
.
.
​
*)                     #不包含第一个变量内容与第二个变量内容的其他程序执行段
默认程序段
;;
esac                   #结尾
​
#注意
模式字符串中,可以用方括号表示一个连续的范围,如 "[0-9]";还可以使用竖杠 | 表示或,比如 a|b
最后的“)”表示默认模式,其中的相当于通配符
​

脚本举例

识别 yes 和 no 脚本

#!/bin/bash
read -p "请输入yes/no:" yn
yn=`echo $yn|tr 'A-Z' 'a-z'` #无论 yes 或 no 怎么输入,都能识别;YeS On
case $yn in
yes|y)
echo "识别为yes"
;;
no|n)
echo "识别为no"
;;
​
*)
echo "无法识别,重新输入"
bash $0
;;
esac
 
检查磁盘使用情况脚本


#!/bin/bash
use=`df -h|grep boot|awk '{print $5}'|tr -d %`
​
[ $use -gt 80 ] && echo "磁盘使用过高"||echo "磁盘使用正常"
​

新建用户以及随机设置用户密码的脚本

​
#!/bin/bash
read -p "告诉我你要新建用户的名字:" name
​
grep -q $name /etc/passwd
if [ $? -eq 0 ]
then
echo "该用户已经存在了"
exit
else
useradd $name
pass=`cat /dev/random |tr -dc [[:alnum:]] |head -c 12`
#进入到随机生成字符的文件中,并且删除所有的特殊符号,打印前 12 个字符
echo $pass |passwd $name --stdin
#将 $pass 执行的标准输出的结果,标准输入到 $name 定义的用户的 passwd 命令中,为该用户的密码
echo $pass >> /opt/mima.txt
#在 /opt 目录下新建文件 mima.txt 并将打印出来的前 12 个字符保存其中 
fi
​
​

补充命令

[RANDOM%3+1]

—— 限制范围 1到 3

ping 小脚本

—— -W(大写):超过时间,默认单位秒

—— -w :多少秒后停止 ping 操作

—— -c :发送包的个数

—— -i :发送的间隔时间

例
$1=192.168.88.1               #定义 IP
​
ping -c 3 -i 0.5 -W2 $1 &> /dev/null && echo "$1 online" || echo "$1 off"
#ping $1 定义的 IP 次数 3 次,发送间隔时间为 0.5秒,超时 2秒 并将标准输出的信息放入垃圾箱,ping 成功显示 online ,失败则显示 off
#注意 W 为大写

make -j2

—— 命令可以开启 2 个任务同时运行,并行构建大大加快构建速度

df -h |grep boot|awk '{print $5}'|tr -d %

—— awk :是一种文本处理工具,它可以用于从文件或标准输入中提取和操作数据。它以行为单位读取输入,并根据指定的规则进行处理

—— print $5 :压缩空格,默认打印第五列

grep -q

—— 悄悄的执行命令,不显示

id -u

—— 判断当前用户是否为管理员

文件表达式
格式:选项 文件名作用
-e如果文件存在,则为真
-d如果文件为目录,则为真
-f如果文件为常规文件,则为真
-L如果文件为符号连接,则为真
-r如果文件可读,则为真
-w如果文件可写,则为真
-x如果文件可执行,则为真
-s如果文件长度不为0,则为真
-h如果文件是软链接,则为真

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++进阶之路】第五篇:哈希

文章目录 一、unordered系列关联式容器1.unordered_map(1)unordered_map的介绍(2)unordered_map的接口说明 2. unordered_set3.性能对比 二、底层结构1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决(1)闭散…

【C++】C++11(1)

文章目录 一、C11简介二、统一的列表初始化1.{}初始化2.std::initializer_list 三、声明1.auto2.decltype3.nullptr 四、STL中一些变化五、右值引用和移动语义1.左值引用和右值引用2.左值引用与右值引用比较3.右值引用使用场景和意义4.右值引用引用左值及…

什么是办公RPA?办公RPA解决什么问题?办公RPA实施难点在哪里?

什么是办公RPA? 办公RPA是一种能够模拟人类在计算机上执行任务的自动化软件。它可以在没有人工干预的情况下,执行重复的、规则化的任务,例如数据输入、网页爬取、电子邮件管理等。办公RPA可以帮助企业提高工作效率,降低人力成本&…

px4+vio实现无人机室内定位

文章主要讲述px4 如何利用vins_fusion里程计数据实现在室内定位功能。 文章基于以下软、硬件展开。 硬件软件机载电脑: Intel NUC系统:Ubuntu 20.04相机: Intel Realsense D435iros:noetic飞控:Pixhawk 2.4.8固件&am…

Golang基础-面向对象篇

文章目录 struct结构体类的表示与封装类的继承多态的基本要素与实现interface空接口反射变量的内置pairreflect包解析Struct TagStruct Tag在json中的应用 struct结构体 在Go语言中,可以使用type 关键字来创建自定义类型,这对于提高代码的可读性和可维护…

城市易涝点怎么安装万宾科技内涝积水监测仪?

城市内涝是多个城市广泛存在的问题,经常给城市的居民和基础设施带来一些安全威胁。暴雨引发的道路积水和交通中断、财产损失,甚至公共安全威胁都是城市管理者需要提前预防的问题。为了解决这些问题,内涝积水监测仪的应用是一大重要的举措&…

2021秋招-算法-递归

算法-递归 教程: ⭐告别递归,谈谈我的一些经验 LeetCode刷题总结-递归篇 基础框架 leetcode刷题 1.leetcode-101. 对称二叉树-简单 101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。…

docker通过挂载conf文件启动redis

初衷:之前直接在启动脚本中没有挂载配置文件,并且直接设置了密码等,后续要使用集群,苦于无法修改配置,进入redis容器也找不到redis.conf,所以写这个文章用来使用redis的配置,来达到后续都可动态…

基于51单片机音乐盒LCD1602显示( proteus仿真+程序+原理图+设计报告+讲解视频)

基于51单片机音乐盒LCD1602显示( proteus仿真程序原理图设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0065 音乐盒 1. 主要功能:2. 讲解视频:3. 仿真…

阿里云ECS服务器如何搭建并连接FTP,完整步骤

怎么用终端连接服务器就不多说了,直接开始搭建FTP。 我是用root账号执行的命令,如果不使用root账号,注意在命令前面加sudo。 一、安装FTP 我这里安装的是vsftpd。 1、检查是否已安装vsftpd: vsftpd -v如果出现了版本信息&…

(一)pytest自动化测试框架之生成测试报告(mac系统)

前言 我们可以通过pytest-html插件来生成测试报告,但是pytest-html插件生成的测试报告不够美观,逼格也不够高,通过allure生成的测试报告是比较美观的,花里胡哨的,能够提升一个level。 allure官网: Allure…

php反序列化漏洞

php反序列化漏洞 什么是序列化 在数据传输过程中有可能会丢失,那么这时候就出现了序列化,序列化可以将对象的状态信息转换为可以存储或传输的形式。 什么是反序列化 反序列化就是将字符串转化为对象的状态信息,反序列化是序列化的逆过程&…

微信小程序面试题【100道】

文章目录 小程序面试题100问前言一、技术性问题1.有哪些参数传值的方法2.小程序修改数据值与Vue和React有什么差异3.如何实现下拉刷新与上拉加载4.bindtap和catchtap的区别是什么5.小程序有哪些导航API,它们各自的应用场景与差异区别是什么6.小程序中如何使用第三方…

Pycharm run 输出界面控制一行能够输出的元素个数

Pycharm run 输出界面控制一行能够输出的元素个数 今天遇到了一个问题,当我们在 Pycharm 中打印输出数组时,如果数组一行的元素个数过多,那么我们在打印时就会出现以下问题。 代码如下: import numpy as npx np.array([[0., 0.7…

UI for Apache Kafka

文章Overview of UI Tools for Monitoring and Management of Apache Kafka Clusters | by German Osin | Towards Data Science中介绍了8种常见的kafka UI工具,这些产品的核心功能对比信息如下图所示, 通过对比发现 UI for Apache Kafka 功能齐全且免费,因此可以作为我们的首…

HTML5生成二维码

H5生成二维码 前言二维码实现过程页面实现关键点全部源码 前言 本文主要讲解如何通过原生HTML、CSS、Js中的qrcodejs二维码生成库,实现一个输入URL按下回车后输出URL。文章底部有全部源码,需要可以自取。 实现效果图: 上述实现效果为&#…

随笔-事儿就这么个事儿

好久没写了,小A要催更,还答应让我写一下他的经历,这还有啥说的,开整。 1、升级 前段时间登录公司的办公系统处理一个事务申请,发现有个粗体标红的通知,是关于今年的晋升名单公示。进去看了一眼&#xff0…

练习7-在Verilog中使用任务task

在Verilog中使用任务task 1,任务目的2,RTL代码,交换3,测试代码4,波形显示 1,任务目的 (1)掌握任务在verilog模块设计中的应用; (2)学会在电平敏感…

从零开始学习typescript——变量

就像我们在学校学习语文、英文时候一样,最开始学习的是语法,要知道基础的结构。 图片中包含 变量、标识符、数据类型、运算符、字面量、表达式、控制语句等语法 变量 变量是使用给定的符号名在内存中申请存储地址,并且可以容纳某个值。 语…