Shell基础入门实战

news2024/11/24 5:08:00

写在前面

好久没在项目内做自动化了,主要是现阶段在项目内做自动化收益不大,最近开发做batch run的正好缺人,我看了一下代码,就是通过代码读取jar包和远程服务器连接,然后通过shell脚本,向数据库插入数据,平时用shell不多,今天重新巩固下shell,也希望为新学shell的同学提供整体知识框架。


shell基本概念

什么是shell

Shell 脚本(shell script),简单理解是一些命令的集合,运行中linux的shell中。业界所说的 shell 通常都是指 shell 脚本,需要注意的是,shell 和 shell script 是两个不同的概念。
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁,通过它来访问操作系统内核的服务,Shell 既是一种命令语言,又是一种程序设计语言。

shell与linux命令的区别

  1. Shell是一个命令解释器,它能够执行和解释一系列的命令。Linux命令则是通过Shell执行的。

  2. Shell更像是一个程序语言,它支持变量、条件语句、循环、函数、文件操作等高级功能。而Linux命令则是预定义的、特定的系统操作命令,比如ls、cp、mv等命令。

  3. Shell可以编写脚本程序,使其能够完成复杂的任务,而Linux命令则不能。

  4. Shell可以交互式地使用,也可以脚本化地使用。而Linux命令则只能在终端或者脚本中使用。

  5. Shell还提供了一些特殊的命令,比如bash、zsh等,可以改变Shell的行为。Linux命令则是相对固定的,不能改变其行为。

shell常见语法

date命令

date命令用于查看和设置系统的日期和时间。

例如:

  1. 查看当前日期和时间,并以特定格式显示
date +"%Y-%m-%d %H:%M:%S"

在这里插入图片描述

  1. 设定时间,-1 day 表示当前日期前1天
date -d "-1 day" +%d # -d

数据类型

变量

shell中的变量可以用来存储数据,变量名通常以字母或下划线开头,也可以包含数字。变量赋值时,等号两边不能有空格。

例如:

name="Tom"

在函数内部定义的变量是局部变量,只有在函数内部才可以访问。而在函数外部定义的变量是全局变量,所有的函数都可以访问。

例如:

  1. 定义局部变量:
function test() {
  local name="Tom"
  echo "My name is $name"
}
  1. 定义全局变量:
name="Tom"
function test() {
  echo "My name is $name"
}

在这里插入图片描述

字符串操作

shell中可以对字符串进行各种操作,如拼接、截取、替换等。

例如:

  1. 拼接字符串:
str1="Hello"
str2="World"
str=$str1$str2
echo $str

在这里插入图片描述
2. 截取字符串:

str="Hello, World"
echo ${str:0:5}

在这里插入图片描述

  1. 替换字符串:
str="Hello, World"
echo ${str/Hello/Hi}

数字运算

shell中可以进行基本的数字运算,如加减乘除乘方等。可以使用expr命令或$(())语法。

例如:

  1. 使用expr命令进行运算:
result=`expr 2 + 3`
echo $result

在这里插入图片描述

  1. 使用$(())语法进行运算:
result=$(($num1*$num2))
echo $result

在这里插入图片描述

数组

shell中可以使用数组存储多个数据,数组使用小括号()来表示。

例如:

定义数组:

arr=("apple" "banana" "orange")

访问数组元素:

echo ${arr[1]}

获取数组长度:

echo ${#arr[@]}

预设变量

shell脚本中已经定义了一些预设变量,如 0 表示脚本名称, 0表示脚本名称, 0表示脚本名称,USER表示当前用户,$PWD表示当前目录等。

例如:

echo "当前脚本名称为:" $0
echo "当前用户为:" $USER
echo "当前目录为:" $PWD

特殊变量

shell脚本中还有一些特殊变量,如KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲表示传递给脚本的参数个数,*表示所有的参数列表。

例如:

$$ : Shell本身的PID(ProcessID)
$! : Shell最后运行的后台Process的PID 
$? : 最后运行的命令的结束代码(返回值)
$* : 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数
$@ :所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数
$# : 添加到Shell的参数个数
$0 : Shell本身的文件名
$1$n : 添加到Shell的各参数值。$1是第1参数、$2是第2参数…

与用户交互命令read

shell脚本也可以与用户进行交互,可以使用read命令实现。

例如:

读取用户输入:

read name
echo "Hello, $name"

在这里插入图片描述

逻辑判断

if 逻辑判断和参数

shell中可以使用if语句进行逻辑判断,一般会用到以下参数:

-e 判断文件或目录是否存在
-d 判断是否为目录
-f 判断是否为文件
-x 判断是否有执行权限

例如:

判断文件是否存在:

if [ -e "/var/log/syslog" ]; then
    echo "syslog文件存在"
else
    echo "syslog文件不存在"
fi

逻辑判断常用比较符

在if语句中经常会使用到比较符,例如:

  • eq:等于 equal to
  • ne:不等于 not equal to
  • gt:大于 greater than
  • lt:小于 less than
  • ge:大于等于 greater than or equal to
  • le:小于等于 less than or equal to

例如:

判断两个数字是否相等:

if [ $num1 -eq $num2 ]; then
    echo "两个数字相等"
else
    echo "两个数字不相等"
fi

case逻辑判断

shell中的case语句格式如下:

case 变量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
;;
esac

可以用来进行多重逻辑判断,可以配合使用各种比较符。

例如:

根据用户输入的数字输出不同的信息:

read num
case $num in
   1) echo "你选择了1"
   ;;
   2) echo "你选择了2"
   ;;
   3) echo "你选择了3"
   ;;
   *) echo "请输入有效的数字"
   ;;
esac

在这里插入图片描述

循环

for 循环

for循环遍历数组:

arr=("apple" "banana" "orange")
for i in ${arr[@]}; do
  echo $i
done

${arr[@]} 是 shell 中的数组变量展开语法,它会将数组中的所有元素展开成一个列表,每个元素之间用空格分隔。
在这段脚本中,假设 arr 数组中有三个元素 “apple”、“banana” 和 “orange”,那么 a r r [ @ ] 就会展开成 " a p p l e " 、 " b a n a n a " 和 " o r a n g e " 这三个字符串,然后 f o r 循环会遍历这三个字符串并输出。更具体地说, {arr[@]} 就会展开成 "apple"、"banana" 和 "orange" 这三个字符串,然后 for 循环会遍历这三个字符串并输出。 更具体地说, arr[@]就会展开成"apple""banana""orange"这三个字符串,然后for循环会遍历这三个字符串并输出。更具体地说,{arr[@]} 展开后的结果相当于是 “ a r r [ 0 ] " 、 " {arr[0]}"、" arr[0]""{arr[1]}” 和 “${arr[2]}” 这三个字符串,因为 [@] 在数组变量中表示所有元素的列表。如果写成 ${arr[*]},那么展开结果就是 “apple banana orange”,其中所有元素用空格拼接起来。

在这里插入图片描述

while循环

num=1
while [ $num -lt 5 ]; do
    echo $num
    num=$(($num+1))
done

在这里插入图片描述

中断和继续

在循环中可以使用break来中断循环,使用continue来跳过本次循环。

例如:

使用break跳出循环:

for i in 1 2 3 4 5; do
    if [ $i -eq 3 ]; then
        break
    fi
    echo $i
done

在这里插入图片描述

使用continue跳过本次循环:

for i in 1 2 3 4 5; do
    if [ $i -eq 3 ]; then
        continue
    fi
    echo $i
done

在这里插入图片描述

函数

shell中可以定义函数来完成一些特定的任务,函数可以在脚本中任何位置定义。

例如:

定义一个函数:

function myFunc() {
    echo "Hello, World"
}

myFunc

在这里插入图片描述

shell中的技巧

在shell脚本编写中,还有一些技巧可以提升效率,如:

  1. 使用 && 或者 || 来执行多条命令,可以在一些场景下节省一行代码.

    • 命令之间用&&隔开:若前面的命令执行成功,才会去执行后面的命令,这样可以保证所有的命令执行完毕后,执行过程都是成功的。
    • 命令之间用||或者|隔开: 只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
    • 注意区分&表示希望脚本在后台运行的时候使用它
  2. ‘’ 表示强引用,""表示弱引用,``用于执行命令。例如:

    echo "我是$USER"
    echo '我是$USER'
    echo "我在`pwd`目录下"
    

    在这里插入图片描述

  3. ; 可以用来分隔多条命令,但是建议使用 && 或 || 来代替,可以更好地控制流程。

例如:

grep "xx" log.txt && cp log.txt log.bak

shellcheck

shellcheck 是一款实用的 shell脚本静态检查工具。

  1. 安装方式:
    在大多数发行版的包管理中,已经有shellcheck了,如在基于debian的机器上
apt-get install shellcheck

或者:

yum -y install epel-release
yum install ShellCheck

项目源码:https://github.com/koalaman/shellcheck

  1. 如何使用
    2.1 在网页上使用
    在网页 https://www.shellcheck.net 上,贴入你的脚本,运行检查即可
    2.2 在命令行中使用
    下载后,在命令行中调用 shellcheck yourscript 即可。
    2.3集成到编辑器中(推荐)
    推荐将shellcheck直接集成到日常编辑器中,这样就可以直接在编辑器中查看ShellCheck建议,以最快速度发现并修复问题。
    • Sublime 通过 SublimeLinter
    • VSCode 通过 vscode-shellcheck

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

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

相关文章

如何成为一名优秀的接口自动化测试工程师?了解这些技能是关键

摘要: 随着互联网行业的不断发展,越来越多的应用程序通过API接口提供服务。因此,接口自动化测试成为了保障软件质量的重要环节。本文将介绍接口自动化测试所需掌握的技能,以及相关的历史进程。 B站首推!2023最详细自…

什么是 Java 垃圾回收器~

什么是 Java 垃圾回收器 Java 垃圾回收器是 Java 虚拟机 (JVM) 的三个重要模块 (另外两个是解释器和多线程机制) 之一,为应用程序提供内存的自动分配 (Memory Allocation)、自动回收 (Garbage Collect) 功能,这两个操作都发生在 Java 堆上 (一段内存快)…

sqoop安装

文章目录 1. 上传安装包至虚拟机2. 解压安装包到指定路径3. 修改目录名4. 配置环境变量5. 修改配置文件6. 拷贝mysql驱动包7. 验证安装是否成功8. 测试sqoop连接mysql 注:sqoop安装的前提条件是环境已安装java和hadoop 1. 上传安装包至虚拟机 上传安装包sqoop-1.4.…

信通初试第一:无科研无竞赛一战上岸上海交大819学硕感悟

笔者来自通信考研小马哥23上交819全程班学员 信通初试第一:无科研无竞赛一战上岸上海交大819学硕感悟 原创2023-04-27 11:04通信考研小马哥 笔者来自通信考研小马哥23上交819全程班学员 本人情况: 本人是19届交本,本科成绩很差,…

赎金信(Hash的应用)

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 来源:力扣&#xff0…

Java 实现 YoloV7 目标检测

1 OpenCV 环境的准备 这个项目中需要用到 opencv 进行图片的读取与处理操作,因此我们需要先配置一下 opencv 在 java 中运行的配置。 首先前往 opencv 官网下载 opencv-4.6 :点此下载;下载好后仅选择路径后即可完成安装。 此时将 opencv\b…

WMS是什么?

WMS(Warehouse Management System)中文译作仓库管理系统,是一种专用于物流仓储管理的IT系统。它主要应用于企业物流中心、配送中心、供应商物料储备中心、电子商务配送中心等仓库管理过程中。 WMS系统可以帮助企业管理和控制其物流仓储流程。…

线程池的设计

一.什么是线程池? 线程池就是创建若干个可执行的线程放到容器中,有任务处理时,会提交到线程池中的任务队列中,线程处理完不是销毁,而是阻塞等待下一个任务。 二.为何要使用线程池? 降低资源消耗。重复利用创建好的线程减少线…

NLP原理和应用入门:paddle(梯度裁剪、ONNX协议、动态图转静态图、推理部署)

目录 一、梯度裁剪 1.1设定范围值裁剪 1. 全部参数裁剪(默认) 2. 部分参数裁剪 1.2 通过L2范数裁剪 1.3通过全局L2范数裁剪 二. 模型导出ONNX协议 三、动态图转静态图 3.1两种图定义 3.2 什么场景下需要动态图转静态图 3.3为什么动态图模式越来…

k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 + mysql 数据库

k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 mysql 数据库 大纲 1 镜像制作2 准备configmap3 准备deploy 部署文件4 部署seata到k8s 镜像制作 下载seata 选择1.6.0。下载后得到 seata-server-1.6.0.zip 已经上传到百度云盘 下载地址:http://seata.io/zh-cn…

Maven 依赖下载失败解决方案——配置国内源 + 具体解决办法

目录 前言 一、配置 Maven 国内源 二、重新下载jar包 三、其他问题 前言 最近发现 spring-boot 框架更新到 2.7.11 了,由于以前一直使用的是 2.7.9 ,所以一直出现依赖下载失败的问题,实际上这是由于 IDEA 会先加载之前下载好的依赖&#xf…

openharmony内核中不一样的双向链表

不一样的双向链表 链表初识别遍历双向链表参考链接 链表初识别 最近看openharmony的内核源码时看到一个有意思的双向链表,结构如下 typedef struct LOS_DL_LIST{struct LOS_DL_LIST *pstPrev; //前驱节点struct LOS_DL_LIST *pstNext; //后继节点 }LOS_DL_LIST;不…

FPGA入门系列12--RAM的使用

文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码…

Spring IOC DI - 整合MyBatis

Spring IOC目录 主要内容Spring 框架介绍Spring 框架的优势(对比以前项目的缺点)Spring 框架引入历史发展框架学习三要素Spring 模块介绍 Spring IoC/DI - 引入IoC/DI 概念辨析使用IoC/DI的好处IoC/DI具体应用场景 Spring IoC/DI - 代码实现环境准备Spring 框架环境搭建创建Mav…

图的遍历和应用

文章目录 图的遍历深度优先遍历对于无向图的邻接矩阵的深度优先遍历无向非连通图的深度优先遍历 对于无向图的邻接表的深度优先遍历非递归实现深度优先遍历无向图的邻接矩阵代码实现无向图的邻接表代码实现递归和非递归的同异 广度优先遍历邻接表BFS邻接矩阵BFS 图的应用生成树…

Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

前言 在项目研发中,相信大家都遇到过给用户增加头像照片的需求。 随着手机版本的不断更新,android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等;遇到这个功能需求,大家肯定会想,“这还不好写&…

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法

二氧化碳地质封存技术起步较晚,目前仍没有一套相对完整的行业规范;且就该技术而言,涉及环节众多,理论相对复杂,对于行业的新入局者不太友好。因此,结合时代背景,我们首次尝试对二氧化碳地质封存…

【裸金属服务器】安装VMware ESXi

官方安装操作ESXi地址 一、虚拟化服务器分类: 寄居架构(Hosted Architecture)和裸金属架构(Bare Metal Architecture)。 1、寄居架构(Hosted Architecture):在操作系统之上安装和运…

8.系统日志

1.api访问日志 对应数据库 拦截器 拦截逻辑 ApiAccessLogFilter类的createApiAccessLog方法 buildApiAccessLogDTO方法就是完善实体类,把接口执行时长之类的填充完整。 然后就是保存日志到infra_api_access_log数据库。 过滤器注册生效 2.api错误日志 对应数…

Windows 程序开机自启动速度优化,为什么腾讯会议自启动速度那么高?

目录 一、问题的说明和定义 二、问题的分析 1.问题初步分析 2.详细的分析: 2.1Windows常见的自启动方式 2.2Windows常见的自启动方式的细节分析 三、问题的解决方案 1、为什么腾讯会议Rooms那么快 2.我们是否可以跟腾讯会议一样快 一、问题的说明和定义 这…