一篇文章教会你如何编写一个简单的Shell脚本

news2024/11/28 20:39:17

文章目录

  • 简单Shell脚本编写
    • 1. 简单脚本编写
    • 2. Shell脚本参数
      • 2.1 Shell脚本参数判断
        • 2.1.1 文件测试语句
        • 2.1.2 逻辑测试语句
        • 2.1.3 整数值测试语句
        • 2.1.4 字符串比较语句
    • 3. Shell流程控制语句
      • 3.1 if 条件测试语句
        • 3.1.1 if...
        • 3.1.2 if...else...
        • 3.1.3 if...elif...else
    • 4. Shell脚本循环
      • 4.1 for循环
        • 4.1.1 批量添加用户
        • 4.1.2 批量删除用户
        • 4.1.3 批量ping IP 地址
        • 4.1.4 检测同一局域网,多台主机存活情况
      • 4.2 while循环
      • 4.3 case条件测试语句

简单Shell脚本编写

Shell脚本概念

Shell 脚本是一种用于自动化执行一系列命令和操作的脚本文件。它使用的是 Shell 解释器(如 Bash、Korn Shell、Zsh 等)来解释和执行其中的命令。Shell 脚本通常用于编写简单的任务和工作流程,可以帮助我们进行系统管理、批量处理、自动化部署等任务。

以.sh后缀名结尾的文件来表示该文件是一个Shell脚本。

Shell脚本就是将命令写入文本中,文本可以被执行。

1. 简单脚本编写

文件内容如下:

image-20230903114629343

编写完脚本后,赋权文件的执行权限

方式一

chmod +x 脚本文件

image-20230903114742333

方式二

bash 脚本文件

image-20230903114659648

2. Shell脚本参数

$0:表示当前脚本的名称。

$*:表示脚本的所有参数。

$#:表示脚本的参数的个数。

$n:表示脚本的第n个参数,n=1,2,3…

$? :程序执行完后的结果,返回值0表示执行成功。

#!/bin/bash
echo "当前脚本名称$0"
echo "总共有$#个参数,分别是$*。"
echo "第一个参数为$1,第三个参数为$3"

image-20230903120223123

在执行该Shell脚本文件的时候在后面添加三个参数分别是wuhu1,wuhu2,wuhu3。

执行结果:

image-20230903120259036

注意

  • 双引号会解释变量

  • 单引号会把变量当成字符串表示

2.1 Shell脚本参数判断

2.1.1 文件测试语句

  • -d:测试文件是否为目录类型,是目录返回0,不是目录返回非0值。
  • -e:测试文件是否存在。
  • -f:判断是否为一般文件。
  • -r:判断当前用户对该文件是否有读取权限。
  • -w:判断当前用户对该文件是否有写入权限。
  • -x:判断当前用户对该文件是否有执行权限。

判读是否为目录

[ -d /etc/passwd ]
echo $?				# $?返回上一次执行命令的结果

说明:这里的[]中输入的内容前后需要加空格

image-20230903123048335

返回值为1,表示/etc/passwd不是目录。

判断当前目录下的wuhu是否为目录

image-20230903123346602

判断是否为文件

[ -f /etc/passwd ]
echo $?				# $?返回上一次执行命令的结果

image-20230903123516341

返回值为0,表示/etc/passwd是文件。

2.1.2 逻辑测试语句

逻辑运算符:

  • &&
  • ||

问题:上面所输入命令十分的繁琐,是否可以使用一条命令来完成上面的操作?

注意:这里是不能使用管道符的,使用管道符发现两次的输出值是不一样的。

image-20230903124043040

可以使用**&&**符号

  • && 必须保证两边都为真,条件才会成立,只要有一个为假条件都不会成立。
  • 只有当左侧命令执行成功时,右侧的命令才会被执行。
[ -f /etc/passwd ] && echo  "/etc/passwd是一个文件"
[ -d wuhu ] && echo  "wuhu是一个目录"

image-20230903124711636

[ $USER = root ] && echo  "该用户是超级管理员用户"

image-20230903125212876

还可以使用**|| **符号

  • || 两边有一个为真就为真,两边都为真也为真,两边为假才为假。
  • 如果左侧命令执行成功(返回值为零),则右侧的命令将不会被执行。
[ $USER = root ] || echo  "该用户是超级管理员用户"		# 表示当前用户不是root输出对应的语句

[ ! $USER = root ] || echo  "该用户是超级管理员用户"	# 表示当前用户是root输出对应的语句

image-20230903125749282

例如:要求普通用户输出user,管理员用户输出superuser

[ ! $USER = root ] && echo "user" || echo "superuser"

image-20230903131030219

切换回普通用户,执行该命令

image-20230903131230506

2.1.3 整数值测试语句

整数的比较运输符

  • -eq:是否等于
  • -ne:是否不等于
  • -gt:是否大于
  • -lt:是否小于
  • -le:是否等于或小于
  • -ge:是否等于或大于
[ 9 -eq 8 ]
echo $?

[ 9 -ne 8 ]
echo $?

image-20230903134238723

free:查看内存

image-20230903134650248

现在需要输出free中的Mem这一行

free -m | grep Mem | awk '{print $4}'

image-20230903134734422

定义变量

Freemem=`free -m | grep Mem | awk '{print $4}'`
echo $Freemem			# 输出变量

image-20230903135523368

例如:如果这个值小于1024的时候,会输出内容不足的提示信息。

[ $Freemem -gt 1024 ] && echo "内存不足"
[ $Freemem -lt 1024 ] && echo "内存不足"

image-20230903135912372

2.1.4 字符串比较语句

字符串比较:

  • =:比较字符串内容是否相同。
  • !=:比较字符串内容是否不同。
  • -z:判断字符串内容是否为空,如果为空返回0表示真,如果不为空返回1。
[ -z $String ]
echo $?			# 返回结果为0,因为没有定义过这个变量

[ -z $USER ]
echo $?			# 返回结果为1,因为当前用户不为空

image-20230903140444779

判断当前系统是否支持中文。

[ $LANG = zh_CN.UTF-8 ] && echo "支持中文" || echo "不支持中文"

image-20230903141125055

3. Shell流程控制语句

流程控制语句

  • if
  • then
  • else
  • fi

3.1 if 条件测试语句

3.1.1 if…

基本格式如下:

if 条件测试语句		
then 
	命令序列
fi  结束if语句

例如:判断home目录下是否存在test目录,如果不存在则创建一个。

#!/bin/bash
DIR="/home/test"
if [ ! -e $DIR ]
then
        mkdir -p $DIR
fi

image-20230903142903331

执行结果

image-20230903143054035

3.1.2 if…else…

基本格式如下:

if 条件测试语句		
then 
	命令序列
else 
	命令序列
fi  结束if语句

例如:判断给定的IP是否正常

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
        echo "$1该IP是正常的"
else 
        echo "$1该IP无法ping通" 
fi 

说明:&>/dev/null在 Linux/Unix 系统中,“/dev/null” 是一个空设备文件,它可以用于丢弃不需要的输出,相当于一个黑洞。

image-20230903144743570

执行结果

image-20230903144820330

然后就可以完善一下脚本内容

#!/bin/bash
if [ -z $1 ]
then
        echo "作者:小薛"
        echo "该命令检测服务器IP是否正常"
        echo "直接在命令后面加参数IP就可以执行"
else
        ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
        if [ $? -eq 0 ]
        then
                echo "$1该IP是正常的"
        else
                echo "$1该IP无法ping通" 
        fi
fi

说明

  • “-c 3” 选项表示发送 3 个 ICMP 请求消息,并等待每个请求的响应。
  • “-i 0.2” 选项表示设置每个 ICMP 请求的时间间隔为 0.2 秒(即每 200 毫秒发送一个请求)。
  • “-W 3” 选项表示设置等待响应的超时时间为 3 秒。

image-20230903150021885

执行效果

image-20230903150119546

3.1.3 if…elif…else

基本格式如下:

if 条件测试语句1	
then 
	命令序列1
elif 条件测试语句2
then 
	命令序列2
else 
	命令序列3
fi  结束if语句

例如:判断学员考试分数如何

#!/bin/bash
read -p "请输入分数(1-100):" fenshu
if [ $fenshu -ge 85 ] && [ $fenshu -le 100 ];then
        echo "该学生成绩为优秀"
elif [ $fenshu -ge 70 ] && [ $fenshu -le 84 ];then
        echo "该学生成绩为合格"
else
        echo "该学生成绩为不合格"               
fi

说明:

  • “-p” 选项用于在用户输入之前显示一个提示信息。
  • “read” 是一个 Bash 内置命令,用于从标准输入中读取用户输入并将其赋值给一个变量。
  • “fenshu” 是用于存储用户输入值的变量名。

image-20230903152258328

执行效果如下

image-20230903152359934

4. Shell脚本循环

4.1 for循环

基本格式:

for 变量名 in 取值列表
do
	命令序列
done

4.1.1 批量添加用户

创建一个用户名的txt文件

image-20230903153430251

编写Shell脚本

#!/bin/bash
read -p "请输入密码:" PASSWORD
for USERNAME in `cat user.txt`
do      
        id $USERNAME &> /dev/null
        if [ $? -eq 0 ]
        then    
                echo "$USERNAME用户已存在!"
        else    
                useradd $USERNAME &> /dev/null
                echo "$PASSWORD" | passwd --stdin $USERNAME &> /dev/null
                echo "$USERNAME用户创建成功"
        fi      
done

说明

  • –stdin:选项告诉passwd命令从标准输入(stdin)读取密码,而不是要求用户手动输入密码。

image-20230903154931261

执行结果如下:

image-20230903155507018

创建前

image-20230903155024371

创建后image-20230903155524208

4.1.2 批量删除用户

编写Shell脚本

#!/bin/bash
for USERNAME in `cat user.txt`
do
        id $USERNAME &> /dev/null
        if [ $? -eq 0 ]
        then
                userdel -r $USERNAME &>/dev/null
                echo "$USERNAME用户已删除"
        else
                echo "$USERNAME用户不存在!"
        fi
done

image-20230903161734398

执行结果

image-20230903161831687

4.1.3 批量ping IP 地址

创建一个IP地址的txt文件

image-20230903162332275

编写Shell脚本

#!/bin/bash
HOSTLIST=$(cat /root/iplist.txt)
for IP in $HOSTLIST
do
        ping -c 3 -i 0.2 -W 3 $IP &>/dev/null
        if [ $? -eq 0 ]
        then    
                echo "$IP该IP是正常的"
        else    
                echo "$IP该IP无法ping通"
        fi      
done

说明

  • “$()” 是 Bash 中的命令替换语法,它表示将命令的输出结果作为一个整体嵌入到命令行中。

image-20230903162909854

执行效果如下:

image-20230903163034465

4.1.4 检测同一局域网,多台主机存活情况

方式一

#!/bin/bash
read -p "请输入网络位:" NETWORK
for ((IP=1;IP<=100;IP++))
do
        ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "$NETWORK.$IP该IP可以ping通"

        else
                echo "$NETWORK.$IP该IP无法ping通!!!!!!!"
        fi
done

执行结果:

image-20230903165538490

方式二

#!/bin/bash
read -p "请输入网络位:" NETWORK
for IP in `seq 1 254`
do
        ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "$NETWORK.$IP该IP可以ping通"

        else
                echo "$NETWORK.$IP该IP无法ping通!!!!!!!"
        fi
done

说明:

  • “seq” 是一个用于生成序列的命令。
  • “1” 是序列的起始值。
  • “254” 是序列的结束值。

执行结果:

image-20230903165524898

4.2 while循环

基本格式如下:

while 条件
do
	命令序列
done

例如:猜测商品价格

编写Shell脚本

#!/bin/bash
echo "该商品价格在0~1000之间,输入价格来猜一猜"
TIMES=0
PRICE=$(expr $RANDOM % 1000 )
while true
do
        read -p "请输入价格:" INT
        let TIMES++
        if [ $INT -eq $PRICE ]
        then    
                echo "恭喜您猜对了该商品的及格,价格为$INT"
                echo "您猜了$TIMES次"
                exit
        elif [ $INT -gt $PRICE ];then
                echo "您所输入的价格高了"
        else
                echo "您所输入的价格低了"
        fi      
done

说明

  • $RANDOM是linux中的内置变量,可以随机生成0-32767之间的整数数字。
  • “expr” 是一个用于执行基本数学运算或字符串操作的命令。

image-20230903171930137

执行结果

image-20230903172221018

4.3 case条件测试语句

基本格式如下:

case 变量值 in 
模式1
	命令序列1
模式2 
	命令序列2
....
	默认命令序列
esac

例如:判断输入的是字母,数字,还是特殊符号

编写Shell脚本

#!/bin/bash
read -p "请输入一个字符:" KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "这是字母"
                ;;
        [0-9])
                echo "这是数字"
                ;;
        *)
                echo "这是特殊符号"
esac

image-20230903173802938

执行效果如下:

image-20230903173832062

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

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

相关文章

目标检测模型推理实验记录

在进行目标检测算法的学习过程中&#xff0c;需要进行对比实验&#xff0c;这里可以直接使用MMDetection框架来完成&#xff0c;该框架集成了许多现有的目标检测算法&#xff0c;方便我们进行对比实验。 环境配置 首先是环境配置&#xff0c;先前博主曾经有过相关方面的配置&…

【数据结构Java版】 初识泛型和包装类

目录 1.包装类 1.1基本数据类型以及它们所对应的包装类 1.2装箱和拆箱 1.3自动装箱和自动拆箱 2.什么是泛型 3.引出泛型 4.泛型类的使用 4.1语法 4.2示例 4.3类型推导 5.泛型是如何编译的 5.1擦除机制 5.2正确的写法 6.泛型的上届 6.1语法 6.2示例 …

腾讯云、阿里云、华为云便宜云服务器活动整理汇总

云服务器的选择是一个很重要的事情&#xff0c;避免产生不必要的麻烦&#xff0c;建议选择互联网大厂提供的云计算服务&#xff0c;腾讯云、阿里云、华为云就是一个很不错的选择&#xff0c;云服务器稳定性、安全性以及售后各方面都更受用户认可&#xff0c;下面小编给大家整理…

Kitchen Hook

双扛厨房排钩&#xff1a;挂刀具

linux 内存一致性

linux 出现内存一致性的场景 1、编译器优化 &#xff0c;代码上下没有关联的时候&#xff0c;因为编译优化&#xff0c;会有执行执行顺序不一致的问题&#xff08;多核单核都会出现&#xff09; 2、多核cpu乱序执行&#xff0c;cpu的乱序执行导致内存不一致&#xff08;多核出…

[二分查找] 旋转数组

1. &#xff08;严格递增序列&#xff09;旋转数组的元素查找 简单来说分为三种情况进行分析 1. 整个旋转数组单调递增 根据x和A[mid]的大小关系&#xff0c;更迭范围。 // 1. 整个旋转数组单调递增if (A[left]<A[right]){if (A[mid] x)return mid;else if (x < A[mid]…

C语言枚举类型enum详解、枚举变量。枚举函数

文章目录 枚举定义枚举应用枚举函数枚举函数2 枚举定义 关键字&#xff1a;enum 用途&#xff1a;定义一个取值受限制的整型变量&#xff0c;用于限制变量取值范围&#xff1b;宏定义的集合 定义枚举变量&#xff1a; enum{FALSE 0, TRUE 1} EnumName; 因为枚举变量类型较长…

矢量图片转换 Vector Magic for mac

Vector Magic会帮你进行自动识别和分析&#xff0c;转换过程中用户可选择相应的转换级别&#xff0c;从而达到自已所需的效果。 只需上传即可在线自动将 JPG、PNG、BMP 和 GIF 位图图像转换为真正的 SVG、Eps 和 PDF 矢量图像。真正的全彩描摹&#xff0c;无需安装软件&#xf…

java 对IP地址进行排序,或类ip地址的字符串进行排序

java 对IP地址进行排序&#xff0c;或类ip地址的字符串进行排序 排序前先认识一下这个拆分字符串非常好用的类 1.StringTokenizer类 1.1 构造方法 StringTokenizer(String str) &#xff1a;构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格(“”)、…

PHP NBA球迷俱乐部系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP NBA球迷俱乐部系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 基于PHP的NBA球迷俱乐部 二、功能介绍 1、前台主要功能&#xff1a; 系统首页 网站介…

项目(补充2):智慧教室

一。emWin环境的搭建 1.codeBlock下载 开源免费。 2.使用stm的Cubemx提供的作图软件 &#xff08;1&#xff09;在C盘下找到第三方的固件库&#xff0c;旁边有个ST文件夹 注意&#xff1a;我在下载cubemx为默认的路径 &#xff08;2&#xff09;STemWin中的Soft提供了绘图…

【STM32】学习笔记(EXTI)

EXTI外部中断 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中断优先级&#x…

字符串颜色

字体颜色 30&#xff1a;黑 31&#xff1a;红 32&#xff1a;绿 33&#xff1a;黄 34&#xff1a;蓝色 35&#xff1a;紫色 36&#xff1a;深绿 37&#xff1a;白色 字体背景颜色 40&#xff1a;黑 41&#xff1a;深红 42&#xff1a;绿 43&#xff1a;黄色 44&#xff1a;蓝…

使用 Tkinter 在 Python 中构建井字游戏!

一、说明 做你还记得小时候玩井字游戏吗&#xff1f;这是一个简单的游戏&#xff0c;只需一支笔或铅笔就可以在一张纸上玩。但是你知道你也可以使用Python的Tkinter库创建一个井字游戏吗&#xff1f;在本文中&#xff0c;我们将介绍使用 Tkinter 创建井字游戏的过程。在本文结束…

vue的 ECMAScript 6的学习

一 ECMAScript 6 1.1 ECMAScript 6 ECMAScript 和 JavaScript 的关系是&#xff0c;前者是后者的规格&#xff0c;后者是前者的一种实现&#xff08;另外的 ECMAScript 方言还有 Jscript 和 ActionScript&#xff09;。 因此&#xff0c;ES6 既是一个历史名词&#xff0c;也…

word添加字体库

1001 Fonts ❤ Free Fonts Baby!51044 free fonts in 28637 families Free licenses for commercial use Direct font downloads Mac Windows Linuxhttps://www.1001fonts.com/ 下载字体后复制粘贴到下面的位置&#xff1a;

IDEA自定义模板

IDEA自定义模板 &#xff08;1&#xff09;定义sop模板 ①在Live Templates中增加模板 ②先定义一个模板的组 ③在模板组里新建模板 ④定义模板 Abbreviation:模板的缩略名称Description:模板的描述Template text:模板的代码片段应用范围。比如点击Define。选择如下&…

输出图元(四)8-1 图元、屏幕坐标、指定二维世界坐标系统

用于图形应用的通用软件包称为计算机图形应用编程接口(CCAPI)它提供可以在C等程序设计语言中用来创建图形的函数库。如第3 章所指出的&#xff0c;函数库可以分成几种类型。创建图形时最先要做的一件事就是要描述显示场景的组成部分。图形的组成部分可以是树木和地形家具和墙壁…

无涯教程-JavaScript - CUBEKPIMEMBER函数

描述 该函数返回关键绩效指标(KPI)属性,并在单元格中显示KPI名称。 语法 CUBEKPIMEMBER (connection, kpi_name, kpi_property, [caption])争论 Argument描述Required/OptionalconnectionName of the connection to the cube - A text stringRequiredkpi_nameName of the K…

13. 性能测试

目录 1. 什么是性能测试 1.1 常见的性能问题 1.2 性能测试的概念 1.3 性能测试和功能测试的区别 1.4 性能的好坏如何定义 1.5 影响性能的因素 2. 为什么进行性能测试 3. 性能测试常见专业术语以及衡量指标 4. 性能测试分类 4.1 基准测试 4.2 负载测试 4.3 压力测…