【Linux】shell脚本二

news2024/12/19 2:33:10

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

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

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

相关文章

PHP+MySQL 学生信息管理系统

目录 MySQL建表指令 主页面展示 主页面源代码如下 增:添加学生信息 添加html如下 html:主要用于显示网页内容 成功添加后回显 ​编辑 增加php如下 删:删除学生信息 删除html如下 成功删除后回显 删除php如下 改:修改学…

【第三节】Git 基本操作指南

目录 前言 一、获取与创建项目 1.1 git init 1.2 git clone 二、基本快照操作 2.1 git add 2.2 git status 2.3 git diff 2.4 git commit 2.5 git reset HEAD 三、 文件管理 3.1 git rm 3.2 git mv 四、Git 文件状态 5.1 工作目录 5.2 暂存区 5.3 本地仓库 5…

【第六节】Git Flow:分支管理模型与工作流程

一、Git Flow 简介 1.1 什么是 Git Flow Git Flow 是一种基于 Git 的分支管理模型,旨在帮助团队更好地管理和发布软件。它由 Vincent Driessen 在 2010 年提出,通过一套标准的分支命名和工作流程,使开发、测试和发布过程更加有序和高效。不过…

Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令

注:本文为网络命令相关文章合辑。 未整理去重。 一、IPv6 概述 IPv6 即 “Internet 协议版本 6”,因 IPv4 地址资源面临耗尽问题而被引入以替代 IPv4。IPv6 则提供了理论上多达 2 128 2^{128} 2128 个地址,有效解决地址不足困境。 IPv6 具…

GB28181系列三:GB28181流媒体服务器ZLMediaKit

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、ZLMediaKit介绍 二、 ZLMediaKit安装、运行(Ubuntu) 1、安装 2、运行 3、配置 三、ZLMediaKit使用 一、ZLMediaKit介绍 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架,项目地址&#xf…

【深度学习】深刻理解Swin Transformer

Swin Transformer 是一种基于 Transformer 的视觉模型,由 Microsoft 研究团队提出,旨在解决传统 Transformer 模型在计算机视觉任务中的高计算复杂度问题。其全称是 Shifted Window Transformer,通过引入分层架构和滑动窗口机制,S…

uniCloud云开发视频教程-从基础入门到项目开发实战-uniapp进阶课文章管理系统(云函数/云数据库/云存储)

大家好,我是爱搞知识的咸虾米。 今天给大家带来一门uniCloud基础入门到项目开发实战的课程。 视频学习地址:https://www.bilibili.com/video/BV1PP411E7qG/ 开始学习这门课之前,最好先学习一下uniapp零基础入门这套课,相信很多同…

GLB格式转换为STL格式

GLB与STL格式简介 GLB格式 GLB代表“GL传输格式二进制文件”(GL Transmission Format Binary)。GLB主要用于共享3D数据,包含三维模型、场景、光源、材质、节点层次和动画等详细信息,是一种标准化的文件格式,适用于多…

Qt编译MySQL数据库驱动

目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 (1)先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 (2)在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…

MySQL通过binlog日志进行数据恢复

记录一次阿里云MySQL通过binlog日志进行数据回滚 问题描述由于阿里云远程mysql没有做安全策略 所以服务器被别人远程攻击把数据库给删除,通过查看binlog日志可以看到进行了drop操作,下面将演示通过binlog日志进行数据回滚操作。 1、查询是否开始binlog …

如何在 Ubuntu 22.04 上安装和使用 Rust 编程语言环境

简介 Rust 是一门由 Mozilla 开发的系统编程语言,专注于性能、可靠性和内存安全。它在没有垃圾收集的情况下实现了内存安全,这使其成为构建对性能要求苛刻的应用程序(如操作系统、游戏引擎和嵌入式系统)的理想选择。 接下来&…

前端项目初始化搭建(二)

一、使用 Vite 创建 Vue 3 TypeScript 项目 PS E:\web\cursor-project\web> npm create vitelatest yf-blog -- --template vue-ts> npx > create-vite yf-blog --template vue-tsScaffolding project in E:\web\cursor-project\web\yf-blog...Done. Now run:cd yf-…

生活小妙招之UE CaptureRT改

需求,四个不同的相机拍摄结果同屏分屏显示 一般的想法是四个Capture拍四张RT,然后最后在面片/UI上组合。这样的开销是创建4张RT,材质中采样4次RT。 以更省的角度,想要对以上流程做优化,4个相机拍摄是必须的&#xff…

【AIGC进阶-ChatGPT提示词副业解析】探索生活的小确幸:在平凡中寻找幸福

引言 在这个快节奏的现代社会中,我们常常被各种压力和焦虑所困扰,忘记了生活中那些细小而珍贵的幸福时刻。本文将探讨如何在日常生活中发现和珍惜那些"小确幸",以及如何通过尝试新事物来丰富我们的生活体验。我们还将讨论保持神秘感和期待感对于维持生活乐趣的重要性…

C#编程报错- “ComboBox”是“...ComboBox”和“...ComboBox”之间的不明确的引用

1、问题描述 在学习使用C#中的Winform平台编写一个串口助手程序时, 在编写一个更新ComboBox列表是遇到了问题,出错的代码是 2、报错信息 CS1503 参数 2: 无法从“System.Windows.Forms.ComboBox”转换为“System.Windows.Forms.ComboBox” CS1503 …

ollama+open-webui,本地部署自己的大模型

目录 一、效果预览 二、部署ollama 1.ollama说明 2.安装流程 2.1 windows系统 2.1.1下载安装包 2.1.2验证安装结果 2.1.3设置模型文件保存地址 2.1.4拉取大模型镜像 2.2linux系统 2.2.1下载并安装ollama 2.2.2设置环境变量 2.2.3拉取模型文件 三、部署open-webui…

leetcode_203. 移除链表元素

203. 移除链表元素 - 力扣(LeetCode) 开始写的时候没有想明白的问题 1. 开始我是想头节点 尾节点 中间节点 分开处理 如果删除的是头节点 然后又要删除头节点的后继节点 那么 这样子的话头节点分开处理就毫无意义了 接着是尾节点 开始我定义的是curr h…

【大模型微调学习5】-大模型微调技术LoRA

【大模型微调学习5】-大模型微调技术LoRA LoRa微调1.现有 PEFT 方法的局限与挑战2.LoRA: 小模型有大智慧 (2021)3.AdaLoRA: 自适应权重矩阵的高效微调 (2023)4.QLoRA: 高效微调量化大模型 (2023) LoRa微调 1.现有 PEFT 方法的局限与挑战 Adapter方法,通过增加模型深…

.NET 技术系列 | 通过CreatePipe函数创建管道

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

DS18B20温度传感器(STM32)

一、介绍 DS18B20是一种常见的数字型温度传感器,具备独特的单总线接口方式。其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点。 传感器参数 测温范围为-55℃到1…