【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,否则,返回非0
  then
  echo "Host $1 is on-line."
else
  echo "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!"
else
  echo "$GRADE is fail!"
fi

for循环语句

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

#!/bin/bash
read -p "Enter the users password:" PASSWORD
for UNAME in `cat users.txt`
do
  id $UNAME &> /dev/null
  if [ $? -eq 0 ]
    then echo "Username already exists."
  else
    userad $UNAME &> /dev/null
    echo "$PASSWORD" | password --stdin $UNAME &> /dev/null
  
  if [ $? -eq 0 ]
    then echo "$UNAME, creat successfully."
  else
    echo "$UNAME, create fail."
  fi
  
  fi
done

while循环语句

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

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

#!/bin/bash

NUMBER=$(expr $RANDOM % 1000) # 随机生成一个0-32767的随机数,然后对1000进行取余操作
TIMES=0
echo "数值的范围在0-999之间,猜猜看?"

while true
do
  read -p "请输入你猜测的数字:" INT
  let TIMES++
  if [ $INT -eq $NUMBER ]
  then
    echo "恭喜你,猜对了。你一共猜了 $TIMES 次。"
    exit 0
  elif [ $INT -gt $NUMBER ]
  then
    echo "你猜得太高了。"
  else
    echo "你猜得太低了。"
  fi
done

case条件语句

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

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

#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY

case "$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分钟执行一次任务。

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

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

相关文章

使用C#在目录层次结构中搜索文件以查找目标字符串

例程以递归方式搜索目录层次结构中的文件以查找目标字符串。它可以搜索几乎任何类型的文件,即使它不包含 Windows 理解的文本。例如,它可以搜索 DLL 和可执行文件以查看它们是否恰好包含字符串。 下面的代码中显示的ListFiles 方法完成了大部分工作。 …

JAVA爬虫获取1688关键词接口

以下是使用Java爬虫获取1688关键词接口的详细步骤和示例代码: 一、获取API接口访问权限 要使用1688关键词接口,首先需要获取API的使用权限,并了解接口规范。以下是获取API接口的详细步骤: 注册账号:在1688平台注册一…

微服务SpringCloud链路追踪之Micrometer+Zipkin

视频教程: https://www.bilibili.com/video/BV12LBFYjEvR 效果演示 当我们发送一个请求给 Gateway 的时候,由 Micrometer trace 进行链路追踪和数据收集,由 Zipkin 进行数据展示。可以清楚的看到微服务的调用过程,以及每个微服务…

Leetcode 插入区间

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {List<int[]> result new ArrayList<>();int i 0;// Step 1: 添加所有在 newInterval 之前的区间while(i < intervals.length && intervals[i][1] < newInterval[0]…

CSS|07 标准文档流

标准文档流 一、什么是标准文档流 在制作的 HTML 网页和 PS 画图软件画图时有本质上面的区别: HTML 网页在制作的时候都得遵循一个“流的规则:从左至右、从上至下。 使用 Ps 软件画图时可以在任意地方画图。 <!DOCTYPE html> <html lang"en"> <hea…

redis 缓存使用

工具类 package org.springblade.questionnaire.redis;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factor…

【排序算法】——选择排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素&#xff08;或记录&#xff09;的任意序列&#xff0c;重新排列成一个关键字有序的序列。所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#x…

递归实现指数型枚举(递归)

92. 递归实现指数型枚举 - AcWing题库 每个数有选和不选两种情况 我们把每个数看成每层&#xff0c;可以画出一个递归搜索树 叶子节点就是我们的答案 很容易写出每dfs函数 dfs传入一个u表示层数 当层数大于我们n时&#xff0c;去判断每个数字的选择情况&#xff0c;输出被选…

无限次使用 cursor pro

github地址 cursor-vip 使用方式 在 MacOS/Linux 中&#xff0c;请打开终端&#xff1b; 在 Windows 中&#xff0c;请打开 Git Bash。 然后执行以下命令来安装&#xff1a; 部分电脑可能会误报毒&#xff0c;需要关闭杀毒软件/电脑管家/安全防护再进行 方式1&#xff1a;通过…

【AI热点】小型语言模型(SLM)的崛起:如何在AI时代中找到你的“左膀右臂”?

人工智能模型的演变 多年来&#xff0c;谷歌等科技巨头和OpenAI等初创公司&#xff0c;一直在不遗余力地利用海量在线数据&#xff0c;打造更大、更昂贵的人工智能&#xff08;AI&#xff09;模型。这些大型语言模型&#xff08;LLM&#xff09;被广泛应用于ChatGPT等聊天机器…

解决Nginx + Vue.js (ruoyi-vue) 单页应用(SPA) 404问题的指南

问题描述 在使用Vue.js构建的单页应用&#xff08;SPA&#xff09;中&#xff0c;特别是像ruoyi-vue这样的框架&#xff0c;如果启用了HTML5历史记录模式进行路由管理&#xff0c;那么用户直接访问子路径或刷新页面时可能会遇到404错误。这是因为当用户尝试访问一个非根路径时…

Ubuntu22.04配置3D gaussian splatting

这篇博客提供了3D gaussian splatting在新安装Ubuntu上的配置过程。 1.拉仓库 2.安装显卡驱动和cuda版本 3.安装Pytorch 4.安装Pycharm和配置Python 5.安装附加依赖项&#xff08;方法一&#xff09; 6.安装Anaconda&#xff08;方法二&#xff09; 7.测试 1.拉仓库 # HT…

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c 1. Installing the extension (在 Visual Studio Code 中安装插件)1.1. Extensions for Visual Studio Code1.2. C/C1.2.1. Pre-requisites 1.3. Makefile Tools 2. Configuring your project (配置项目)2.1.…

深度解析:推荐系统的进化之路与深度学习革命

目录 前深度学习时代一推荐系统的进化之路 浪潮之巅一深度学习在推荐系统中的应用 Embedding 技术在推荐系统中的应用 Embedding的原理 Embedding的分类 Word2vec Item2vec Embedding 与深度学习推荐系统的结合 YouTube 推荐系统召回层 局部敏感哈希 多角度审视推…

MAPTR:在线矢量化高精地图构建的结构化建模与学习(2208)

MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION MAPTR&#xff1a;在线矢量化高精地图构建的结构化建模与学习 ABSTRACT High-definition (HD) map provides abundant and precise environmental information of the driving scene, se…

SpringBoot集成Canal实现MySQL实时同步数据到Redis

MySQL增量数据同步利器Canal环境搭建流程 软件环境 JDK17.0.12 canal-server1.1.7 canal-client1.1.7 MySQL5.7 IDEA2024.2.0.2 我们先看Canal1.1.7源码对应的项目结构 1、基于源码编译打包 # 源码下载地址 https://github.com/alibaba/canal # 执行以下命令&#xff0…

嵌入式驱动开发详解16(音频驱动开发)

文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发&#xff0c;但是由于ALSA驱动框架过于复杂&#xff0c;实现音频编解码芯片的驱动不是一个人能完成的&#xf…

OpenGL ES 03 加载3张图片并做混合处理

OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号&#xff0c;目的是为了告诉纹理采样器&#xff0c;从哪个纹理单元采集数据2.如果你没有显式地设置采…

JAVA没有搞头了吗?

前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津&#xff0c;难得的面试机会也难以把握&#xff0c;即便成功入职&#xff0c;也往往难以长久。于是&#xff0c;不少程序员感叹&#xff1a;互联网的寒冬似乎又一次卷土重来&#xff0c;环境如此恶劣&…

短视频矩阵贴牌:打造品牌新势力的策略与实践

在数字化浪潮席卷全球的今天&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为连接用户与品牌的重要桥梁。企业为了快速抢占市场&#xff0c;提升品牌影响力&#xff0c;纷纷探索短视频矩阵贴牌这一新兴模式。本文将深入探讨短视频矩阵贴牌的概念、优势、实施流程及注…