认识并初步使用shell脚本

news2025/1/13 17:34:42

目录

一、什么是Shell脚本

二、变量与运算

三、逻辑判断

四、循环

五、函数

六、中断与继续


一、什么是Shell脚本

在前面学习了Linux的基本指令,而shell脚本其实就是是这些命令的集合。

那么为什么需要shell脚本呢?

因为可以用来实现一些复杂的操作,如下:

(1) 进入/tmp/目录;

(2) 列出当前目录中所有的文件名;

(3) 把所有当前的文件复制到/root/目录下;

(4) 删除当前目录下所有的文件。

对于每一个操作,熟悉Linux指令的都知道并不难,但是要完成这些操作就需要四次回车。而通过创建shell脚本文件就可以一次性执行上述所有操作。

接下来将通过实际案例进行教学实现第一个shell脚本

1.cd /usr/local/sbin/ //这里是建议脚本存放目录

2.vim first.sh //建议使用 vim编辑器,输入下面内容(注意:需要root权限)

shell脚本通常都以.sh为后缀名

#! /bin/bash
#This is my first shell script.
#Writen by author 2023-11-21.
date
echo "Hello world!"

注意:

第1行要以#! /bin/bash开头,表示该文件使用的是bash语法。不设置也可以执行,但是不符合规范

#表示注释,后面跟一些该脚本的相关注释内容,以及作者、创建日期或者版本等。不要省略,养成习惯。

 运行:有两种方式运行bash文件,一种是sh + 文件名 或者 bash + 文件名


二、变量与运算

变量的定义:

定义变量的格式:

变量名=变量的值

在脚本中引用变量时需要加上符号$

变量的简单计算案例

#! /bin/bash
# For get the sum of two numbers.
# author 2023-11-21.
a=1
b=2
sum=$((a+b))
echo "$a+$b=$sum"

 注意:变量的计算需要使用双括号括起来(( )),并且在前面加上$符号

注意:使用shell脚本语言,变量赋值时候不能有空格!

练习1: 写一个脚本,输入A与B计算,输出A+B的值。

#!/bin/bash
read -p "please input x:" x
read -p "please input y:" y
sum=$((x + y))
echo "the sum is $sum"

练习 2:输出参数与文件本身

#! /bin/bash
echo "$0 $1 $2"

注意:$0是文件本身名称的意思


三、逻辑判断

if判断格式

if((判断条件)); then

符合对应的条件执行该代码

elif((判断条件));then[可省略]

符合对应的条件执行该代码

else[可省略]

符合对应的条件执行该代码

fi

案例:通过输入分数,判断是否及格

#! /bin/bash
read -p "please input your score:" score
if(($score<60));then
        echo "you didn't pass the exam"
else 
        echo "good!"
fi

通过逻辑符号实现判断分数的高低

  • &&:表示逻辑与(AND)。在Shell脚本中,command1 && command2的意思是,如果command1执行成功(返回退出状态码为0),则执行command2
  • ||:表示逻辑或(OR)。在Shell脚本中,command1 || command2的意思是,如果command1执行失败(返回退出状态码非0),则执行command2

练习案例:通过输入分数,判断是高分,及格分,低分。三种情况

#!/bin/bash
read -p "please input your score:" score

if (($score < 60)); then
    echo "your score is low"
elif (($score >= 60 && $score < 85)); then
    echo "your score is mid"
elif (($score >= 85 && $score <= 100)); then
    echo "nice! your score is high"
else
    echo "your score is invalid"
fi

通过比较运算符判断

在Shell中,常用的比较运算符有:

  • -eq:等于(equal to),例如if [ $a -eq 5 ]
  • -ne:不等于(not equal to),例如if [ $a -ne 5 ]
  • -lt:小于(less than),例如if [ $a -lt 5 ]
  • -le:小于或等于(less than or equal to),例如if [ $a -le 5 ]
  • -gt:大于(greater than),例如if [ $a -gt 5 ]
  • -ge:大于或等于(greater than or equal to),例如if [ $a -ge 5 ]

格式[ $变量 -比较符 ];then

通过比较符简化上述案例:

#!/bin/bash
read -p "please input your score:" score

if [ $score -lt 60 ]; then
    echo "your score is low"
elif [ $score -ge 60 -a $score -lt 85 ]; then
    echo "your score is mid"
elif [ $score -le 100 -a $score -ge 85 ]; then
    echo "nice! your score is high"
else
    echo "your score is invalid"
fi

注意: 在Shell中,方括号 [ ] 是用于条件测试的一种方法,但是它需要在每个条件表达式周围添加空格,并且对于多个条件的连接需要使用逻辑运算符 -a

练习案例:请你根据比较运算符判断下面shell脚本运行的结果

1.a=10; if [ $a -lt 5 ]; then echo ok; fi
2.a=10; if [ $a -gt 5 ]; then echo ok; fi
3.a=10; if [ $a -ge 10 ]; then echo ok; fi
4.a=10; if [ $a -eq 10 ]; then echo ok; fi
5.a=10; if [ $a -ne 10 ]; then echo ok; fi
6.a=10; if [ $a -lt 1 ] || [ $a -gt 5 ]; then echo ok; fi
7.a=10; if [ $a -gt 1 ] || [ $a -lt 10 ]; then echo ok; fi

特殊判断

if [ -d /home/ ]; then echo ok; fi  //-d:判断是不是目录以及是否存在。
if [ -f /home/ ]; then echo ok; fi   //-f:判断是不是普通文件以及是否存在。
if [ -x /root/test.txt ]; then echo ok; fi

//-r:判断是否有读权限。

//-w:判断是否有写权限。

//-x:判断是否可执行。

通过case判断

case格式:

case $变量 in

        对应变量)  条件

        ;;

esac

案例:通过输入一个数,判断是奇数还是偶数。

#! /bin/bash
read -p "please input a number:" n
a=$(($n%2))
case $a in
        1) echo "this is odd"
                ;;
        0) echo "this is even"
                ;;
        *) echo "your input is invali"
                ;;
esac


四、循环

for循环格式:

for 变量 in 集合;

do

        符合的条件

done

案例:循环输出1至5

#! /bin/bash
for i in 1 a s c x;
do
        echo $i
done

练习:通过搭配指令,实现循环输出当前文件夹下的所有文件。

#! /bin/bash
for file in $(ls);
do
        echo $file
done

通过$(指令),设置需要遍历的指令结果。

while循环格式:

while ((条件));

do

        符合条件指令

done

案例:循环输出递减。

#! /bin/bash
a=5
while [ $a -ge 1 ];
do
        echo $a
        a=$((a-1))
done


五、函数

什么是shell的函数

shell脚本中的函数就是先把一段代码整理到一个小单元中,并给这个小单元命名,当用到这段代码时直接调用这个小单元的名字即可。

 案例:通过设置相加函数实现两个参数相加。

#! /bin/bash
sum(){
        sum=$(($1+$2))
        echo $sum
}
sum $1 $2

 

练习:创建一个函数,输出"Hello World"

#! /bin/bash
say_Hello(){
        echo "Hello World"
}
#use function
say_Hello

六、中断与继续

中断break

案例:在循环输出1-10的时候,遇到5时候停下。

#! /bin/bash
for i in $(seq 1 10);
do
        if [ $i -eq 5 ]; then
                break
        fi
        echo $i
done

继续continue

案例:在循环输出1-10,遇到5时候不输出。

#! /bin/bash
for i in $(seq 1 10);
do
        if [ $i -eq 5 ]; then
                continue
        fi
        echo $i
done

退出程序exit

#!/bin/bash
for i in $(seq 1 5)
do
    echo $i
    if [ $i == 3 ]
    then
        exit
    fi
    echo $i
done
echo aaaaaaa


到这里基本的语法就学完了,下面将进行shell脚本实践

练习1:目录/tmp/log需要将老文件(比如三天以前的),挪到另外一个目录下 /tmp/logbak下。挪完之后,还需要做软链接,需要日志.

#!/bin/bash

# 定义目录和时间变量
log_dir="/tmp/log"
bak_dir="/tmp/logbak"
current_date=$(date +%s)
time_limit=$((3 * 24 * 60 * 60))  # 3 天的秒数

# 遍历 /tmp/log 目录下所有文件和子目录
find "$log_dir" -mindepth 1 -mtime +3 -type f | while read file; do
    # 构建备份文件路径
    bak_file="$bak_dir/$(basename "$file").$current_date.bak"
    
    # 备份文件
    mv "$file" "$bak_file"
    
    # 创建软链接
    ln -sf "$bak_file" "$file"
    
    # 输出备份信息
    echo "备份 $file 到 $bak_file,并创建软链接。"
done

练习2:写一个脚本,遍历当前txt目录下的txt文件,将这些txt文件做一个备份,备份的文件名增加一个年月日的后缀。

#!/bin/bash

# 获取当前年月日
current_date=$(date +"%Y%m%d")

# 遍历当前目录下的所有txt文件
for file in ./txt/*.txt; do
    if [ -f "$file" ]; then
        # 构建备份文件名
        backup_file="${file%.txt}_${current_date}.txt"

        # 复制文件到备份文件
        sudo cp "$file" "$backup_file"

        # 输出备份信息
        echo "备份 $file 到 $backup_file"
    fi
done

练习3:将 /var/log/ 目录中的文件移动到 /tmp/log/ 中,并将其中的某些文件在 3 天后备份到 /tmp/logbak/ 目录中。

#!/bin/bash
#auth:mm,date
#功能
Diskmov()
{
cd  /tmp/log
for dir in `ls`
do 
    for dir2 in `find $dir -maxdepth 1 -type d -mtime +3`
    do
        rsync -aR $dir2/  /tmp/logbak/ 
        if [ $? -eq 0 ]
        then
            rm -rf $dir2
            echo "/var/log/$dir2 移动成功"
            ln -s /tmp/logbak/$dir2  /tmp/log/$dir2  && echo "/tmp/log/$dir2成功创建软链接"
            echo 
        else
            echo "/tmp/log/$dir 未移动成功"
        fi      
    done
done
}
diskmov &> /tmp/move_old_data_`date +%F`.log

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

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

相关文章

git丢弃本地操作,强制使用线上最新代码

借鉴&#xff1a;弃用本地分支所有代码&#xff0c;获取远程分支最新代码_git获取远程最新分支_小中.的博客-CSDN博客 1.问题:git pull结果发现本地仓库比线上代码提前l两个commit。本地未进行任何操作。需要直接使用线上最新代码。ps:Author都是某同事。 2.操作&#xff1a; …

旅游网站的技术SEO:技巧与最佳实践

技术SEO在旅游网站中的作用 旅游网站都是关于用户体验和参与度的。但是&#xff0c;在开始处理这些参数之前&#xff0c;您需要努力使用户登陆您的网站。这意味着你需要让你的网站在搜索引擎结果页面&#xff08;SERP&#xff09;中排名。 一旦你在搜索引擎结果中获得曝光&am…

什么是PDM图纸管理系统?PDM图纸管理系统主要功能有哪些?

PDM (Product Data Management) 图纸管理系统 是用于管理企业内部图纸和相关文件的软件系统。它提供了一个集中存储、组织和跟踪图纸和文件的平台&#xff0c;以确保团队成员能够轻松访问、共享和更新所需的工程设计和制造数据。 彩虹PDM系统|PDM产品数据管理系统|BOM管理|工艺…

记录仿钉钉审批流(将MySQL换成Oracle)走过的坑

需求&#xff1a;实现审批流程 在Gitee上发现了一个功能还OK的项目&#xff0c;于是就clone下来了&#xff08;如下图&#xff09; 原项目用MySQL很好启动&#xff0c;B站上作者还录制了视频&#xff0c;可以去学习 这里主要记录将MySQL换成Oracle出现的问题 首先&#xff0c…

详解API开发【电商平台API封装商品详情SKU数据接口开发】

1、电商API开发 RESTful API的设计 RESTful API是一种通过HTTP协议发送和接收数据的API设计风格。它基于一些简单的原则&#xff0c;如使用HTTP动词来操作资源、使用URI来标识资源、使用HTTP状态码来表示操作结果等等。在本文中&#xff0c;我们将探讨如何设计一个符合RESTfu…

Embassy 库下载代码示例

解决方案&#xff1a; swift import Embassy let downloader Downloader() // 使用代理主机和端口 downloader.useProxy(proxyHost: ") // 下载 URL 的内容 let content downloader.download(from: "") // 输出下载的内容 print(content) 这个程序首先…

STM32 Nucleo-64 boards 外设资源引脚对应关系图

STM32 Nucleo-64 boards 外设资源引脚对应关系图 1. STM32 NUCLEO-F103RB1.1 串口对应关系图1.2 I2C对应关系图【参考博文】1. STM32 NUCLEO-F103RB 1.1 串口对应关系图 1.2 I2C对应关系图 注意:STM32 NUCLEO-F103RB

清早送朋友的阳光早安问候语祝福,愿你好运同行

1、早上好&#xff01;送上清晨第一缕阳光&#xff0c;伴随着燕舞蝶飞的风声&#xff0c;给您最温馨的问候。让心情放飞&#xff0c;让梦想翱翔&#xff0c;让生命绽放。祝您每天都充满能量&#xff0c;前程似锦&#xff01; ​ 2、平凡就是幸福&#xff0c;简单就是快乐&…

塑料注塑件自动化光学测量蓝光自动化三维检测解决方案-CASAIM-IS(2ND)

一、背景介绍 在塑料制品的生产过程中&#xff0c;注塑件的质量对于产品的整体质量和性能至关重要。然而&#xff0c;通过使用三坐标、卡尺、千分尺等量具&#xff0c;对工件进行单点或人工检测其加工精度&#xff0c;对复杂形位公差检测目前比较难取得数据&#xff0c;无法快…

基于Java SSM框架实现高校二手交易平台系统项目【项目源码+论文说明】

基于java的SSM框架实现高校二手交易平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校二手交易平台&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

基于three.js生成动态波浪背景效果

文章目录 前言一、安装three二、新建waves.js文件三、引入waves.js文件比查看效果如有启发&#xff0c;可点赞收藏哟~ 前言 基于three.js生成动态波浪背景效果 一、安装three npm i three -S二、新建waves.js文件 注意geometry.setAttribute和geometry.addAttribute和在不同…

一,vue3 解构 获取值 双向绑定 二。数据监听 双向绑定 三。冒泡排序

一&#xff0c;vue3 解构 获取值 双向绑定 <template><nav><!-- 按钮 --><!-- 绑定事件的弹框 v-on --><button click"submit">弹出</button><br><!-- 、双向绑定 --><input v-model"num" place…

Java(十)(网络编程,UDP,TCP)

目录 网络编程 两种软件架构 网络通信的三要素 IP IPv4的地址分类 特殊IP 端口号 协议 用UDP协议发送数据 用UDP接收数据 TCP接收和发送数据 TCP通信--支持与多个客户端同时通信 网络编程 可以让设备中的程序与网络上其他设备的程序进行数据交互(实现网络通信) 两…

TA-Lib学习研究笔记(二)——Overlap Studies下

TA-Lib学习研究笔记&#xff08;二&#xff09;——Overlap Studies下 &#xff08;11&#xff09;SAR - Parabolic SAR 抛物线指标 函数名&#xff1a;SAR 名称&#xff1a; 抛物线指标 简介&#xff1a;抛物线转向也称停损点转向&#xff0c;是利用抛物线方式&#xff0c;随…

【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能

文章目录 ⭐⭐⭐Spring核心源码分析自定义Spring框架⭐⭐⭐一、Spring使用回顾二、Spring核心功能结构1、Spring核心功能2、bean概述 三、Spring IOC相关接口分析1、BeanFactory解析2、BeanDefinition解析3、BeanDefinitionReader解析4、BeanDefinitionRegistry解析5、创建容器…

【Linux】tar 命令使用

tar 命令 tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 著者 由约翰吉尔摩和杰伊芬拉森撰写。 语法 tar [选项] [压缩后文…

【Lustre相关】功能实践-03-文件级冗余(FLR)

一、前言 DDN-03.11-File Level Redundancy (FLR) Category:FLR 1、功能介绍 在文件级冗余&#xff08;File Level Redundancy&#xff0c;FLR&#xff09;特性出现之前&#xff0c;Lustre文件系统数据冗余完全依赖于后端存储设备&#xff08;如RAID6&#xff09;。 Lustre在L…

【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第二次作业

Written Part 1. 给定包含属性&#xff5b;Height, Hair, Eye&#xff5d;和两个类别&#xff5b;C1, C2&#xff5d;的数据集。构建基于信息增益&#xff08;info gain&#xff09;的决策树。 HeightHairEyeClass1TallBlondBrownC12TallDarkBlueC13TallDarkBrownC14ShortDark…

C++输出100以内的素数

以下是一个简单的C程序&#xff0c;用于输出100以内的所有素数&#xff1a; #include <iostream>using namespace std;int main() { int num, i, flag 0; for(num 2; num < 100; num) { flag 0; for(i 2; i < num/2; i) { if(…

【面试HOT200】回溯篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot300】进行的&#xff0c;每个知识点的修正和深入主要参…