Linux运维之shell基础

news2024/9/21 14:36:20

一.流程控制

1.if判断

基本语法:

if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi

注意事项:

  • ①[ 条件判断式 ],中括号和条件判断式之间必须有空格
  • ②if 后要有空格

例如,现在写一个if.sh脚本文件

#!/bin/bash
if [ $1 -eq 1 ]
then
echo "CSDN @ 终究还是散了"
elif [ $1 -eq 2 ]
then
echo "博客园 @ 挽留岁月挽留你"
fi

2.case语句

基本语法:

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

注意事项:

  • (1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  • (2)双分号“;;”表示命令序列结束,相当于C语言中的 break。
  • (3)最后的“*)”表示默认模式,相当于 C语言中的 default。

例如,现在写一个case.sh文件:

#!/bin.bash
case $1 in
"1")
echo "CSDN@终究还是散了"
;;
"2")
echo "博客园@挽留岁月挽留你"
;;
*)
echo "CSDN666"
esac

3.for循环

基本语法1:

for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

例如:

#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum

基本语法2:

for 变量 in123do
程序
done

例如:

#!/bin/bash
#输出每个变量
for i in CSDN IOT KUST
do
        echo "I love $i"
done

4.while循环

基本语法:

while [ 条件判断式 ]
do
程序
done

例如:

#!/bin/bash
i=0
sum=0
while (( i < 5 ))
do
    echo $i
    i=$((i+1))
done

5.演示

TPKE.jpg

二.函数

1.basename

作用:取路径里的文件名

语法:basename string [suffix]

其中,string 表示要获取文件名的路径字符串,可以是绝对路径或相对路径;suffix 则是一个可选参数,表示要去除的后缀部分。如果 string 不包含目录分隔符,则命令返回整个路径,否则返回最后一个目录分隔符之后的部分作为文件名。

以下是一些 basename() 函数的示例:

$ basename /var/www/html/index.php
index.php

$ basename uploads/images/avatar.jpg .jpg
avatar

2.dirname

语法:dirname 文件绝对路径

作用:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

其中,string 表示要获取目录部分的文件路径字符串,可以是绝对路径或相对路径。命令返回 string 中最后一个斜杠 / 之前的部分作为目录名。

以下是 dirname 命令的示例:

$ dirname /var/www/html/index.php
/var/www/html

$ dirname uploads/images/avatar.jpg
uploads/images

3.自定义函数

基本语法:

[ function ] funname[()]
{
Action;
[return int;]
}
  • (1)必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一
    样先编译。
  • (2)函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将
    以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)

下面是一个自定义函数的例子:

#!/bin/bash
function sum()
{
s=0
s=$[$1+$2]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;

计算两个输入参数的和。

三.正则表达式

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文
本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,
sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。

1.常规匹配

常规匹配我们之前就接触过,比如在 grep命令 中我们使用grep命令和管道符| 进行匹配搜索,就是常规匹配的方法。

2.匹配字符

以下是常见的 POSIX 正则表达式特殊字符和元字符的列表:

  • .:表示匹配任意一个字符。
  • *:表示匹配前面的字符 0 次或多次。
  • +:表示匹配前面的字符 1 次或多次。
  • ?:表示匹配前面的字符 0 次或 1 次。
  • |:表示匹配两个或多个规则之一。
  • [ ]:表示匹配一个字符集合中的任意一个字符。
  • \:用于转义后面的字符。
  • ^:表示匹配输入字符串的开始位置。
  • $:表示匹配输入字符串的结束位置。

以下是 POSIX 正则表达式中一些特殊字符和元字符的举例:

  • .:表示匹配任意一个字符。例如,a.c 可以匹配 “abc”、“adc”、“aec” 等等,其中 . 可以匹配任意一个字符。
  • *:表示匹配前面的字符 0 次或多次。例如,a*b 可以匹配 “ab”、“aab”、“aaab” 等等,其中 * 匹配前面的字符 a 零个或多个。
  • +:表示匹配前面的字符 1 次或多次。例如,a+b 可以匹配 “ab”、“aab”、“aaab” 等等,其中 + 匹配前面的字符 a 至少一次。
  • ?:表示匹配前面的字符 0 次或 1 次。例如,a?b 可以匹配 “ab” 和 “b”,其中 ? 匹配前面的字符 a 零次或一次。
  • |:表示匹配两个或多个规则之一。例如,apple|banana 可以匹配 “apple” 或 “banana” 中的任意一个。
  • [ ]:表示匹配一个字符集合中的任意一个字符。例如,[aeiou] 可以匹配所有的元音字母,即 a、e、i、o、u 中的任意一个。
  • \:用于转义后面的字符。例如,\. 可以匹配字符串中的点号 “.”,其中 “” 将 “.” 转义为普通字符。
  • ^:表示匹配输入字符串的开始位置。例如,^abc 可以匹配以 “abc” 开始的字符串。
  • $:表示匹配输入字符串的结束位置。例如,abc$ 可以匹配以 “abc” 结尾的字符串。

需要注意的是,在使用正则表达式时,应该根据实际情况选用合适的正则表达式引擎和匹配模式,以获得最佳的性能和匹配结果。

我们这里只掌握基础常规的正则表达式即可。

四.文本处理工具

1.cut

在shell中,cut命令用于从文本文件或标准输入中剪切指定字段。它通常与其他命令一起使用,例如grep和sort。

cut命令的基本语法如下:

cut [OPTIONS] [FILE]

其中,OPTIONS是用于指定需要剪切的字段、定界符等选项的参数,FILE是输入文件的名称或者表示标准输入的破折号“-”。

以下是一些常用的cut命令选项:

  • -c:按字符位置剪切字段。
  • -f:按字段分隔符剪切字段。
  • -d:指定字段分隔符,默认为制表符。
  • –complement:剪切除指定字段以外的所有字段。

例如,要将文件file.txt中每行的第2个和第4个字符提取出来,可以使用如下命令:

cut -c 2,4 file.txt

如果要将文件file.txt中以冒号作为字段分隔符的第2个和第3个字段提取出来,可以使用如下命令:

cut -d : -f 2,3 file.txt

选取系统 PATH 变量值,第 2 个“:”开始后的所有路径:

 echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/
home/atguigu/bin
echo $PATH | cut -d ":" -f 3-
/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin

注意,cut命令只能处理文本文件,不能用于二进制文件或其他非文本文件。

2.awk

awk是一种用于处理文本文件的强大命令行工具。它可以根据一定的规则(通常是一个模式和一个动作组合)从输入文本中抽取数据或进行操作,并将结果输出到标准输出或文件中。

awk命令的最基本形式如下:

awk 'pattern {action}' filename

其中,pattern表示需要匹配的模式,可以是正则表达式或字符串;action表示当模式匹配时要执行的动作,可以是任意有效的awk命令;filename表示要处理的文件名,也可以用管道符“|”将另一个命令的输出作为awk的输入。

  • 选项“-F”指定字段分隔符,默认是空格或制表符。例如,“-F:”表示以冒号为字段分隔符。

  • 选项“-v”用于定义变量值。例如,“-v x=10”表示定义变量x的值为10。

  • pattern:表示 awk 在数据中查找的内容,就是匹配模式(正则表达式)

  • action:在找到匹配内容时所执行的一系列命令

搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列:

 awk -F : '/^root/{print $7}' passwd

匹配模式通常是正则表达式,而正则表达式必须用 / 括起来,以指示中间内容为正则表达式。

只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,
shell 在最后一行添加"CSDN,/bin/csdn"

awk -F : 'BEGIN{print "user, shell"} {print $1","$7}
END{print "CSDN,/bin/csdn"}' passwd

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。这个例子里面没有匹配模式。

awk的内置变量:

变量说明
FILENAME文件名
NR已读的记录数(行号)
NF浏览记录的域 的个数(切割后,列的个数)

统计 passwd 文件名,每行的行号,每行的列数:

awk -F : '{print "filename:" FILENAME ",linenum:"NR ",col:"NF}' passwd

五.综合应用:归档文件

实际生产应用中,往往需要对重要数据进行归档备份。
需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive 下。
这里用到了归档命令:tar,后面可以加上-c 选项表示归档,加上-z 选项表示同时进行压缩,得到的文件后缀名为.tar.gz。

以下是一个示例shell脚本实现:

bashCopy Code#!/bin/bash

# 获取输入的目录名
directory=$1

# 格式化当前日期,例如:20230501
date=$(date +%Y%m%d)

# 如果目录不存在则退出脚本
if [ ! -d $directory ]; then
  echo "目录不存在"
  exit 1
fi

# 将目录下的所有文件按天归档保存到/root/archive目录下
tar -czvf /root/archive/"$directory"_"$date".tar.gz $directory/*

echo "归档完成"

使用方法:

  1. 将以上代码复制到一个名为backup.sh的文件中,并将其放置在可执行路径下。
  2. 在终端中进入想要备份的目录所在的路径。
  3. 运行 backup.sh 目录名称 命令即可进行备份。

备注:以上实现方式并不完整或者不够健壮,还需要根据具体需求进行修改和优化。

六.说明

新星计划:Linux运维@刘晨阳导师创作打卡5!

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

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

相关文章

echarts关于自定义饼图数据刷新和颜色渲染问题

在使用echarts的自定义饼图Customized Pie时&#xff0c;定义的动态数据会发生颜色无法渲染的问题&#xff0c;如下图所示&#xff1a; 该图表的颜色是根据itemStyle内的color属性而来&#xff0c;如下&#xff1a; itemStyle: {color: #4d90fe, /* 图表的颜色 */shadowBlur:…

【python知识】importlib包详解

importlib — The implementation of import — Python 3.11.3 documentation 目录 一、说明 二、 模块导入简介 2.1 最简单的 importlib用途 2.2 importlib 包的目的有三个 2.3 import_module() 和__import__() 三、高级模块使用 3.1 动态引入 3.2 模块引入检查 3…

SpringBoot整合Mybatis-Plus、Jwt实现登录token设置

Spring Boot整合Mybatis-plus实现登录常常需要使用JWT来生成用户的token并设置用户权限的拦截器。本文将为您介绍JWT的核心讲解、示例代码和使用规范&#xff0c;以及如何实现token的生成和拦截器的使用。 一、JWT的核心讲解 JWT&#xff08;JSON Web Token&#xff09;是一种…

JavaWeb——HTML和CSS

HTML和CSS定义 标记语言 :比如XML:可扩展的标记语言&#xff0c;标签可以自己定义&#xff0c;解析时需要按照定义的规则去解析。 学习目的:掌握常见标签和常见样式的使用 HTML 结构: 特点: 1.不区分大小写&#xff0c;不管是<html>还是<HTML>都是一样的作用 …

错题笔记第一篇

目录 1. strlen的用法2. case3. switch4. 二分查找 1. strlen的用法 正确答案 &#xff1a;C strlen计算的是字符串的长度&#xff0c;二字符串是以\0结尾&#xff0c;而咱们并没有存储\0&#xff0c;后序的空间是未知的&#xff0c;strlen找不到\0就会一直找&#xff0c;所以它…

如何使 VSCode 中 CMake Debug 的输出显示在 cmd 上而不是自带的 debug console

如何使 VSCode 中 CMake Debug 的输出显示在 cmd 上而不是自带的 debug console 首先需要明确的一点是从 VSCode 插件商店下载的 CMake 是默认打印输出的结果在 debug console 中的&#xff0c;就像下面这样&#xff1a; 可以看到&#xff0c;一个问题是在加载 dll 时候会频繁…

82. Python split方法-分割字符串

82. split方法-分割字符串 文章目录 82. split方法-分割字符串1. 什么是split( )函数2. split( )方法的语法格式如下&#xff1a;3. 实操练习4. 列表索引取值知识回顾5. 用split方法分解网址提取有效信息6. 从地址信息中拆分省、市、区信息 1. 什么是split( )函数 split[splɪ…

深度学习模型压缩与优化加速

1. 简介 深度学习&#xff08;Deep Learning&#xff09;因其计算复杂度或参数冗余&#xff0c;在一些场景和设备上限制了相应的模型部署&#xff0c;需要借助模型压缩、系统优化加速、异构计算等方法突破瓶颈&#xff0c;即分别在算法模型、计算图或算子优化以及硬件加速等层…

《LearnUE——基础指南:上篇—2》——GamePlay架构之Level和World

目录 听说世界是由多个Level组成的 1.2.1 引言 1.2.2 建造大陆&#xff08;ULevel&#xff09; 1.2.3构建世界&#xff08;World&#xff09; 1.2.4总结 听说世界是由多个Level组成的 1.2.1 引言 上小节谈到Actor和Component的关系&#xff0c;UE利用Actor的概念组成了世…

GitLab统计代码量

gitlab官方文档&#xff1a;https://docs.gitlab.com/ee/api/index.html 1、生成密钥 登录gitlab&#xff0c;编辑个人资料&#xff0c;设置访问令牌 2、获取当前用户所有可见的项目 接口地址 GET请求 http://gitlab访问地址/api/v4/projects?private_tokenxxx 返回参数 …

【文章学习系列之模型】Non-stationary Transformers

本章内容 文章概况总体结构主要模块Series Stationarization&#xff08;序列平稳化模块&#xff09;De-stationary Attention&#xff08;逆平稳化注意力模块&#xff09; 实验结果消融实验总结 文章概况 《Non-stationary Transformers:Exploring the Stationarity in Time …

Docker 存储

Docker 存储 docker 默认存储方式docker 持久化存储Volumes &#xff08;卷&#xff09;简介推荐使用情况 Bind mounts &#xff08;绑定挂载&#xff09;简介推荐使用情况 绑定挂载与卷注意点 docker 非持久化存储tmpfs mounts &#xff08;tmpfs 挂载&#xff09;简介推荐使用…

leetcode100——相同的树

文章目录 题目详情分析Java完整代码 题目详情 leetcode100 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例&#xff1a; 分析 主要想法…

vue3头像上传组件

用到了自定义组件v-model的双向绑定使用input的typefile这个原生html元素&#xff0c;通过监听change事件&#xff0c;获取到选择的文件&#xff08;注意&#xff0c;选择完文件值后&#xff0c;要把这个隐藏的input的typefile元素的value置为空&#xff0c;否则&#xff0c;下…

【关于C++中----异常】

文章目录 一、C语言中处理错误的方式二、C异常概念三、异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 四、自定义异常体系五、C标准库的异常体系六、异常的优缺点 一、C语言中处理错误的方式 C语言中常见的错误类型包括&#xff1a;语法错误、逻…

访问 virtualbox中的mysql

在 mysql.user 中存储这用户可访问的的host地址 select user,host from user;修改访问权限 可以使用sql语句 use mysql; mysql>update user set host % where user root; flush privileges或者使用mysql的权限语句 use mysql; Grant all on *.* to root% identified b…

深入浅出C++ ——异常

文章目录 一、C语言传统的处理错误的方式二、C异常概念三、异常的使用异常的抛出和捕获异常的重新抛出异常安全异常规范 四、自定义异常体系无、C标准库的异常体系六、异常的优缺点 一、C语言传统的处理错误的方式 C语言传统的处理错误的机制&#xff1a; 终止程序&#xff0…

docker打包部署spring boot应用(mysql+jar+Nginx)

文章目录 一、基本准备二、mysql部署二、jar部署三、Nginx部署 一、基本准备 小唐拿的就是之前放置在我们服务器上的应用进行部署&#xff0c;主要就是mysql和jar还有Vue的部署。 目前已经有的是jar、已经打包好的vue 项目参考&#xff1a;小破站数据大屏可视化&#xff08;…

【IPv6】IPv6有无状态地址分配及IPv6路由

IPv6有无状态区分 有状态可控、可管理。有IP地址管理者&#xff0c;能够识别客户端。根据不同客户端分配对应v6地址&#xff0c;客户端和服务器存在租期及续约。无状态无控、难管理。无IP地址管理者&#xff0c;没人识别客户端。客户端根据网关发送的相同的RA报文内容&#xf…

path/to/sdkmanager --install “cmdline-tools;latest“

执行flutter doctor时、报错Android Studio的命令行工具没有安装& 以及 android-licenses没有同意 其中提示错误语句如标题: path/to/sdkmanager --install "cmdline-tools;latest"之类的, 因为同意条款的时候,日志太多,所以把报错覆盖了.没有截图. 解决方法: …