tryhackme-Cyber Security 101-Linux Shells(linux命令框)
目的:了解脚本和不同类型的 Linux shell。
任务1:Introduction to Linux Shells(Linux Shell 简介)
作为操作系统的常规用户,我们都广泛使用图形用户界面 (GUI) 来执行大多数操作。只需点击几下不同的选项,您的任务就完成了。但是,您可以通过在操作系统的 CLI 中编写命令而不是使用 GUI 来执行几乎所有任务。shell 为您在 CLI 中编写的命令提供了一些很棒的功能。这种与 OS 交互的方式更高效且对资源更友好。
假设您在一家餐厅,您的食物有两种选择。第一种选择是从菜单中点餐,服务员会上菜。第二种选择是在厨房里自己做你想要的菜。就 Linux 系统而言,这里的厨房就是操作系统,使用 OS 的 GUI 就像从菜单点菜一样,服务员会为你端上来。但是,使用 CLI 意味着您必须去厨房 (OS) 并烹饪您想要的食物。在此示例中,Shell 将通过为您提供一些食谱建议来帮助您烹饪所需的菜肴。使用 CLI 在 Linux 系统中执行操作可在执行任务时为您提供更多功能和控制。
您可能在电影中看到过黑客场景,这些场景显示了执行许多命令的酷终端。这是因为大多数 Linux 用户更喜欢通过使用 shell 在 CLI 上编写命令来执行操作,而不是使用 GUI。这个房间将教我们如何与 Linux shell 交互。我们还将探索 Linux 中可用的不同 shell,并最后编写一些 shell 脚本。
学习目标
- 了解与 Linux shell 的交互
- 使用基本的 shell 命令
- 探索可用的 Linux shell 类型
- 编写一些 shell 脚本
会议室先决条件
- Linux的基础模块
任务2:How To Interact With a Shell?(如何与 shell 交互?)
我们为这个房间准备了一台机器。 首先,让我们通过按下下面给出的 Start Machine 按钮来启动虚拟机。本机将以分屏视图启动。
如果 VM 不可见,请使用页面顶部的蓝色 Show Split View 按钮。计算机将在 GUI 中打开。您还可以使用下面的 SSH 凭据通过 Attackbox 或您自己的 VPN 连接计算机连接计算机:

计算机在分屏视图中打开后,您将准备好 shell 提示符 接受命令。

大多数 Linux 发行版使用 Bash (Bourne Again Shell) 作为其 default shell 的 shell 中。但是,当您打开 终端依赖于您的 Linux 发行版。
注意:在接下来的任务中,我们将讨论 不同类型的shell。
您可能已经探索了本房间的先决条件中提到的 Linux 基础模块中的基本 Linux 命令。让我们 简要讨论我们在 shell 中使用的一些最重要的 Shell。
与 shell 交互时,您必须位于 想要执行操作。默认情况下,当您在大多数 Linux 发行版,您将位于主目录中。要查看当前工作目录,可以执行 ,它代表打印工作目录,如下面的终端所示:pwd

在上述命令的结果中,您可以看到您当前的 working directory 为/home/user
但是,您也可以更改目录。为此,您可以使用 (Change Directory 的缩写),如下面的终端所示:cd

使用操作系统的 GUI 时,您可以看到目录的内容 在屏幕上。但是,在使用 shell 时,要查看 目录中,您必须输入以下命令:

如果要读取文件的内容,可以键入 following 命令:cat
grep 命令是 Linux 用户中非常流行的命令。这个强大的命令可以搜索文件中的任何单词或模式。假设您想在一个大文件中搜索特定条目。您可以将 grep 命令与这些条目的模式一起使用,这将为您提取它们。它还可以帮助您在大文件中搜索特定关键字。
以下终端向我们展示了如何使用 grep 命令在大文本文件中搜索单词 “THM”。输出显示包含此单词的文本文件的特定行。


任务3:Types of Linux Shells(Linux Shell 的类型)
与 Windows 操作系统中的命令提示符和 PowerShell 一样,Linux 具有不同的 可用的 shell 类型,每种类型都有自己的功能和 特性。
多个 shell 安装在不同的 Linux 发行版中。自 查看您正在使用的 shell,键入以下命令:
echo $SHELL
这里必须大写shell
您还可以列出 Linux 操作系统中的可用 shell。该文件包含 Linux 系统上所有已安装的 shell。您可以通过在终端中键入来列出 Linux 操作系统中的可用 shell:
/etc/shells
cat /etc/shells
要在这些 shell 之间切换,您可以键入 shell 名称,即 出现在您的操作系统上,它将为您打开,如下所示:
如果要永久更改默认 shell,可以使用命令:。这将使此 shell 成为终端的默认 shell。
chsh -s /usr/bin/zsh
Linux shell 有多种类型。我们将讨论其中的一些 及其功能。
Bourne Again Shell
Bourne Again Shell (Bash) 是大多数 Linux 发行版的默认 shell。当您打开终端时,bash 会让您 enter 命令。在 bash 之前,一些 shell (如 sh、ksh 和 csh)具有 不同的功能。Bash 是这些的增强替代品 shell 的 shell 中,从所有这些 shell 中借用了 shell 的功能。这意味着它具有 这些旧shell的许多特征及其一些独特的 能力。列出了 bash 提供的一些关键功能 下面:
- Bash 是一种广泛使用的 shell,具有脚本功能。
- 它提供了一个 Tab 键补全功能,这意味着如果你在 在完成命令的过程中,您可以按键盘上的 Tab 键。它会 根据可能的匹配项自动完成命令或为您提供 完成它的多个建议。
- Bash 会保留一个历史文件并记录您的所有命令。您可以使用 向上和向下箭头键使用前面的命令而无需键入 他们又来了。您还可以键入以显示您之前的所有 命令。history
友好的交互式 Shell
Friendly Interactive Shell (Fish) 在大多数 Linux 发行版中也不是默认的。顾名思义,它更侧重于 比其他 shell 用户友好。提供的一些关键功能 按鱼分类如下:
- 它提供了一种非常简单的语法,对于初学者来说是可行的 用户。
- 与 bash 不同,它对您编写的命令具有自动拼写更正功能。
- 您可以使用一些很酷的主题来自定义命令提示符 鱼。
- fish 的语法高亮功能会给 fish 的不同部分着色 命令,这可以提高 命令。它还可以帮助我们发现具有独特颜色的错误。
- Fish 还提供脚本、Tab 键补全和命令历史记录 功能,类似于此任务中提到的 shell。
Z Shell
默认情况下,大多数 Linux 发行版中不安装 Z Shell (Zsh)。它被认为是一种现代 shell,它结合了 一些以前 shell 的功能。一些主要功能 由 ZSH 提供,下面列出了:
- Zsh 提供高级 Tab 键自动补全功能,并且还能够编写 脚本。
- 就像 fish 一样,它还为命令提供自动拼写更正。
- 它提供广泛的定制,这可能会使其比其他定制慢 壳。
- 它还提供 Tab 键补全、命令历史记录功能和 其他几个功能。
不过我个人感觉,就bash用到多一点,其他使用情况并不多。
特征 | bash | fish | ZSH |
---|---|---|---|
全名 | Bash 的完整形式是 Bourne Again Shell。 | Fish 的完整形式是 Friendly Interactive Shell。 | Zsh 的完整形式是 Z Shell。 |
脚本 | 它提供广泛兼容的脚本和广泛的文档 可用。 | 与其他两个相比,它的脚本功能有限 壳。 | 它提供了出色的脚本水平,结合了传统的 具有一些额外功能的 Bash shell 的功能。 |
Tab 键补全 | 它具有基本的 Tab 键补全功能。 | 它通过根据以下因素提供建议来提供高级 Tab 键自动补全 您之前的命令。 | 它的 Tab 键补全功能可以通过使用 插件。 |
定制 | 基本级别的自定义。 | 它通过交互式工具提供了一些很好的定制。 | 通过 oh-my-zsh 框架进行高级定制。 |
用户友好性 | 它不太用户友好,但是一种传统且广泛使用的 shell 的 shell 中,它的用户非常熟悉和熟悉它。 | 它是最用户友好的 shell。 | 通过适当的定制,它可以是高度用户友好的。 |
语法高亮显示 | 语法高亮功能在此 shell 中不可用。 | 语法高亮是此 shell 中内置的。 | 语法高亮可以通过引入 一些插件。 |
选择最佳 Linux shell 取决于您的使用情况及其 特征。此任务中讨论的 shell 是众多 shell 中的一部分 Linux 中可用的不同 shell。您可以比较 这些不同的 shell 并根据您的任务选择最好的一个。
任务4:Shell Scripting and Components(Shell 脚本和组件)
shell 脚本只不过是一组命令。假设一个重复的 任务要求您使用 shell 输入多个命令。而不是 在每一次重复该任务时一个接一个地输入它们,这可能会 花更多的时间,你可以把它们组合成一个脚本。执行 所有这些命令,您将只执行脚本,而所有 命令。前面提到的所有 shell 任务具有脚本功能。脚本帮助我们自动执行任务。 在学习如何编写脚本之前,我们需要知道,即使 Linux shell 具有脚本功能,但这并不意味着您 只能使用 shell 制作脚本。脚本可以用各种方式完成 编程语言。然而,这个房间的范围是 Cover 使用 shell 编写脚本。
第一步是打开终端并选择一个 shell。我们走吧 使用 bash shell,这是大多数 shell 中默认且广泛使用的 shell 分布。
与我们在 shell 中键入的其他命令不同,我们首先需要 使用脚本的任何文本编辑器创建文件。该文件必须是 以 extension 命名,这是 bash 脚本的默认扩展。 以下终端显示脚本文件的创建:.sh
每个脚本都应该从 shebang 开始。Shebang 是 在脚本开头添加的一些字符,从 with 后跟执行时要使用的解释器的名称 剧本。当我们在 bash 中编写脚本时,让我们将其定义为 Shebang 的翻译。#!
我们现在都准备好编写我们的第一个脚本了。有一些 脚本的基本构建块共同构成了高效的 脚本。让我们学习并利用这些脚本结构来编写一个 编写脚本。
要执行脚本,我们首先需要确保脚本具有 执行权限。要向脚本授予这些权限,我们可以 在我们的终端中键入以下命令:
现在脚本具有执行权限,之前使用 用于执行它的脚本名称。我们使用 before the script 来运行,而不是直接键入脚本名称,因为 shell 会告诉 shell 执行当前目录中存在的文件。如果未在脚本名称之前定义,则 shell 将在 PATH 环境变量(包含除当前目录之外的所有目录)中搜索脚本,并且不会在任何这些目录中找到定义的脚本并生成错误。下面的终端显示了 我们利用了变量:
./
循环
Loop,顾名思义,是重复的东西。为 例如,您有一个包含许多朋友的列表,并且您希望向他们发送 相同的消息。您可以制作一个循环,而不是单独发送它们 在你的脚本中,将你的好友列表提供给 Loop 和 Message 中,然后 它会将该消息发送给您所有的朋友。
对于循环的一般解释,让我们编写一个循环,它将 在屏幕上显示从 1 到 10 开始的所有数字:
# Defining the Interpreter
#!/bin/bash
for i in {1..10};
do
echo $i
done
第一行包含将从 1 迭代到 10 的变量,并且 每次都执行以下代码。 指示循环的开始 code 并指示结束。在它们之间,我们想要的代码 execute 的 intent 来写入。for 循环将采用每个数字 ,并将其分配给每次迭代中的变量。将在每次迭代时显示此变量的值。i
do
done
i
echo $i
现在,让我们在执行脚本后执行脚本 许可。
上述终端的输出被剪切成数字,仅用于演示。但是,当根据脚本的逻辑执行时,它将显示 中的数字。
3
1 to 10
条件语句
条件语句是脚本编写的重要组成部分。他们提供帮助 仅当满足条件时,您才执行特定代码; 否则,您可以执行另一个代码。假设您想创建一个 向用户显示密钥的脚本。但是,您希望它被显示给 仅部分用户,仅对高权限用户。您将创建一个 conditional 语句,该语句将首先询问用户的姓名,如果 该名称与 High Authority 用户的名称匹配,则会显示 秘密。
# Defining the Interpreter
#!/bin/bash
echo "Please enter your name first:"
read name
if [ "$name" = "Stewart" ]; thenecho "Welcome Stewart! Here is the secret: THM_Script"
elseecho "Sorry! You are not authorized to access the secret."
fi
上面的脚本将用户名作为输入,并将其存储到 变量(在 Variables 部分中研究)。条件语句 以 if 开头,并将该变量的值与字符串进行比较 斯图尔特;如果匹配,它将向用户显示密钥,或者 否则它不会。fi 用于结束 for 循环。
以下是显示用户 name 与脚本中定义的 authorized 匹配:
但是,以下终端显示了当 用户名与脚本中定义的 authorized 用户名不匹配:
评论
有时,代码可能非常冗长。在此方案中,代码 当您一段时间后查看它或与之分享时,可能会让您感到困惑 有人。解决此问题的一种简单方法是在 代码的不同部分。评论是我们写的一句话 我们的代码只是为了我们的理解。它用 # sign 后跟一个空格和您需要编写的句子。为 #示例,让我们重写我们在条件 statements 部分并为其添加注释。
# Defining the Interpreter
#!/bin/bash# Asking the user to enter a value.
echo "Please enter your name first:"# Storing the user input value in a variable.
read name# Checking if the name the user entered is equal to our required name.
if [ "$name" = "Stewart" ]; then# If it equals the required name, the following line will be displayed.
echo "Welcome Stewart! Here is the secret: THM_Script"# Defining the sentence to be displayed if the condition fails.
elseecho "Sorry! You are not authorized to access the secret."
fi
了解带有注释的脚本看起来有多容易。注释不会影响 任何脚本的 working 工作。一个好的脚本总是有一些注释。这 上面显示的示例包含每行的注释。这只是一个 更好地解释了它的概念。但是,最好的方式是包括 comments 是在 脚本。
注意:其他类型的变量、循环和 条件语句也可用于完成不同的任务。 此外,还可以在单个 评论。然而,这不是这个房间的范围。
并没有什么特别东西
任务5:The Locker Script(储物柜脚本)
在上一个任务中,我们研究了变量、循环和条件 语句。让我们使用这些知识创建一个 shell 脚本。
要求
用户在银行中有一个储物柜。为了保护储物柜,我们必须拥有 一个在打开用户之前验证用户的脚本。什么时候 执行时,脚本应询问用户的姓名、公司名称、 和 PIN 码。如果用户输入以下详细信息,则应为 允许他们进入,否则应拒绝他们访问。
- 用户名:John
- 公司名称:Tryhackme
- 密码:7385
脚本
# Defining the Interpreter
#!/bin/bash # Defining the variables
username=""
companyname=""
pin=""# Defining the loop
for i in {1..3}; do
# Defining the conditional statementsif [ "$i" -eq 1 ]; thenecho "Enter your Username:"read usernameelif [ "$i" -eq 2 ]; thenecho "Enter your Company name:"read companynameelseecho "Enter your PIN:"read pinfi
done# Checking if the user entered the correct details
if [ "$username" = "John" ] && [ "$companyname" = "Tryhackme" ] && [ "$pin" = "7385" ]; thenecho "Authentication Successful. You can now access your locker, John."
elseecho "Authentication Denied!!"
fi
脚本执行
任务6:Practical Exercise(实践练习)
我们在附加的 Ubuntu 的默认用户目录中放置了一个脚本 机器。此脚本在所有文件中搜索特定关键字 (带有.log扩展名)在特定目录中。/home/user
注意:脚本内需要进行一些更改 文件。当您按照任务 #2 中的说明打开计算机时,您将能够以普通用户的身份获得会话。但是,我们建议您成为 root 用户,以便在给定目录的所有文件中搜索该标志。 要成为其中一员,您只需键入以下命令并输入用户的密码:
- 标志: thm-flag01-script
- 目录:/var/log
grep “cat” /var/log/authentication.log
相关文章:

tryhackme-Cyber Security 101-Linux Shells(linux命令框)
目的:了解脚本和不同类型的 Linux shell。 任务1:Introduction to Linux Shells(Linux Shell 简介) 作为操作系统的常规用户,我们都广泛使用图形用户界面 (GUI) 来执行大多数操作。只需点击几…...
亚远景-ISO 21434标准涵盖了哪些方面?
ISO 21434标准《道路车辆—网络安全工程》全面涵盖了汽车网络安全领域,其目的是确保汽车电子系统在整个产品生命周期中的网络安全性能。具体来说,该标准包括以下几个方面: 1. 术语和定义 :提供汽车网络安全相关的术语、概念和定义…...

第3章 集合与关系
2024年12月24日一稿 2024年12月26日二稿 🐰3.1 集合的概念和表示法 🦘3.1.1 集合的表示 🦘3.1.2 基本概念 🐰3.2 集合的运算 🦘3.2.1 集合的基本运算 🦘3.2.2 有穷计数集 🦘3.2.3 广义交和广义…...

【vmware】|设置共享文件夹
目的: 虚拟机中设置共享文件夹,本地物理机中可以搜到该共享文件夹 1、虚拟机: 设置共享文件夹 右键属性-共享页码进行下列设置 点击网络和共享中心,检查下列选项 二、在本地物理机中启用网络发现: 此时,刷新网络…...

Log4j1.27配置日志输出级别不起效
起因:构建独立版本debezuim使用时,日志一直打印debug信息。 原因:包冲突问题,进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…...

计算机图形学知识点汇总
一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中,“形”指形体或形状,存在于客观世界和虚拟世界,它的本质是“表示”;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面,用于表达…...

详解下c语言中struct和union的对齐规则
接触过c语言的同学应该都知道字节对齐。有些时候我们很容易弄错字节对齐的方式,特别是涉及到struct(结构体)和union(联合体)时。今天我们通过详细例子来说明下struct和union的对齐规则,以便了解各种struct和…...
ubuntu安装sublime安装与免费使用
1. ubuntu安装sublime 参考官网: Linux Package Manager Repositories 2. 破解过程 打开如下网址,打开/opt/sublime_text/sublime_text https://hexed.it/ 3. 替换在hexed打开的文件中查找并替换: 4180激活方法 使用二进制编辑器 8079 0500 0f94 c2替换为 c641 05…...

攻防世界 cookie
开启场景 Cookie(HTTP cookie)是一种存储在用户计算机上的小型文本文件。它由网站通过用户的浏览器在用户访问网站时创建,并存储一些用于跟踪和识别用户的信息。Cookie 主要用于在网站和浏览器之间传递数据,以便网站可以根据用户的…...

深度学习笔记1:神经网络与模型训练过程
参考博客:PyTorch深度学习实战(1)——神经网络与模型训练过程详解_pytorch 实战-CSDN博客 人工神经网络 ANN:张量及数学运算的集合,排列方式近似于松散的人脑神经元排列 组成 1)输入层 2)隐…...

什么是 DevOps 自动化?
DevOps 自动化是一种现代软件开发方法,它使用工具和流程来自动化任务并简化工作流程。它将开发人员、IT 运营和安全团队聚集在一起,帮助他们有效协作并交付可靠的软件。借助 DevOps 自动化,组织能够处理重复性任务、优化流程并更快地将应用程…...
使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler
操作数据库是非常常见的需求,使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类,并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类,用于简化…...

DB-GPT V0.6.3 版本更新:支持 SiliconCloud 模型、新增知识处理工作流等
DB-GPT V0.6.3版本现已上线,快速预览新特性: 新特性 1. 支持 SiliconCloud 模型,让用户体验多模型的管理能力 如何使用: 修改环境变量文件.env,配置SiliconCloud模型 # 使用 SiliconCloud 的代理模型 LLM_MODELsiliconflow_p…...

亚式期权定价模型Turnbull-Wakeman进行delta对冲
Turnbull-Wakeman Model是一种用于定价和对冲亚式期权的数学模型。该模型由David Turnbull和Keith Wakeman在1990年提出,用于解决亚式期权的定价问题。 亚式期权是一种路径依赖类型的期权,其期权价格与标的资产价格某个期间内的平均值有关,假…...

Java的list中状态属性相同返回true的实现方案
文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断,状态值相等时,总体返回为true。 方案一、for循环实现 实现思路 遍历list,当出现不一致时,直接跳出循环…...

在 React 项目中安装和配置 Three.js
React 与 Three.js 的结合 :通过 React 管理组件化结构和应用逻辑,利用 Three.js 实现 3D 图形的渲染与交互。使用这种方法,我们可以在保持代码清晰和结构化的同时,实现令人惊叹的 3D 效果。 在本文中,我们将以一个简…...
服务器压力测试怎么做
在部署任何Web应用程序或服务之前,进行服务器压力测试(也称为负载测试)是确保系统能够处理预期用户流量的关键步骤。通过模拟大量并发请求,可以评估服务器的性能、稳定性和响应时间,识别潜在瓶颈,并优化资源…...

TCN-Transformer+LSTM多变量回归预测(Matlab)添加气泡图、散点密度图
TCN-TransformerLSTM多变量回归预测(Matlab)添加气泡图、散点密度图 目录 TCN-TransformerLSTM多变量回归预测(Matlab)添加气泡图、散点密度图预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基本介绍 1.双路创新ÿ…...
Mac 查询IP配置,网络代理
常用命令 1.查询IP ifconfig | grep "inet" 2.ping查询 ping 172.18.54.19(自己IP) 3.取消代理,通过在终端执行以下命令,可以取消 Git 的代理设置 git config --global --unset http.proxy git config --global …...

Vue2五、商品分类:My-Tag表头组件,My-Table整个组件
准备: 安包 npm less less-loader。拆分:一共分成两个组件部分: 1:My-Tag 标签一个组件。2:My-Table 整体一个组件(表头不固定,内容不固定(插槽)) 一&…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...

二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...