Shell编程详解
文章目录
- 一、Linux系统结构
- 二、Shell介绍
- 1、Shell简介
- 2、Shell种类
- 3、Shell查询和切换
- 三、Shell基础语法
- 1、注释
- 2、本地变量
- 3、环境变量
- 3.1、查看环境变量
- 3.2、临时设置环境变量
- 3.3、永久设置环境变量
- 4、特殊变量
- 5、控制语句
- 5.1、shell中的中括号
- 5.2、if语句
- 5.3、for循环
- 5.4、while循环
- 5.5、until循环
- 5.6、break和continue语句
- 6、函数
- 6.1、函数的定义和调用
- 6.2、带参数的函数
- 6.3、将函数定义在 Shell 配置文件中
- 7、重启springboot项目脚本
- 四、Shell的执行方式
- 1、使用指定Shell解释器
- 2、使用chmod赋执行权限后运行
- 3、使用当前Shell解释器
- 4、将脚本放入系统PATH
一、Linux系统结构
Linux操作系统是一种开放源代码的类UNIX
操作系统,它的结构分为内核
、Shell
和应用程序
三个层次。
- 内核层
- 内核是Linux系统的核心部分,它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务
- Linux内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,这使得内核可以兼容各种不同的硬件设备和外围设备
- Shell层
- Shell是Linux系统的
命令行解释器
,它负责将用户输入的命令解释并执行
- Linux系统上有多种Shell,其中最常用的是
Bash Shell
- Bash Shell 提供了各种丰富的功能和处理能力,如通配符、重定向、管道、变量等等
- Shell是Linux系统的
- 应用层
- 应用层是Linux系统上的各种应用程序和服务,包括文本编辑器、图形界面、Web服务器、邮件服务器、数据库服务器等
- 在Linux系统中,应用程序通常以开放源代码方式呈现,用户可以自由学习和使用,也可以根据需求自己编写、修改或扩展
二、Shell介绍
1、Shell简介
- Shell被翻译为“壳”。在Linux内核外面包了一个壳
- Shell是一种用于与操作系统进行交互的
命令行解释器
- 它是一种
脚本语言
,可以通过编写一系列的命令和脚本来执行操作系统的功能和任务 - 我们在终端中编写的命令都是Shell命令。例如:ls、grep…等
2、Shell种类
Bourne Shell(/bin/sh)
:是Unix系统最早
的shell程序,由史蒂夫·伯恩斯(Steve Bourne)编写。该shell程序是许多Linux发行版中默认使用的程序Bourne-Again SHell(/bin/bash)
:是GNU项目的一部分,是Bourne Shell的增强版,目前在大部分Linux发行版中是默认
的shell程序C Shell (/bin/csh)
:是Bill Joy编写的一个具有面向对象设计理念的shell程序,它采用与C语言相似的语法和控制结构。C Shell中的命令提示符为%号TENEX C Shell(/bin/tcsh)
:是C Shell的增强版,它对历史命令和别名等方面进行了改进,同时也支持C Shell中的所有特性。TENEX C Shell中的命令提示符也为%号Korn Shell(/bin/ksh)
:是由David Korn编写的shell程序,它是Bourne Shell和C Shell的结合,拥有两种不同的工作模式:交互模式和批处理模式Z Shell(/bin/zsh)
:是一个功能强大
的shell程序,它是Bourne Shell的增强版,具有缩写、自动完成、句法高亮等功能,同时也支持Korn Shell、C Shell以及Bourne Shell的语法和命令
每种Shell都有其特定的语法和功能,但它们通常都具有共同的基本功能,如变量操作、条件语句、循环语句和命令执行等。
3、Shell查询和切换
-
查看已安装的Shell
cat /etc/shells
-
查看当前Shell(查看
$SHELL环境变量
)echo $SHELL
-
更改Shell(需要
重启服务
)chsh -s /bin/sh
三、Shell基础语法
- shell脚本可以编写在一个
xxx.sh
结尾的文件中,xxx.sh文件我们称为shell脚本文件
- shell脚本文件是一个
可执行文件
,类似于windows环境中的xxx.exe或xxx.bat等文件
1、注释
在Shell脚本中,注释是用来解释代码的内容,Shell脚本中的注释使用#
符号表示,任何在#
后面的内容都会被Shell解释器忽略。
-
单行注释(用
#
开头的内容作为注释)# 这是一个单行注释 echo "Hello, World!" # 这也是一个注释
echo
命令用于在终端上输出文本或变量的值,主要用于显示信息
或调试脚本
-
多行注释(可以通过连续的
#
来实现多行注释)# 这是一个多行注释 # 它可以扩展到 # 多行
也可以用以下形式:
: ' 这是一个多行注释 它使用 : 和单引号来包裹 解释器会忽略这些内容 '
示例
- 一个简单的脚本文件
#!/bin/bash
在 Shell 脚本的第一行,表示该脚本应该用哪个解释器运行可以省略
,如果省略会使用当前会话的默认shell解释器
#!/bin/bash # 打印 "Hello, World!" echo "Hello, World!"
- 查看文件权限(默认没有执行权限)
- 修文件权限(添加执行权限)
chmod +x script.sh # 或者 chmod 744 script.sh
- 执行文件
./script.sh
2、本地变量
本地变量
是指在某个脚本
或函数
的作用范围内定义的变量,只能在该作用范围内访问。本地变量的生命周期仅限于创建它的脚本或函数,执行完毕后,变量会自动销毁
本地变量命名规则
- 变量名由
字母
、数字
和下划线
组成(字母一般是小写
,环境变量用大写) - 不能以数字开头
- 区分大小写
- 等号两侧不能有空格
- 不能使用特殊字符作为变量名,如$、&、!、*等
示例
双引号
允许引用变量,变量会被解析单引号
不会解析变量,原样输出
#!/bin/bash
name="Alice"echo "Hello, $name" # 输出:Hello, Alice
echo 'Hello, $name' # 输出:Hello, $name
3、环境变量
- 环境变量是一个包含键值对的变量,键(变量名)和值共同保存
系统配置信息
或用户定义的信息
- 环境变量一般是
全部大写
,单词和单词之间采用下划线分割
。如:0JAVA_HOME, CATALINA_HOME - 环境变量是在
Shell会话外设置
的,可以由多个脚本和进程共享
常见的环境变量
变量名 | 说明 |
---|---|
PATH | 指定系统查找可执行文件的路径(如/usr/bin:/bin:/usr/local/bin ) |
HOME | 当前用户的主目录路径(如/root ) |
USER | 当前用户名(如root ) |
PWD | 当前工作目录路径(如/root/test ) |
SHELL | 当前用户使用的默认 Shell(如/bin/bash ) |
LANG | 系统语言和字符编码信息(如 en_US.UTF-8 ) |
TERM | 当前终端的类型(如xterm-256color ) |
LOGNAME | 当前登录的用户名(如root ) |
3.1、查看环境变量
-
查看当前所有环境变量
printenv # 或者 env
-
查看或使用某个环境变量(使用环境变量,在变量名称前必须加上
$
符号)echo $PATH
-
在脚本中直接访问环境变量
#!/bin/bash echo "当前用户是:$USER" echo "主目录是:$HOME"
3.2、临时设置环境变量
- 临时设置的环境变量只在
当前会话中有效
,会话结束后失效 - 使用
export
设置环境变量
基本语法
export 变量名=值
示例:
export MY_VAR="Hello World"
echo $MY_VAR
环境变量中多个值使用:
分隔符
export CLASSPATH=/lib:/usr/lib:/home/user/myapp/lib# 通过 PATH 的已有值加上新路径
export PATH=$PATH:/new/path
3.3、永久设置环境变量
- 要使环境变量在每次系统启动后都生效,需要将其添加到
配置文件
中
添加到
用户
配置文件
- 将环境变量添加到
~/.bashrc
或~/.bash_profile
中(针对 Bash Shell)export JAVA_HOME=/usr/local/java/jdk1.8.0_371 export PATH=$JAVA_HOME/bin:$PATH
- 重新加载配置文件
source ~/.bashrc
添加到系统
全局
配置文件
- 将环境变量添加到
/etc/profile
中(对所有用户生效)export JAVA_HOME=/usr/local/java/jdk1.8.0_371 export PATH=$JAVA_HOME/bin:$PATH
- 重新加载配置文件
source /etc/profile
4、特殊变量
- 特殊变量是在Shell中
预定义
的变量名称,具有特殊的含义
常见特殊变量
$0
: 当前脚本的文件名$1, $2...
: 脚本参数列表中的第1个、第2个参数等等- 如:./first.sh abc def,在执行这个脚本时,第一个参数abc,第二个参数def
$#
: 脚本参数的数量$*
: 所有脚本参数的列表- 将所有的参数作为一个字符串:“a b c”
$@
: 所有脚本参数的列表- 将每一个参数作为一个独立的字符串:“a” “b” “c”
$$
: 当前脚本的进程ID号$?
: 上一个命令的退出状态,一个数值- 0表示成功,其他值表示失败
$!
:后台运行的最后一个进程的进程ID
本地变量命名规则
- 创建脚本
script.sh
#!/bin/bash# 脚本名
echo "脚本名称: $0"# 参数个数
echo "参数总数: $#"# 打印所有参数
echo "所有参数 (\$@): $@"
echo "所有参数 (\$*): $*"# 第一个和第二个参数
echo "第一个参数: $1"
echo "第二个参数: $2"# 当前脚本的 PID
echo "当前脚本的 PID: $$"# 执行一个后台命令
sleep 5 &
echo "最后一个后台进程的 PID: $!"# 判断上一个命令是否执行成功
echo "上一个命令执行成功 (返回值: $?)"# 执行一个错误命令测试返回值
ls /nonexistent/path &>/dev/null
echo "错误命令返回非零值 (返回值: $?)"
- 以
./script.sh arg1 arg2 arg3
运行脚本,输出如下:
5、控制语句
5.1、shell中的中括号
- 用于比较操作符:用于比较两个值的大小或者判断两个值是否相等
-eq
: 等于,例如[ $a -eq $b ]-ne
: 不等于,例如[ $a -ne $b ]-lt
: 小于,例如[ $a -lt $b ]-gt
: 大于,例如[ $a -gt $b ]-le
: 小于等于,例如[ $a -le $b ]-ge
: 大于等于,例如[ $a -ge $b ]
- 用于测试表达式:用于测试某个表达式是否成立
-f
: 判断某个文件是否存在且是一个文件,例如[ -f file.txt ]-d
: 判断某个文件是否存在且是一个目录,例如[ -d dir ]-z
: 判断某个字符串是否为空,例如[ -z “$str” ]-n
: 判断某个字符串是否非空,例如[ -n “$str” ]-e
: 判断某个文件或目录是否存在,例如[ -e file.txt ]- 测试表达式可以用中括号[]或者
test
命令实现,例如:test -f file.txt等价于[ -f file.txt ]
- 要注意两个值之间必须有空格分隔,否则会出现语法错误
5.2、if语句
基本语法
if condition
thencommand1command2...
elif condition2
thencommand3command4...
elsecommand5command6...
fi
示例:
#!/bin/bashif [ -f file.txt ]
thenecho "file.txt文件存在"
elif [ -d dir ]
thenecho "dir目录存在"
elseecho "file.txt and dir都没找到"
fi
5.3、for循环
基本语法
for var in list
docommand1command2...
done
其中,var是一个临时的变量名,用于存储当前循环的值,list是一个值或者多个带有空格
或换行符分隔
的值组成的列表。
示例:
#!/bin/bashfor i in 1 2 3 4 5
doecho "The value of i is: $i"
done
5.4、while循环
基本语法
while condition
docommand1command2...
done
在shell编程中$((...))
被称为算术扩展运算符,做数学运算的,并且将运算结果返回。$(...)
运算符会将结果直接返回
示例:
#!/bin/bashj=0
while [ $j -lt 5 ]
doecho "The value of j is: $j"j=$((j+1))
done
5.5、until循环
until循环用于不断执行语句块,直到满足指定条件为止。和while循环相反,while是直到指定条件为假时才会停止循环。
基本语法
until condition
docommand1command2...
done
示例:
#!/bin/bashk=0
until [ $k -ge 5 ]
doecho "The value of k is: $k"k=$((k+1))
done
5.6、break和continue语句
break语句用于跳出当前循环块
,例如在for循环和while循环中使用该语句时,可以跳出当前循环并停止迭代。
continue语句用于跳过本次循环
迭代,直接进入下一次的迭代。
示例:
#!/bin/bashfor l in 1 2 3 4 5
doif [ $l -eq 3 ] thencontinuefiecho "The value of l is: $l"if [ $l -eq 4 ] thenbreakfi
done
输出结果(等于3跳过,等于4跳出循环结束)
1
2
6、函数
在Shell脚本中,函数是一种封装代码
的方式,可以提高代码的重用性和可读性。
6.1、函数的定义和调用
基本语法
function_name() {# 函数体:执行的命令或脚本
}
或者:
function function_name() {# 函数体:执行的命令或脚本
}
示例
say_hello() {echo "Hello, World!"
}# 调用函数
say_hello
6.2、带参数的函数
函数可以通过位置参数($1
, $2
, …)接收输入参数,类似于脚本中的参数。
示例
greet() {echo "Hello, $1! Welcome to $2."
}# 调用函数并传递参数
greet "Alice" "Linux"
说明:
$1
表示第一个参数,$2
表示第二个参数,以此类推- 参数之间用
空格分隔
6.3、将函数定义在 Shell 配置文件中
如果希望在 任何地方都可以调用函数,可以将函数定义放入Shell的配置文件中,例如~/.bashrc
或~/.zshrc
。
方法
- 编辑 ~/.bashrc(或 ~/.zshrc),添加函数定义
greet() {echo "Hello, $1!" }
- 保存文件后,运行以下命令重新加载配置
source ~/.bashrc
- 现在,你可以在任何命令行终端调用该函数
greet "Alice"
7、重启springboot项目脚本
# 1. 定义服务端口
port=1514# 2. 查找并杀掉正在运行的进程
pid=$(lsof -t -i:$port)
if [ -n "$pid" ]; thenecho "杀掉$port端口进程"kill -9 $pid
elseecho "没有端口为$port的进程"
fi# 3. 启动新进程
cd /data/java
nohup java -jar my-springboot.jar > /data/log/boot.log 2>&1 &echo "$port端口的服务已重启"
四、Shell的执行方式
在Linux系统中,运行Shell脚本(如 .sh
文件)有多种方式。以下是常见的几种执行方式及它们的区别。
1、使用指定Shell解释器
基本语法
sh script.sh
或者
bash script.sh
特点
- 使用指定的Shell解释器运行脚本(如
sh
或bash
) - 无需给脚本赋
执行权限
,只要有读权限
即可
2、使用chmod赋执行权限后运行
步骤
- 给脚本赋执行权限
chmod +x script.sh
- 直接运行脚本
或者./script.sh
完整路径
/path/to/script.sh
特点
- 根据脚本开头
#!/bin/bash
解释器运行,如果没有使用当前Shell默认解释器 - 必须给脚本文件赋予
执行权限
3、使用当前Shell解释器
语法
. script.sh
或者
source script.sh
特点
- 使用当前Shell默认的解释器
- 脚本在当前Shell环境中运行,不会启动新的子Shell
- 脚本中的变量和修改会直接影响当前Shell环境
- 无需给脚本赋
执行权限
,只要有读权限
即可
4、将脚本放入系统PATH
如果希望脚本在任何地方都可以运行,可以将脚本文件放入$PATH
中的目录(如/usr/local/bin
或~/bin
)
示例
- 将脚本移动到系统目录
mv script.sh /usr/local/bin
- 确保脚本可执行
chmod +x /usr/local/bin/script.sh
- 直接调用脚本
script.sh
相关文章:

Shell编程详解
文章目录 一、Linux系统结构二、Shell介绍1、Shell简介2、Shell种类3、Shell查询和切换 三、Shell基础语法1、注释2、本地变量3、环境变量3.1、查看环境变量3.2、临时设置环境变量3.3、永久设置环境变量 4、特殊变量5、控制语句5.1、shell中的中括号5.2、if语句5.3、for循环5.4…...
跨站脚本攻击(XSS)详解
跨站脚本攻击(XSS)详解 跨站脚本攻击(XSS,Cross-Site Scripting)是一种通过在网页中注入恶意脚本,攻击用户浏览器的漏洞。攻击者可以利用XSS窃取用户敏感信息、劫持会话、或在受害者浏览器中执行恶意操作。…...

03-QT中的QMainWindow+对话框QDialog
文章目录 1.QMainWindow1.1菜单栏1.2 工具栏1.3 状态栏1.4 铆接部件1.5 核心部件(中心部件)1.6 资源文件 2.对话框2.1 基本概念2.2 标准对话框2.3 自定义消息框2.4 消息对话框2.5 标准文件对话框 1.QMainWindow QMainWindow是一个为用户提供主窗口程序的…...
c# 中Parallel.ForEach 对其中一个变量进行赋值 引发报错
在 C# 中使用 Parallel.ForEach 方法时,如果你尝试在并行循环中对共享变量进行赋值,很可能会遇到线程安全问题或竞争条件(race conditions),这可能导致数据不一致、程序崩溃或其他不可预测的行为。 问题描述 假设你有…...

ElasticSearch备考 -- 整体脉络梳理
1、 search 、Update、reindex ElasticSearch 备考 -- 查询&高亮&排序 ElasticSearch 备考 -- 聚合查询 ElasticSearch 备考 -- 异步检索 2、search temple ElasticSearch备考 -- Search template 3、custom analyzer ElasticSearch 备考 -- 自定义分词 2、…...
vue Element Ui Upload 上传 点击一个按钮,选择多个文件后直接上传,使用防抖解决多次上传的问题。
问题: 在使用Element Ui Upload 上传文件时,选择多个文件上传时,on-change事件会一个一个返回上传的文件,导致前端不知道什么时候可以拿到全部上传的文件,再一起调后台接口。 解决方法: 上传文件后&…...

【HF设计模式】05-单例模式
声明:仅为个人学习总结,还请批判性查看,如有不同观点,欢迎交流。 摘要 《Head First设计模式》第5章笔记:结合示例应用和代码,介绍单例模式,包括遇到的问题、采用的解决方案、以及达到的效果。…...
运维人员的Python详细学习路线
以下是一条适合运维人员的Python详细学习路线: 一、基础入门阶段(第1 - 2个月) 环境搭建与基础语法(第1个月) 安装与配置 在运维常用的操作系统(如Linux或Windows)上安装Python。对于Linux系统…...
软件体系结构与设计模式
在软件开发中,软件体系结构和设计模式是两个至关重要的概念。它们帮助开发者设计出易于理解、可扩展、可维护的系统。尽管这两个概念密切相关,但它们分别关注系统的不同方面:软件体系结构关注的是系统整体结构的设计,而设计模式则…...

安徽省地图arcgis数据美化后mxd文件shp格式下载后内容测评
标题中的“安徽省地图arcgis数据美化后mxd文件shp格式”揭示了这个压缩包的内容是经过GIS处理的、针对安徽省地图数据。ArcGIS是一款由Esri公司开发的专业地理信息系统软件,用于处理、分析和展示地理空间数据。MXD文件是ArcGIS的项目文件,包含了地图布局…...
MySQL数据库备份与恢复策略
数据是企业和应用的核心资产,可靠的备份和恢复策略是确保数据安全性和业务连续性的关键。在本篇文章中,我们将详细介绍 MySQL 数据库的备份和恢复方法,包括逻辑备份、物理备份、自动化备份,以及常见问题的处理方法。 一、逻辑备份 逻辑备份是通过导出数据库的结构和数据生…...

go语言zero框架中教务crm系统的在职继承和离职交接的设计与实践
在GoZero中实现一个在职继承和离职交接的通用模块,涉及到顾问离职交接客户、领导离职交接审批单据等功能。为了使这个模块通用且易于扩展,我们可以分成几个部分: 1. **数据模型设计**:我们首先需要设计离职交接相关的数据模型。 …...
C# 设计模式(结构型模式):桥接模式
C# 设计模式(结构型模式):桥接模式 在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型…...
C# 设计模式(行为型模式):解释器模式
C# 设计模式(行为型模式):解释器模式 (Interpreter Pattern) 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的语法表示,并提供一个解释…...
如何 cURL Elasticsearch:进入 Shell
作者:来自 Elastic Philipp Krenn Kibana 的控制台是开始使用 Elasticsearch 的 REST API 的最简单方法 - 语法突出显示、自动完成、格式化、导出 cURL、JavaScript 或 Python。而且你不必担心正确的端点、身份验证等。但是有时,如果 Kibana 不可用、你…...

深信服云桌面系统的终端安全准入设置
深信服的云桌面系统在默认状态下没有终端的安全准入设置,这也意味着同样的虚拟机,使用云桌面终端或者桌面套件都可以登录,但这也给系统带来了一些安全隐患,所以,一般情况下需要设置终端的安全准入策略,防止…...
Node.js 模块系统
Node.js 模块系统 1. 引言 Node.js,作为一个轻量级、高效的服务器端 JavaScript 运行环境,其模块系统是其最核心的特性之一。Node.js 的模块系统允许开发者将代码组织成多个文件,每个文件都是一个模块,这样可以提高代码的可维护性和可重用性。本文将详细介绍 Node.js 的模…...
数据结构知识收集尊享版(迅速了解回顾相关知识)
1、单链表、循环链表、双向链表,存储、逻辑结构 单链表、循环链表和双向链表都是线性表的链式存储结构,它们在存储和逻辑结构上有一些共同点和不同点。 存储结构 单链表:每个节点包含一个数据域和一个指针域,指针域指向下一个节…...

SpringMVC启动与请求处理流程解析
目录 SpringMVC的基本结构 1.MVC简介 2.基本结构 什么是Handler? 什么是HandlerMapping? 什么是HandlerAdapter? RequestMapping方法参数解析 DispatcherServlet的init()方法 DispatcherServlet的doService()方法 SpringBoot整合SpringMVC …...

C++ 日志库 spdlog 使用教程
Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog 安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297 S…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...