一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
文章目录
- 1. 初识 Shell 解释器
- 1.1 Shell 类型
- 1.2 Shell 的父子关系
- 2. 编写第一个 Shell 脚本
- 3. Shell 脚本语法
- 3.1 脚本格式
- 3.2 注释
- 3.2.1 单行注释
- 3.2.2 多行注释
- 3.3 Shell 变量
- 3.3.1 系统预定义变量(环境变量)
- printenv 查看所有环境变量
- set 查看所有 Shell 变量
- 3.3.2 声明变量
- 字符串变量
- 数组变量
- 关联数组(Map)变量
- 3.3.3 引用变量
- 3.3.4 变量的作用域
- 全局变量
- 局部变量
- 只读变量
- 3.3.5 撤销变量
1. 初识 Shell 解释器
在 Linux 系统中,Shell 是用户与操作系统之间的接口,它充当了命令行界面(CLI,Command Line Interface)和操作系统内核之间的桥梁。用户通过 Shell 输入命令,Shell 则将这些命令解析并执行。Shell 解释器不仅支持用户通过 CLI 输入单个命令,还可以将多个命令放入文件中作为程序执行,这就是 Shell 脚本的基础。
1.1 Shell 类型
Linux 的发行版众多,大多数都会包含多个 Shell,但通常会采用其中一个作为默认 Shell。常见的 Shell 解释器包括:
Shell 名称 | 描述 |
---|---|
Sh | Bourne Shell,早期 Unix 系统中的标准 Shell |
Bash | Bourne Again Shell,最流行的 Shell,许多 Linux 发行版的默认 Shell |
Zsh | Z-Shell,功能强大,提供用户友好的特性,Bash 的扩展版本 |
Csh | C-Shell,语法类似C语言,适合程序员使用 |
Ksh | Korn Shell,结合了 Bourne Shell 和 C Shell 的特点。 |
Fish | Friendly Interactive Shell,专为用户友好性设计 |
Dash | Debian Almquist Shell,轻量级的 Shell,启动速度快,资源占用低,常用于 Debian 系统中的系统脚本和启动脚本 |
以 CentOS7.8 为例,我们要查看系统支持的所有 Shell 类型时,可以通过以下命令查看 /etc/shells
文件:
cat /etc/shells
该文件包含了系统上安装的所有可用 Shell 以及对应的路径:
如果要查看当前用户默认使用的 Shell,可以通过环境变量 $SHELL
来查看:
echo $SHELL
也可以通过查看 /etc/passwd
文件,/etc/passwd
文件中包含了系统中每个用户的信息,在用户ID记录的第7个字段中列出了默认的 Shell 程序。使用 grep
命令查找当前用户的条目:
grep "^$(whoami):" /etc/passwd
该命令会输出类似于以下格式的信息:
其中最后一个字段(/bin/bash
)就是当前用户的默认 Shell。
1.2 Shell 的父子关系
Shell 不仅是一种命令行界面(CLI),它还是一个持续运行的复杂交互式程序。当用户登录到系统或打开一个终端窗口时,默认的 Shell(如 Bash
、Zsh
等)会被启动,系统会自动运行默认的 Shell 程序,这个 Shell 作为 父Shell 持续运行并等待用户的命令输入。
当用户在 父Shell 中输入 /bin/bash
或其他等效的命令时,系统会创建一个新的Shell实例,这个新的 Shell 称为 子Shell。
子Shell的特性如下:
- 独立性:子Shell相对于父Shell是独立的,它可以有自己的环境变量、目录、作业控制等。
- 层次结构:可以创建多个子Shell,每个子Shell又可以创建自己的子Shell,从而形成一个层次结构。父子关系可以用树状结构表示。
- 退出行为:当子Shell退出时,它会将控制权返回给父Shell,父Shell可以继续执行后续的命令。如果子Shell 在后台运行,则父Shell 也可以继续运行其他命令而不受影响。
父Shell与子Shell的流程演示:
-
当我们登录到系统时,Linux 会启动一个默认的 Shell 程序(例如 Bash),这个 Shell 就是 父Shell。通过
ps -f
命令可以查看到它的进程ID是16229(PID),运行的是 bash shell 程序(CMD)。 -
在 父Shell 中输入
/bin/bash
命令后,系统会创建一个新的Shell实例,这个新的 Shell 称为 子Shell 。尽管窗口没有变化,但实际上我们已经进入了一个新的 Shell 环境,再次使用ps -f
命令,可以查看到 子Shell 的进程信息(第二行):进程 ID 是16299(PID),运行的是 bash shell 程序(CMD)。 -
使用
echo $PPID
命令,可以看到 子Shell 的父进程ID(PPID)与 父Shell 的 PID 相同,这确认了 子Shell 是由 父Shell 创建的。 -
如果我们想返回到 父Shell ,只需在 子Shell 中输入
exit
命令, 子Shell 就会终止。此时, 父Shell 继续运行,等待我们的输入。 -
如果在 父Shell 中输入
exit
命令,父Shell 将会终止,整个终端会话结束,用户将被登出控制台终端。
2. 编写第一个 Shell 脚本
Tips:Shell 可以将多个命令串起来,一次执行完成。如果要多个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开。
对 Shell 解释器有了基本的认识后,我们就可以编写第一个 Shell 脚本了。
创建 Shell 脚本最基本的方式是使用分号(;
)将多个命令串在一起,Shell 会按顺序逐个执行命令,例如:
命令1; 命令2; 命令3
这样,Shell 会先执行命令1,完成后再执行命令2,最后执行命令3。此外,如果我们希望在前一个命令成功执行后再执行下一个命令,可以使用 &&
连接:
命令1 && 命令2 && 命令3
这样,只有当命令1成功执行(返回状态为0)时,命令2才会执行。这种办法只要不超过最大命令行字符数(255)限制,就能将任意多个命令串连在一起使用。
此外,我们可以将多个命令写入到文本文件中,每次执行时,直接执行文件即可,不需要每次手动输入这些命令。例如:
-
使用
vi
或其他文本编辑器创建脚本文件:vi hello_world.sh
-
编辑脚本,在文件中输入以下内容,按
Esc
键,输入:wq
然后按Enter
保存并退出。#!/bin/bash echo 'HelloWOlrd'
-
通过以下命令运行脚本:
sh hello_world.sh
-
运行后,应该会看到以下输出:
3. Shell 脚本语法
3.1 脚本格式
每个 Shell 脚本文件的第一行以 #!
开头,后跟解释器的路径,例如 /bin/bash
、/bin/sh
,这告诉系统用哪个 Shell 解释器来执行脚本,格式为:
#!/bin/bash
3.2 注释
3.2.1 单行注释
Shell 脚本中单行注释以 #
开头,表示注释一行,直到行尾。示例:
# 这是一个注释
echo "Hello, World!" # 输出文本
3.2.2 多行注释
Shell 脚本没有专门的多行注释语法,要实现多行注释,可以使用 #
注释每一行:
# 这是一段多行注释
# 可以写很多内容
# 每一行前都要加 #
还可以通过 Here Document(here doc)
方式实现多行注释的效果,格式如下:
command <<DELIMITER
多行文本
...
DELIMITER
command
是你想要执行的命令。DELIMITER
是一个自定义的标识符,可以是任意字符串,用于标记文本块的开始和结束。
由于冒号 :
是一个空命令,可以优化为 : + 空格 + 单引号
的格式实现多行注释:
: '
这是注释的部分。
可以有多行内容。
'
3.3 Shell 变量
Shell 脚本中的变量包括系统预定义变量(环境变量)和用户自定义变量;按照类型又分为局部变量、全局变量和只读变量。
3.3.1 系统预定义变量(环境变量)
系统预定义变量是由 Linux 操作系统提供的变量,包含了系统的配置信息和环境设置。这些变量可以直接在 Shell 脚本和命令行中使用。常见的环境变量如下:
环境变量 | 说明 |
---|---|
XDG_SESSION_ID | 当前用户会话的唯一标识符,可用于跟踪用户会话 |
HOSTNAME | 当前系统的主机名,用于在网络中识别计算机,可以通过修改 /etc/hostname 文件来更改它 |
TERM | 当前终端类型,例如 xterm-256color ,影响终端的功能和外观 |
SHELL | 显示用户的默认 Shell 程序的路径,例如 /bin/bash |
HISTSIZE | 控制命令历史记录的大小,通常为1000 |
USER | 当前登录用户的用户名,例如 root |
PATH | 定义 Shell 查找可执行程序的路径。当用户输入命令时,系统会在这些路径中查找相应的可执行文件 |
PWD | 显示当前工作目录的绝对路径 |
LANG | 系统的语言设置,影响程序的输出和本地化设置,例如 zh_CN.UTF-8 |
SHLVL | 用于指示当前的 Shell 嵌套级别。每当启动一个新的 Shell 实例,该值就会增加 |
HOME | 当前用户的主目录,例如 /root 。 |
SSH_CONNECTION | 当通过SSH连接到远程服务器时,提供有关连接的信息,包括客户端和服务器的IP地址及端口 |
LESSOPEN | 用于设置 less 命令的预处理器,允许在查看文件时进行处理,例如文本高亮 |
SSH_CLIENT | 类似于 SSH_CONNECTION ,SSH客户端的IP地址、源端口和服务端口 |
printenv 查看所有环境变量
在 Linux 操作系统中可以使用 printenv
命令以键值对的形式输出当前所有的环境变量。
-
基本用法:
printenv
运行这个命令会列出所有当前的环境变量及其值,以键值对的形式显示。例如:
USER=john HOME=/home/john SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-
查看特定变量:
printenv VARIABLE_NAME
可以通过指定变量名来查看某个特定环境变量的值。例如:
printenv PATH
这将只输出
PATH
环境变量的值:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set 查看所有 Shell 变量
set
命令是 Linux 的一个 Shell 内建命令,用于设置、显示或取消 Shell 的环境变量和 Shell 选项。 Shell 变量是指在 Shell 环境中定义的任何变量。它们可以是系统预定义变量(如 $PATH
)或者用户自定义变量。
-
显示所有变量:
set
运行此命令会列出当前 Shell 环境中的所有变量(包括环境变量和用户自定义变量)及其值。输出通常包含各个变量的名称和对应的值。例如:
BASH=/bin/bash BASH_VERSION='5.0.17(1)-release' USER=john ...
-
设置变量:
set VARIABLE_NAME=value
直接使用
set
可以为变量赋值,但这种方式只在当前 Shell 会话中有效。示例:set myvar=Hello echo $myvar # 输出 Hello
3.3.2 声明变量
用户可以在 Shell 脚本中自定义变量存储数据、结果或其他信息,并在脚本上下文中引用。
Shell 脚本声明变量需要遵循以下规则:
-
格式:变量名和等号之间不能有空格。例如,
VAR=value
是正确的,而VAR = value
是错误的。 -
命名规则:
- 只包含字母、数字和下划线:变量名可以包含字母(大小写敏感)、数字和下划线(_),但不能包含其他特殊字符。
- 不能以数字开头:变量名不能以数字开头,但可以包含数字。例如,
VAR1
是有效的,而1VAR
是无效的。 - 避免使用 Shell 关键字:不应使用 Shell 的关键字(如
if
、then
、else
、fi
、for
、while
等)作为变量名,以免引起混淆。 - 使用大写字母表示常量:常量的变量名通常使用大写字母,例如
PI=3.14
。 - 避免使用特殊符号:尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
- 避免使用空格:变量名中不应包含空格,因为空格通常用于分隔命令和参数。
字符串变量
在 Shell 中,变量默认被视为字符串类型,支持使用单引号 '
和双引号 "
来定义字符串:
-
使用单引号
'
定义:单引号中的所有字符都被视为字面值,完全不进行变量替换或转义my_string='Hello, $USER!' echo "$my_string" # 输出: Hello, $USER!
在这个例子中,
$USER
被视为普通文本,不会被替换为实际的用户名。 -
使用双引号
"
定义:双引号中的变量会被替换为对应的变量值,某些转义字符(如\n
、\t
等)也会被解析my_string="Hello, $USER!" echo "$my_string" # 输出: Hello, Alice!
对字符串变量常用的操作如下:
-
双引号
"
实现多个字符串拼接:greeting="Hello" name="Alice" full_greeting="$greeting, $name!" echo "$full_greeting" # 输出: Hello, Alice!
-
使用
${#var}
来获取字符串的长度:length=${#my_string} echo "字符串长度: $length" # 输出: 字符串长度: 13
-
使用
${var:start:length}
截取字符串:substring=${my_string:7:5} # 从索引 7 开始,长度为 5 echo "$substring" # 输出: World
如果需要从指定位置截取到末尾,可以使用
${var:start}
语法,而不需要指定长度:my_string="Hello, World!" substring=${my_string:7} # 从索引 7 开始截取到末尾 echo "$substring" # 输出: World!
-
使用
${var/old/new}
来替换字符串中的部分内容:my_string="Hello, World!" new_string=${my_string/World/Bash} echo "$new_string" # 输出: Hello, Bash!
Tips:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
在单引号字符串中,不能直接包含单独的单引号。如果需要在字符串中使用单引号,可以成对出现,或通过拼接来实现。比如:
echo 'It'\''s a test' # 输出: It's a test
'
:先结束当前的单引号字符串。\'
:转义单引号,插入一个字面值的单引号。'
:再开始一个新的单引号字符串。
数组变量
Shell 只支持一维数组(不支持多维数组),初始化时不需要指定数组大小,元素的下标由 0 开始,其声明的方式如下:
-
使用括号
()
定义数组:my_array=(element1 element2 element3)
-
使用
declare -a
定义数组:declare -a my_array my_array=(element1 element2 element3)
数组支持的常用操作如下:
-
通过
${array[index]}
来访问指定下标的数组元素:echo "${my_array[0]}" # 输出: element1
-
使用
${#array[@]}
获取数组的长度:length=${#my_array[@]} echo "数组长度: $length" # 输出: 数组长度: 3
-
使用
@
或*
可以获取数组中的所有元素:echo "${my_array[@]}" # 输出: element1 element2 element3
-
使用
for
循环遍历数组的所有元素:for item in "${my_array[@]}"; doecho "$item" done
-
通过索引直接修改数组的某个元素:
my_array[1]="new_value" # 修改第二个元素 echo "${my_array[1]}" # 输出: new_value
-
使用
+=
添加新元素:my_array+=("element4") # 添加新元素 echo "${my_array[@]}" # 输出: element1 element2 element3 element4
Tips:
- 在定义数组时,数组元素之间需要以空格进行分隔
- 访问或打印数组时,元素之间会自动以空格拆分
关联数组(Map)变量
关联数组(也称为字典或哈希表)允许使用非整数索引来存储键值对。使用 declare -A
命令来定义:
declare -A fruits
fruits=(["apple"]="red" ["banana"]="yellow" ["cherry"]="red")
也可以在声明时初始化:
declare -A fruits=(["apple"]="red" ["banana"]="yellow" ["cherry"]="red")
常用操作如下:
-
通过
${map[key]}
来访问关联数组中指定 Key 对应的 Value:echo "${fruits[apple]}" # 输出: red
-
${!map[@]}
在数组前添加感叹号 ! 可以获取数组的所有键:echo "所有水果: ${!fruits[@]}" # 输出: apple banana cherry
-
${map[@]}
使用@
或*
可以获取数组中的所有元素:echo "${fruits[@]}" # 输出: red yellow red
-
使用
for
循环遍历关联数组的所有键及其对应的值:for key in "${!fruits[@]}"; doecho "$key: ${fruits[$key]}" done
-
修改元素:
map[key]="new_value"
-
新增元素:
map[new_key]="new_value"
-
使用
unset
命令删除关联数组中的某个元素:unset map[key]
3.3.3 引用变量
在脚本上下文中,我们可以在变量名称之前加上美元符($
)来引用声明的变量以及系统环境变量。以下是几种常用的引用方法:
-
使用
$variable
形式引用变量:echo $PATH
-
使用花括号
${variable}
形式引用的变量:echo "Value: ${my_var}" echo "Value: ${my_var}123" # 输出:Value: Hello, World!123
当变量后面紧跟其他字符时,花括号
{}
可以使变量边界更清晰。
Tips:
- 对一个变量进行赋值时不使用
$
符号- 引用一个变量值时必须使用美元符(
$
)- 在赋值语句中使用其他变量的值时,必须使用
$
符号#!/bin/bash# 1. 赋值时不使用美元符 value1="Hello" value2="World"# 2. 在赋值语句中使用 value1 的值时,必须使用美元符 greeting="$value1, $value2!"# 3. 引用变量值时使用美元符 echo "$greeting"
3.3.4 变量的作用域
全局变量
全局变量是指允许在整个脚本中(以及在其启动的所有子进程(即子Shell)中)访问的变量,全局变量可以直接在脚本的顶部或函数外部定义:
MY_GLOBAL_VAR="Hello, World!" # 定义全局变量
echo $MY_GLOBAL_VAR # 输出变量的值
可以使用 export
命令将其导出为环境变量,以便在子进程(即子Shell)中访问。
局部变量
局部变量是在特定的作用域内定义的变量,通常是在函数内定义:
my_function() {local MY_LOCAL_VAR="This is a local variable" # 定义局部变量echo $MY_LOCAL_VAR # 在函数内访问
}my_function # 调用函数
echo $MY_LOCAL_VAR # 输出为空,无法访问局部变量
当函数执行完毕后,局部变量会被销毁,无法在函数外部访问。
Tips:使用
local
定义的变量是局部的,只在其所在的函数内有效,无法通过export
导出为环境变量供子进程(即子Shell)使用。
只读变量
只读变量是定义后无法被修改的变量。使用 readonly
命令可以将变量设置为只读,这样在脚本的后续部分尝试修改该变量将会报错。
# 定义只读变量
readonly MY_READONLY_VAR="This variable is read-only"# 输出变量的值
echo $MY_READONLY_VAR # 尝试修改只读变量,将报错:cannot assign to read-only variable
MY_READONLY_VAR="New Value"
3.3.5 撤销变量
后续不再需要声明的变量时,可以使用 unset
命令来撤销已经声明的变量:
MY_VAR="Some value" # 定义变量
unset MY_VAR # 撤销变量echo $MY_VAR # 不会输出任何内容
撤销后,该变量不再存在,尝试引用将不会返回任何值,unset
命令不能删除只读变量。
相关文章:
一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
文章目录 1. 初识 Shell 解释器1.1 Shell 类型1.2 Shell 的父子关系 2. 编写第一个 Shell 脚本3. Shell 脚本语法3.1 脚本格式3.2 注释3.2.1 单行注释3.2.2 多行注释 3.3 Shell 变量3.3.1 系统预定义变量(环境变量)printenv 查看所有环境变量set 查看所有…...
批处理操作的优化
原来的代码 Override Transactional(rollbackFor Exception.class) public void batchAddQuestionsToBank(List<Long> questionIdList, Long questionBankId, User loginUser) {// 参数校验ThrowUtils.throwIf(CollUtil.isEmpty(questionIdList), ErrorCode.PARAMS_ERR…...
机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用
市场应用背景 DELTA并联机械手是由三个相同的支链所组成,每个支链包含一个转动关节和一个移动关节,具有结构紧凑、占地面积小、高速高灵活性等特点,可在有限的空间内进行高效的作业,广泛应用于柔性上下料、包装、分拣、装配等需要…...
RHCE-web篇
一.web服务器 Web 服务器是一种软件或硬件系统,用于接收、处理和响应来自客户端(通常是浏览器)的 HTTP 请求。它的主要功能是存储和提供网站内容,比如 HTML 页面、图像、视频等。 Web 服务器的主要功能 处理请求…...
Java - 人工智能;SpringAI
一、人工智能(Artificial Intelligence,缩写为AI) 人工智能(Artificial Intelligence,缩写为AI)是一门新的技术科学,旨在开发、研究用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统…...
MFC开发,给对话框添加定时器
定时器简介 定时器的主要功能是设置以毫秒为单位的定时周期,然后进行连续定时或单次定时。 定时器是用于设置有规律的去触发某种动作所用的,这种场景也是软件中经常可以用到的,比如用户设置规定时间推送提示的功能,又比如程序定…...
LED灯珠:技术、类型与选择指南
目录 1. LED灯珠的类型 2. LED灯珠技术 3. 如何选择LED灯珠 4. 相关案例和使用情况 5. 结论 LED(Light Emitting Diode)灯珠是一种半导体发光器件,通过电流在固体半导体中流动时,其工作原理是电子与空穴的结合,通过…...
C语言二刷
const #include<stdio.h> int main() {const int amount 100;int price 0;scanf("%d", &price);int change amount - price;printf("找您%d元\n", change);return 0; } 浮点数类型 输入输出float(单精度)%f%f %l…...
C++模块化程序设计举例
1、模块1 在main.cpp里输入下面的程序: #include "stdio.h" //使能printf()函数 #include <stdlib.h> //使能exit(); #include "Static_Variable.h" //argc 是指命令行输入参数的个数; //argv[]存储了所有的命令行参数; //argv[0]通常…...
毕业设计选题:基于Python的招聘信息爬取和可视化平台
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 采集的数据列表 招聘数据大屏 摘要 本系统通过对网络爬虫的分析,研究智…...
机器人学习仿真框架
机器人学习仿真框架一般包含(自底向上): 3D仿真物理引擎:对现实世界的模拟仿真机器人仿真平台:用于搭建工作场景,以实现agent与环境的交互学习学习算法框架集合:不同的策略学习算法的实现算法测…...
力扣每日一题打卡 3180. 执行操作可获得的最大总奖励 I
给你一个整数数组 rewardValues,长度为 n,代表奖励的值。 最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 : 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。如果 rewardValues[i] 大于…...
NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备视频报警功能详解
在科技日新月异的今天,视频监控系统作为现代社会的“第三只眼”,正以前所未有的方式深刻影响着我们的生活与社会结构。从公共场所的安全监控到个人生活的记录分享,视频监控系统以其独特的视角和功能,为社会带来了诸多好处…...
springboot073车辆管理系统设计与实现(论文+源码)_kaic.zip
车辆管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足,创建了一个计算机管理车辆管理系统的方案。文章介绍了车辆管理系统的系统…...
2024.10月22日- MySql的 补充知识点
1、什么是数据库事务? 数据库事务: 是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 2、Mysql事务的四大特性是什么? …...
Java中的对象——生命周期详解
1. 对象的创建 1.1 使用 new 关键字 执行过程:当使用 new 关键字创建对象时,JVM 会为新对象在堆内存中分配一块空间,并调用对应的构造器来初始化对象。 示例代码: MyClass obj new MyClass(); 内存变化:JVM 在堆…...
vue文件报Cannot find module ‘webpack/lib/RuleSet‘错误处理
检查 Node.js 版本:这个问题可能与 Node.js 的版本有关。你可以尝试将 Node.js 的版本切换到 12 或更低。如果没有安装 nvm(Node Version Manager),可以通过以下命令安装: curl -o- https://raw.githubusercontent.co…...
第 6 章 机器人系统仿真
对于ROS新手而言,可能会有疑问:学习机器人操作系统,实体机器人是必须的吗?答案是否定的,机器人一般价格不菲,为了降低机器人学习、调试成本,在ROS中提供了系统的机器人仿真实现,通过仿真&#x…...
爬虫——scrapy的基本使用
一,scrapy的概念和流程 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 框架就是把之前简单的操作抽象成一套系统,这样我们在使用框架的时候,它会自动的帮我们完成很…...
聚类分析算法——K-means聚类 详解
K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…...
【Sublime Text】设置中文 最新最详细
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…...
C++学习路线(二十四)
静态成员函数 类的静态方法: 1.可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。 2.在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数) 1)静态数据成员 可以直接访问“静态数据成员”对象的成…...
MySQL-存储过程/函数/触发器
文章目录 什么是存储过程存储过程的优缺点存储过程的基本使用存储过程的创建存储过程的调用存储过程的删除存储过程的查看delimiter命令 MySQL中的变量系统变量用户变量局部变量参数 if语句case语句while循环repeat循环loop循环游标cursor捕获异常并处理存储函数触发器触发器概…...
前端页面样式没效果?没应用上?
当我们在开发项目时会有很多个页面、相同的标签,也有可能有相同的class值。样式设置的多了,分不清哪个是当前应用的。我们可以使用网页的开发者工具。 在我们开发的网页中按下f12或: 在打开的工具中我们可以使用元素选择器,单击我…...
Mac apache配置cgi环境-修改httpd.conf文件、启动apache
Mac自带Apache,配置CGI,分以下几步: 找到httpd.conf。打开终端,编辑以下几处,去掉#或补充内容。在这个路径下写一个测试文件.py格式的,/Library/WebServer/CGI-Executables,注意第一行的python…...
多厂商的实现不同vlan间通信
Cisco单臂路由 Cisco路由器配置 -交换机配置 -pc配置 华三的单臂路由 -路由器配置 -华三的接口默认是打开的 -pc配置及ping的结果 -注意不要忘记配置默认网关 Cisco-SVI -交换机的配置 -创建vlan -> 设置物理接口对应的Acess或Trunk -> 进入vlan接口,打开接…...
sh与bash的区别
sh与bash的区别 结论:对于一般开发者,没有区别;对于要使脚本兼容较老系统,或者兼容其他shell(如ksh,dash),那么意义可能很重大,要确保自己代码没有bash扩展的特性。 区…...
D48【python 接口自动化学习】- python基础之类
day48 练习:开发自动咖啡(上) 学习日期:20241025 学习目标:类 -- 62 小试牛刀:如何开发自动咖啡机?(上) 学习笔记: 案例解析 定义类 定义属性和方法 clas…...
PostgreSQL(WINDOWS)下载、安装、简单使用
下载 PostgreSQL: Downloads PostgreSQL: Windows installers EDB: Open-Source, Enterprise Postgres Database Management 安装 注意密码要方便自己使用,不能忘记。 打开pgAdmin,输入密码 新建数据库 打开命令工具 新建表...
iapp做网站/百度关键词多少钱一个月
原型模式 转载于:https://www.cnblogs.com/zhang-wenbin/p/11445063.html...
网站建设方案项目背景意义/app关键词优化
大数据就业方向有哪些?看到了大数据的就业前景及就业薪资,相信很多人都对大数据技术跃跃欲试,想要学习大数据技术。小编认为在学习大数据之前,你还需要了解一下大数据的就业方向有哪些?毕竟我们学习大数据就是为了以后…...
太原做网站 小程序/seo实战密码电子版
2019独角兽企业重金招聘Python工程师标准>>> 可以打包各种格式 http://www.freefontconverter.com/ 转载于:https://my.oschina.net/linsk1998/blog/2874297...
网站建设的七个流程步骤/在哪里打广告效果最好
API简介 vpp其实也有自己的control-plane。它们之间的就是使用API来交互,底层是用的共享内存机制。control-plane可以是使用不同的语言来写,支持C/python/java/go 在这里了解的是用C语言与vpp通信。如图1所示。VAT通过命令行来控制VPP。 图1,…...
桂林旅游攻略/杭州seo靠谱
随着近年来互联网金融的发展,国内金融信息服务机构也随之快速发展。但是一些机构在信息内容方面存在把关不严,炒作金融市场风险、发布敏感市场信息、歪曲金融监管政策问题,对经济金融稳定带来冲击。 为了提高金融信息服务规范,雷…...
室内设计怎么收费的/优化网站搜索排名
本文翻译自:Redirect parent window from an iframe actionWhat JavaScript do I need to use to redirect a parent window from an iframe? 我需要使用什么JavaScript从iframe重定向父窗口? I want them to click a hyperlink which, using JavaScri…...