【Linux】shell脚本二

 2、接收用户的参数

shell脚本已经内设了用于接收用户输入参数的变量,变量之间可以使用空格隔开。

如:./test.sh one two three four

  • $0:对应的是当前shell脚本程序的名称,即test.sh
  • $#:对应的是总共有几个参数,此条命令总共有4个参数
  • $*:对应的是所有位置的参数值,分别是one two three four
  • $?:对应的是显示上一次命令的执行返回值
  • $1:对应的是第1个参数,即one
  • $2:对应的是第2个参数,即two

3、条件表达式

shell脚本中的条件测试语句可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其它随机数值。

如:[ cd /home/ln ],注意条件表达式的两边都必须要有一个空格

文件测试语句

它是使用指定条件来判断文件是否存在或权限是否满足等情况的运算符。

# 判断/home/ln是否为一个目录类型的文件[ -d /home/ln ]
echo $? # 如果返回值是0,则目录存在;如果返回值为非零值,则目录不存在
文件测试语句的相关参数
-d测试文件是否为目录类型
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行

 逻辑测试语句

用于对测试结果进行逻辑分析,根据测试结果实现不同的效果。

逻辑“与”:&&。表示当前面的命令执行成功后才会执行它后面的命令。

# 先判断/home/ln是否存在,若存在则输出Exist
[ -e /home/ln ] && echo "Exist"

逻辑“或”:|| 。表示当前面的命令执行失败后才会执行它后面的命令。

# 先判断当前登录的用户是否是root管理员身份,若是,则不执行后面的命令;若不是,则执行后面的命令。
[ $USER = root ] || echo "user"

逻辑“非”:! 。表示把条件测试中的结果取相反值。

# 先判断当前登录用户是否是root用户,如果是,取反后,变为不是,则执行后面的语句
[ !$USER = root ] || echo "administrator"

由于当前登录的账号是root账号,那么第一个条件取反后为假,则不会执行 echo "user"语句,就会执行echo "root"语句。

# 当前登录的账号为root账号
[ !$USER = root ] && echo "user" || echo "root" #输出root

整数值比较语句

整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作。

如:[ 10 -gt 10 ]

整数比较运算符
-eqequal,是否等于
-nenot equal,是否不等于
-gtgreater than,是否大于
-ltless than,是否小于
-leless equal,是否等于小于
-gegreater equal,是否大于等于

字符串比较语句

用于判断测试字符串是否为空值,或两个字符串是否相同。经常用来判断某个变量是否未被定义(即内容为空值)。

# 当前语系的环境变量值LANG不是英语(en.US).
[ $LANG != "en.US" ] && echo "Not en.US" # 执行结果:Not en.US
字符串比较运算符
=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为空

4、流程控制语句

if条件语句

单分支结构:由if、then、fi关键词组成。

#!/bin/bash
DIR="/home/LN"
if [ ! -e $DIR ] # 判断该目录是否存在,如果不存在则创建then mkdir -p $DIR
fi

双分支结构:由if、then、else、fi关键词组成。

 如下所示,编写一个ping.sh脚本,执行语句:bash ping.sh 192.168.1.101。

/dev/null:

是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。

#!/bin/bash
#-c是规定尝试ping的次数为3次;-i表示每个数据包发送间隔为0.2s;-W表示等待的超时时间为3s
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ] # $?显示上一次命令的执行返回值,如果上一条命令 成功执行,则返回0,否则,返回非0thenecho "Host $1 is on-line."
elseecho "Host $1 is off-line."
fi

 多分支结构:由if、then、else、elif、fi关键词组成

如下所示例子,编写score.sh脚本:read用来读取用户输入信息的命令,它能够把接收到的用户输入信息赋值给后面的指定变量;-p参数用来向用户显示一定的提示信息。

#!/bin/bash
read -p "Enter your score(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]then echo "$GRADE is excellent!!"
elif [$GRADE -ge 70 ] && [ $GRADE -le 84 ]then echo "$GRADE is good!"
elseecho "$GRADE is fail!"
fi

for循环语句

如下所示例子,先创建一个user.txt文档,里面有多个用户名,然后编写脚本。

#!/bin/bash
read -p "Enter the users password:" PASSWORD
for UNAME in `cat users.txt`
doid $UNAME &> /dev/nullif [ $? -eq 0 ]then echo "Username already exists."elseuserad $UNAME &> /dev/nullecho "$PASSWORD" | password --stdin $UNAME &> /dev/nullif [ $? -eq 0 ]then echo "$UNAME, creat successfully."elseecho "$UNAME, create fail."fifi
done

while循环语句

适用于在执行前不确定最终执行的次数。

如下例子所示,编写一个GuessNumber.sh脚本

#!/bin/bashNUMBER=$(expr $RANDOM % 1000) # 随机生成一个0-32767的随机数,然后对1000进行取余操作
TIMES=0
echo "数值的范围在0-999之间,猜猜看?"while true
doread -p "请输入你猜测的数字:" INTlet TIMES++if [ $INT -eq $NUMBER ]thenecho "恭喜你,猜对了。你一共猜了 $TIMES 次。"exit 0elif [ $INT -gt $NUMBER ]thenecho "你猜得太高了。"elseecho "你猜得太低了。"fi
done

case条件语句

case语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。

如下所示例子,编写CheckKey.sh脚本。

#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEYcase "$KEY" in
[a-z] | [A-Z])
echo "你输入的是字母。"
;;
[0-9])
echo "您输入的是数字。"
;;
*)
echo "您输入的是空格、功能键或其他字符。"
esac

5、计划任务

一次性计划任务

只执行一次,用于满足临时的工作需求,默认采用的是交互式方法。可以用 at 命令实现,格式:at 时间如下所示:

# 今晚23:00重启网站服务
at 23:00
at > systemctl restart httpd
at > #这里同时按下Ctrl+D来结束编写计划任务

可以通过管道符实现非交互式的方法创建一次性计划任务。

echo "systemctl restart httpd" | at 23:00

如果想要查看已设置好但还未执行的一次性计划任务,可以使用 at -l 命令;

如果想要将其删除,可以使用 atrm 任务序号

长期性计划任务

 如果想要能够周期性地、有规律地执行某些具体的任务,那么Linux系统默认启用的crond服务是最佳选择。

  • crontab -e:创建、编辑计划任务
  • crontab -l:查看当前计划任务
  • crontab -r:删除某条计划任务
  • crontab -u:以管理员身份登录系统后,编辑他人的计划任务。

使用crond服务设置任务的参数格式:分钟、小时、日、月、星期 命令。如果有些字段没有设置,则需要使用星号(*)占位。

使用crond设置任务的参数字段说明
分钟0~59的任意整数
小时0~23的任意整数
1~31的任意整数
1~12的任意整数
星期0~7的任意整数。其中0和7均表示星期日
命令要执行的命令或程序脚本

计划任务中的“分”必须要有数值,绝对不能为空或是*;

而“日”和“星期”字段不能同时使用,否则就会发生冲突。

如下例子所示:

crontab -e
crontab -l
0 2 * * 1,3,5 /home/LN/tar -czvf backup.tar.gz /home/ln #所以命令(tar)需要用绝对路径来写

除了可以使用逗号(,)来分别表示多个时间段,如“8,9,11”表示8月、9月、11月,还可以使用减号(-)来表示一段连续的时间周期,如字段“日”的取值为“11-15”,表示每月的11~15日;使用除号(/)表示执行任务的间隔时间,如“*/2”表示每隔2分钟执行一次任务。

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

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

相关文章

Elasticsearch02-安装7.x

零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch (1)JDK安装 Elasticsearch是基于java开发的,所以需要安装JDK。我们安装的Elasticsearch版本是7.15,对应JDK至少1.8版本以上。也可以不安装jdk,…

又要考试了

一、实现无名管道练习&#xff1a;父进程写入管道&#xff0c;子进程读取管道数据。 #include<myhead.h> int main(int argc, const char *argv[]) {int fd[2];char buff[1024]"王吕阳&#xff0c;崔庆权别卷了";char s[1024];if(pipe(fd)-1){perror("pi…

Unity添加newtonsoft-json

package name "com.unity.nuget.newtonsoft-json": "3.2.1",打开包管理器 输入包名称和版本 点击添加

HarmonyOS:多线程并发-Worker

Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与宿主线程分离&#xff0c;在后台线程中运行一个脚本进行耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。具体接口信息及使用方法详情请见Worker…

JMeter配置原件-计数器

一、面临的问题&#xff1a; 由于本人的【函数助手对话框】中counter计数器每次加2&#xff0c;且只显示偶数(如下图所示)&#xff0c;因此借助【配置原件-计数器】来实现计数功能。 如果有大佬知道解决方式&#xff0c;麻烦评论区解答一下&#xff0c;谢谢。 二、配置原件-c…

系统可观测性——Logback日志框架

摘要 Logback是一种Java日志框架&#xff0c;可以提供高度可配置的日志记录功能&#xff0c;包括级别控制和事件过滤等功能。它基于SLF4J&#xff08;Simple Logging Facade for Java&#xff09;日志抽象层&#xff0c;可以与多种流行的Java日志框架兼容&#xff0c;如Log4j和…

【自然语言处理与大模型】使用llama.cpp将HF格式大模型转换为GGUF格式

llama.cpp的主要目标是在本地和云端的各种硬件上以最小的设置和最先进的性能实现LLM推理。是一个专为大型语言模型&#xff08;LLM&#xff09;设计的高性能推理框架&#xff0c;完全使用C和C编写&#xff0c;没有外部依赖&#xff0c;这使得它可以很容易地被移植到不同的操作系…

NVR小程序接入平台EasyNVR设置预置位显示“参数错误”的解决方法

视频监控技术在现代社会中的应用已经变得越来越广泛&#xff0c;从城市安防到家庭安全&#xff0c;从交通管理到商业监控&#xff0c;其作用无处不在。随着科技的不断进步&#xff0c;视频监控不仅提高了安全性&#xff0c;还带来了许多新的机遇和挑战。 近期&#xff0c;我们收…

【MySQL】InnoDB引擎中的Compact行格式

目录 1、背景2、数据示例3、Compact解释【1】组成【2】头部信息【3】隐藏列【4】数据列 4、总结 1、背景 mysql中数据存储是存储引擎干的事&#xff0c;InnoDB存储引擎以页为单位存储数据&#xff0c;每个页的大小为16KB&#xff0c;平时我们操作数据库都是以行为单位进行增删…

达梦查询表字段详细信息脚本(字段名称、描述、类型、长度及是否为空)

达梦查询表字段详细信息脚本&#xff08;字段名称、描述、类型、长度及是否为空&#xff09; 该SQL 脚本&#xff0c;用于查询表中字段的基本信息&#xff0c;包括字段名称、描述、数据类型、数据长度、是否为空及是否为主键等属性。 SQL 脚本 -- 输入变量 DECLAREp_owner VA…

YashanDB共享集群产品能力观测:细节足见功底

本文基于前泽塔数科研发总监-王若楠2024年11月在“2024年国产数据库创新生态大会”-“根”技术专场的演讲整理形成&#xff0c;主要对崖山共享集群YAC的架构、功能、高可用性、性能四大方面进行全面测试&#xff0c;并分享了测试环境和测试结论。 年初&#xff0c;基于某些商业…

[C++]类的继承

一、什么是继承 1.定义&#xff1a; 在 C 中&#xff0c;继承是一种机制&#xff0c;允许一个类&#xff08;派生类&#xff09;继承另一个类&#xff08;基类&#xff09;的成员&#xff08;数据和函数&#xff09;。继承使得派生类能够直接访问基类的公有和保护成员&#xf…

无人机节气门控制技术概述!

一、无人机节气门信号特点 无人机节气门信号主要用于调节无人机的发动机输出功率&#xff0c;其特点主要包括&#xff1a; 高精度&#xff1a;节气门信号需要高精度地反映发动机的转速、功率等状态&#xff0c;以确保无人机能够准确、稳定地飞行。 实时性&#xff1a;无人机…

机器学习之 K-Means

1. 什么是 K-Means&#xff1f; K-Means 是一种常用的无监督学习算法&#xff0c;主要用于聚类分析任务。其目标是将数据集划分为 K 个不同的簇&#xff0c;使得同一簇内的数据点之间的相似性更高&#xff0c;而不同簇的数据点差异更大。K-Means 算法使用了一个简单而有效的迭…

智慧公交指挥中枢,数据可视化 BI 驾驶舱

随着智慧城市的蓬勃发展&#xff0c;公共交通作为城市运营的核心枢纽&#xff0c;正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network&#xff0c;控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术&#xff0c;构建的公交“大脑”…

盲盒3.0版h5版-可打包app-新优化版紫色版

整体界面ui美观大气&#xff0c;盲盒项目也是一直比较热门的&#xff0c;各大平台一直自己也有做。 感兴趣的小伙伴可以搭建做自己的项目。盲盒项目的利润率还是很大的。

如何理解符号引用和直接引用?

我们知道在 JVM 中类加载总共使用 5 步组成的&#xff0c;而类的生命周期总共有 7 个阶段&#xff0c;如下图所示&#xff1a; 其中每步的含义如下&#xff1a; 1.加载 加载&#xff08;Loading&#xff09;阶段是整个“类加载”&#xff08;Class Loading&#xff09;过程中…

海康萤石摄像机接入EasyNVR流程:开启RTSP-》萤石视频添加到EasyNVR-》未来支持海康SDK协议添加到EasyNVR

EasyNVR目前支持GB28181、RTSP、ONVIF、RTMP&#xff08;推流&#xff09;这几种协议接入&#xff0c;目前正在增加海康HIKSDK、大华DHSDK等几种SDK的接入&#xff0c;我们今天就介绍一下萤石摄像机怎么通过RTSP接入到EasyNVR。 第一步&#xff1a;萤石摄像机开启 萤石设备默…

【Unity离线渲染器】Octane for Unity 排坑(注册、证书申请、安装)

Unity使用Octane 异常复杂迷惑&#xff0c;官网多数差评就在此&#xff0c;Octane 论坛对unity的讨论已多年未更新。 经过我半天的不屑努力与排错&#xff0c;终于找到一种比较靠谱的方法。 (我用的unity版本是2022.3&#xff0c;估计2017都行&#xff08;不确定&#xff09;&…

Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单&#xff0c;选择 要创建的项目模版&#xff0c;点击 Next 二、输入项目名称…