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

这篇具有很好参考价值的文章主要介绍了一篇文章教会你如何编写一个简单的Shell脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单Shell脚本编写

Shell脚本概念

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

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

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

1. 简单脚本编写

文件内容如下:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

方式一

chmod +x 脚本文件

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

方式二

bash 脚本文件

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

2. Shell脚本参数

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

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

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

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

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

执行结果:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

注意

  • 双引号会解释变量

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

2.1 Shell脚本参数判断

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

判读是否为目录

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

判断是否为文件

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

2.1.2 逻辑测试语句

逻辑运算符:

  • &&
  • ||

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

2.1.3 整数值测试语句

整数的比较运输符

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

[ 9 -ne 8 ]
echo $?

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

free:查看内存

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

定义变量

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

2.1.4 字符串比较语句

字符串比较:

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行结果

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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” 是一个空设备文件,它可以用于丢弃不需要的输出,相当于一个黑洞。

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行结果

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

#!/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 秒。

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行效果

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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” 是用于存储用户输入值的变量名。

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行效果如下

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

4. Shell脚本循环

4.1 for循环

基本格式:

for 变量名 in 取值列表
do
	命令序列
done
4.1.1 批量添加用户

创建一个用户名的txt文件

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

编写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)读取密码,而不是要求用户手动输入密码。

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行结果如下:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

创建前

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

创建后一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行结果

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

4.1.3 批量ping IP 地址

创建一个IP地址的txt文件

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

编写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 中的命令替换语法,它表示将命令的输出结果作为一个整体嵌入到命令行中。

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行效果如下:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

执行结果:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

方式二

#!/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” 是序列的结束值。

执行结果:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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” 是一个用于执行基本数学运算或字符串操作的命令。

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行结果

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

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

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全

执行效果如下:

一篇文章教会你如何编写一个简单的Shell脚本,linux,shell,脚本,网络安全文章来源地址https://www.toymoban.com/news/detail-692759.html

到了这里,关于一篇文章教会你如何编写一个简单的Shell脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker从安装到部署项目,一篇文章教会你

    首先看下 Docker 图标: 一条小鲸鱼上面有些集装箱,比较形象的说明了 Docker 的特点,以后见到这个图标等同见到了 Docker 1. Docker 是一个开源的应用容器引擎,它基于 Go 语言开发,并遵从 Apache2.0 开源协议 2. 使用 Docker 可以让开发者封装他们的应用以及依赖包到一个可移植的

    2024年02月08日
    浏览(35)
  • C++初阶之一篇文章教会你list(模拟实现)

    成员类型表 这个表中列出了C++标准库中list容器的一些成员类型定义。这些类型定义是为了使list能够与C++标准库的其他组件协同工作,并提供一些通用的标准接口。每个成员类型的用处: value_type : 这个成员类型代表list容器中存储的数据类型,即模板参数T的类型。 allocator_

    2024年02月12日
    浏览(21)
  • C++初阶之一篇文章教会你list(理解和使用)

    在C++标准库中, std::list 是一个双向链表容器,用于存储一系列元素。与 std::vector 和 std::deque 等容器不同, std::list 使用链表的数据结构来组织元素,因此在某些操作上具有独特的优势和性能特点。以下是关于 std::list 的详细介绍: 双向链表结构: std::list 内部使用双向链表来

    2024年02月13日
    浏览(33)
  • Vue中的Pinia状态管理工具 | 一篇文章教会你全部使用细节

    Pinia(发音为/piːnjʌ/,如英语中的“peenya”)是最接近piña(西班牙语中的菠萝)的词 ; Pinia开始于大概2019年,最初是 作为一个实验为Vue重新设计状态管理 ,让它用起来适合组合式API(Composition API)。 从那时到现在,最初的设计原则依然是相同的,并且目前同时兼容Vue2、

    2024年02月11日
    浏览(27)
  • 数据结构入门(C语言版)一篇文章教会你手撕八大排序

    排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而

    2024年02月01日
    浏览(35)
  • 怎样在一台电脑安装多个版本的JDK并切换使用?一篇文章教会你所有细节

    目录 1. 下载安装JDK版本 2. 配置环境变量 2. 1 配置环境变量的步骤 2.2 需要注意的细节点 2.3 JDK8,11,17版本切换测试 a . JDK8 下载链接: Java Downloads | Oracle https://www.oracle.com/java/technologies/downloads/#java8-windows b.  这里我先插一句,因为我们要安装多个JDK版本,所以我们最好提前创

    2024年04月16日
    浏览(56)
  • Go For Web:一篇文章带你用 Go 搭建一个最简单的 Web 服务、了解 Golang 运行 web 的原理

    本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍。目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个做任何事情的动态 Web 程序应该是很轻松的,接下来我们就去学习了解一些关于 Web 的相关基础,了解一些概念,

    2023年04月14日
    浏览(39)
  • (python实现)一篇文章教会你k-means聚类算法(包括最优聚类数目k的确定)

    Kmeans算法中,K值所决定的是在该聚类算法中,所要分配聚类的簇的多少。Kmeans算法对初始值是⽐较敏感的,对于同样的k值,选取的点不同,会影响算法的聚类效果和迭代的次数。本文通过计算原始数据中的:手肘法、轮廓系数、CH值和DB值,四种指标来衡量K-means的最佳聚类数

    2024年02月05日
    浏览(42)
  • 一篇文章告诉你JavaScript 如何实现继承

    JavaScript 在编程语言界是个特殊种类,它和其他编程语言很不一样,JavaScript 可以在运行的时候动态地改变某个变量的类型。 比如你永远也没法想到像isTimeout这样一个变量可以存在多少种类型,除了布尔值true和false,它还可能是undefined、1和0、一个时间戳,甚至一个对象。 如

    2024年02月10日
    浏览(21)
  • 如何真正认识 Linux 系统结构?这篇文章告诉你

         Linux 内核 内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:   系统调用接

    2024年02月01日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包