Shell基础入门实战
写在前面
好久没在项目内做自动化了,主要是现阶段在项目内做自动化收益不大,最近开发做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命令的区别
-  
Shell是一个命令解释器,它能够执行和解释一系列的命令。Linux命令则是通过Shell执行的。
 -  
Shell更像是一个程序语言,它支持变量、条件语句、循环、函数、文件操作等高级功能。而Linux命令则是预定义的、特定的系统操作命令,比如ls、cp、mv等命令。
 -  
Shell可以编写脚本程序,使其能够完成复杂的任务,而Linux命令则不能。
 -  
Shell可以交互式地使用,也可以脚本化地使用。而Linux命令则只能在终端或者脚本中使用。
 -  
Shell还提供了一些特殊的命令,比如bash、zsh等,可以改变Shell的行为。Linux命令则是相对固定的,不能改变其行为。
 
shell常见语法
$符号
$代表的是Shell中的变量,用于表示一个变量的值。例如,$PATH表示当前环境变量中的PATH值。
$(())用于算术运算,可以计算数学表达式的结果,并将结果赋给变量。例如:x=$((2+3)),计算2+3的结果,将结果5赋给变量x。
$()用于命令替换,可以执行命令并将命令的输出结果作为字符串返回。例如:x=$(ls),执行ls命令,将ls命令的输出字符串赋给变量x。
date命令
date命令用于查看和设置系统的日期和时间。
例如:
- 查看当前日期和时间,并以特定格式显示
 
date +"%Y-%m-%d %H:%M:%S"
 

- 设定时间,-1 day 表示当前日期前1天
 
date -d "-1 day" +%d # -d
 
数据类型
变量
shell中的变量可以用来存储数据,变量名通常以字母或下划线开头,也可以包含数字。变量赋值时,等号两边不能有空格。
例如:
name="Tom"
 
在函数内部定义的变量是局部变量,只有在函数内部才可以访问。而在函数外部定义的变量是全局变量,所有的函数都可以访问。
例如:
- 定义局部变量:
 
function test() {local name="Tom"echo "My name is $name"
}
 
- 定义全局变量:
 
name="Tom"
function test() {echo "My name is $name"
}
 

字符串操作
shell中可以对字符串进行各种操作,如拼接、截取、替换等。
例如:
- 拼接字符串:
 
str1="Hello"
str2="World"
str=$str1$str2
echo $str
 

 2. 截取字符串:
str="Hello, World"
echo ${str:0:5}
 

- 替换字符串:
 
str="Hello, World"
echo ${str/Hello/Hi}
 
数字运算
shell中可以进行基本的数字运算,如加减乘除乘方等。可以使用expr命令或$(())语法。
例如:
- 使用expr命令进行运算:
 
result=`expr 2 + 3`
echo $result
 

- 使用$(())语法进行运算:
 
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" ]; thenecho "syslog文件存在"
elseecho "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 ]; thenecho "两个数字相等"
elseecho "两个数字不相等"
fi
 
case逻辑判断
shell中的case语句格式如下:
case 变量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
;;
esac
 
可以用来进行多重逻辑判断,可以配合使用各种比较符。
例如:
根据用户输入的数字输出不同的信息:
read num
case $num in1) echo "你选择了1";;2) echo "你选择了2";;3) echo "你选择了3";;*) echo "请输入有效的数字";;
esac
 

循环
for 循环
for循环遍历数组:
arr=("apple" "banana" "orange")
for i in ${arr[@]}; doecho $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 ]; doecho $numnum=$(($num+1))
done
 

中断和继续
在循环中可以使用break来中断循环,使用continue来跳过本次循环。
例如:
使用break跳出循环:
for i in 1 2 3 4 5; doif [ $i -eq 3 ]; thenbreakfiecho $i
done
 

使用continue跳过本次循环:
for i in 1 2 3 4 5; doif [ $i -eq 3 ]; thencontinuefiecho $i
done
 

函数
shell中可以定义函数来完成一些特定的任务,函数可以在脚本中任何位置定义。
例如:
定义一个函数:
function myFunc() {echo "Hello, World"
}myFunc
 

shell中的技巧
在shell脚本编写中,还有一些技巧可以提升效率,如:
-  
使用 && 或者 || 来执行多条命令,可以在一些场景下节省一行代码.
- 命令之间用&&隔开:若前面的命令执行成功,才会去执行后面的命令,这样可以保证所有的命令执行完毕后,执行过程都是成功的。
 - 命令之间用||或者|隔开: 只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
 - 注意区分&表示希望脚本在后台运行的时候使用它
 
 -  
‘’ 表示强引用,""表示弱引用,``用于执行命令。例如:
echo "我是$USER" echo '我是$USER' echo "我在`pwd`目录下"
 -  
;可以用来分隔多条命令,但是建议使用 && 或 || 来代替,可以更好地控制流程。 
例如:
grep "xx" log.txt && cp log.txt log.bak
 
shellcheck
shellcheck 是一款实用的 shell脚本静态检查工具。
- 安装方式:
在大多数发行版的包管理中,已经有shellcheck了,如在基于debian的机器上 
apt-get install shellcheck
 
或者:
yum -y install epel-release
yum install ShellCheck
 
项目源码:https://github.com/koalaman/shellcheck
- 如何使用
2.1 在网页上使用
在网页 https://www.shellcheck.net 上,贴入你的脚本,运行检查即可
2.2 在命令行中使用
下载后,在命令行中调用 shellcheck yourscript 即可。
2.3集成到编辑器中(推荐)
推荐将shellcheck直接集成到日常编辑器中,这样就可以直接在编辑器中查看ShellCheck建议,以最快速度发现并修复问题。- Sublime 通过 SublimeLinter
 - VSCode 通过 vscode-shellcheck
 
 
实战演练
使用shell打印99乘法表,这个是面试常考题使用python或者java实现99乘法表,现在用shell实现
- 首先vi test99.sh,并写入脚本如下:
 
#!/bin/bash
for i in {1..9};do
for j in {1..9};doif [ $j -le $i ];thenecho -n "$j*$i=$((i*j)) "fidoneecho ""done
 
以上脚本的逻辑是嵌套循环i和j如果j小于或者等于i,那么输出公式,公式的含义等号左边是引用i和j的数值,等号右边是i和j相乘的结果,内循环结束后,使用echo "",输出换行。
- 使用shell检查脚本

 - 更改脚本权限 
chmod a+x test99.sh - 最后执行结果如下:

 
相关文章:
Shell基础入门实战
写在前面 好久没在项目内做自动化了,主要是现阶段在项目内做自动化收益不大,最近开发做batch run的正好缺人,我看了一下代码,就是通过代码读取jar包和远程服务器连接,然后通过shell脚本,向数据库插入数据&a…...
如何进行微服务的技术选型?
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:陈于吉吉|慕课网讲师 随着这几年微服务的火爆,在平时的工作或者技术交流中,我们总能听到哪家公…...
Vue电商项目--应用开发详解
vue-cli脚手架初始化项目 首先,页面上新建一个文件夹。然后打开命令端口 vue create app 选择Default ([Vue 2] babel, eslint) 然后把项目拖拽到vscode中。项目目录看一下 脚手架项目的目录 node_modules:放置项目依赖的地方 public:一般放置一些共用的静态资源&a…...
Lvs负载均衡
系列文章目录 文章目录 系列文章目录一、集群1.集群2. 二、LVS1.LVS简介2.负载均衡的结构3.Lvs调度算法 总结 一、集群 1.集群 集群群集 cluster由多台主机构成的一个整体,提供一个放问入口(IP或域名),集群中的多台主机都干一件事提供一样的服务 负载均…...
JAVAWeb08-手动实现 Tomcat 底层机制+ 自己设计 Servlet
1. 前言 先看一个小案例, 引出对 Tomcat 底层实现思考 1.1 完成小案例 ● 快速给小伙伴完成这个小案例 0. 我们准备使用 Maven 来创建一个 WEB 项目, 老师先简单给小伙伴介绍一下 Maven 是什么, 更加详细的使用,我们还会细讲, 现在先使用一把 先创建…...
非监督学习简单介绍
文章目录 非监督学习简单介绍聚类K-meansHierarchical聚类DBSCAN 降维PCAt-SNE 其他非监督学习技术结论 非监督学习简单介绍 非监督学习是机器学习中的一种方法,其目标是基于数据的内在结构和关系,从而在无标签数据中识别样本的潜在结构和模式。非监督学…...
香港科技大学有什么好的专业?
香港科技大学创办于1991年10月,是一所坐落于香港清水湾半岛的公立研究型大学。大学设有4个学院:工学院、理学院、人文社会科学学院和工商管理学院,还设有2个研究院:香港科技大学公共政策和行政研究生院和香港科技大学霍英东研究院…...
【两个月算法速成】day04
本文以收录专题刷题记录 目录 24. 两两交换链表中的节点 题目链接 思路 代码 19. 删除链表的倒数第 N 个结点 题目链接 思路-双指针 代码 面试题 02.07. 链表相交 题目链接 思路 代码 24. 两两交换链表中的节点 题目链接 力扣 思路 建议使用虚拟节点࿰…...
【Python】实战:生成无关联单选问卷 csv《压疮风险评估表》
目录 一、适用场景 二、业务需求 三、Python 文件 (1)创建文件 (2)代码示例 四、csv 文件 一、适用场景 实战场景: 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…...
rsync 远程删除文件
rsync 远程删除文件 rsync是一个强大的远程数据同步工具,它不仅可以实现远程文件复制,也可以实现远程文件删除。 要使用rsync实现远程删除文件,可以使用如下命令: bash rsync -avz --delete usernameremotehost:/path/to/files /path/to/local/dir这个命令的主要参数: -a:归…...
LinkedBlockingQueue原理
1. 基本的入队出队 public class LinkedBlockingQueue<E> extends AbstractQueue<E>implements BlockingQueue<E>, java.io.Serializable {static class Node<E> {E item;/*** 下列三种情况之一* - 真正的后继节点* - 自己, 发生在出队时* - null, 表…...
哈希表题目:网格照明
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:网格照明 出处:1001. 网格照明 难度 6 级 题目描述 要求 在 n n \texttt{n} \times \texttt{n} nn 的二维网格 grid \texttt{grid}…...
Python多线程爬虫为何效率低下?解析原因并提高爬虫速度的方法
目录 一、知识点二、多线程语法GIL单线程多线程单线程多线程 最后的惊喜 一、知识点 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程自己不拥有…...
Python 标准方形信号定义(完美实现)
之前我们介绍了如何定义一个标准的正弦信号,这里我们做一下延申,简单说明一下如何定义一个方形函数。 方形信号表达式 square signal = g ( t ) = sign [ sin  ( 2 π f t +...
[Daimayuan] 走不出的迷宫(C++,图论,DP)
有一个 H H H 行 W W W 列的迷宫(行号从上到下是 1 − H 1−H 1−H,列号从左到右是 1 − W 1−W 1−W),现在有一个由 . 和 # 组成的 H 行 W 列的矩阵表示这个迷宫的构造,. 代表可以通过的空地,# 代表不…...
【LeetCode: 1416. 恢复数组 | 暴力递归=>记忆化搜索=>动态规划 】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
centos7查看磁盘io
1.查看所使用到的命令为iostat,centos7没有自带iostat,需要安装一下 2.安装iostat命令 yum -y install sysstat 3.使用iostat命令 iostat %user:表示用户空间进程使用 CPU 时间的百分比 %nice:表示用户空间进程以降低优先级的…...
浅析低代码开发的典型应用构建场景v
在数字经济蓬勃发展的大势之下,企业软件开发人员供给不足、开发速度慢、开发成本高、数字化和智能化成效不明显等问题日益凸出,阻碍了企业的数字化转型。 而近年来,低代码的出现推动了经济社会的全面提效,也成为人才供求矛盾的润…...
3 连续模块(二)
3.5 零极点增益模块 在控制系统设计和分析中,常用的函数包括 传递函数(tf)、零极点(zpk)和状态空间(ss)函数 传递函数(tf):用于表示线性时不变系统的输入输出…...
ElasticSearch 部署及安装ik分词器
ansiable playbook链接: https://download.csdn.net/download/weixin_43798031/87719490 需要注意的点:公司es集群现以三个角色部署分别为 Gateway、Master、Data 简单的理解可以理解为在每台机器上部署了三个es,以端口和配置文件来区分这三…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
