Linux Shell脚本编写指南

        大家好,在当今快节奏的科技时代,自动化和高效的工作流程对于个人和组织来说变得愈发重要。而Shell脚本编写作为一种强大且广泛应用的技能,成为了实现自动化任务和系统管理的利器。通过编写Shell脚本,我们可以将繁琐的重复任务自动化处理,提高工作效率,减少人为错误,并为更复杂的系统管理提供可靠的解决方案。

        在本文中,我们将深入探讨Shell脚本编写的基础知识、常用语法和实践技巧。我们将通过实例演示如何编写Shell脚本来简化日常操作、优化工作流程,并探索Shell脚本在自动化任务和系统管理中的广泛应用。此外,我们还将分享调试和优化Shell脚本的技巧,以及推荐一些有用的开发工具。

一、介绍

Shell脚本的概念和用途:
        Shell脚本是一种基于命令行解释器的脚本语言,常见的是Bash(Bourne Again Shell)。它提供了一种脚本化的方式来编写一系列命令,以便自动执行各种任务。通过在脚本中编写一系列命令和脚本语句,我们可以实现文件操作、文本处理、条件判断、循环迭代和函数调用等各种任务。Shell脚本语法简洁明了,结合了命令行工具和脚本编程的特点,使得我们能够以较低的学习曲线和开发成本来实现自动化任务。

Shell脚本在自动化任务和系统管理中的重要性:
        在现代计算机系统中,自动化任务和系统管理扮演着至关重要的角色。它们涉及到文件的管理、数据的处理、软件的部署和配置、系统的监控和维护等诸多方面。手动执行这些任务不仅费时费力,还容易出现人为错误。而Shell脚本的出现为我们提供了一种高效而可靠的解决方案。通过编写Shell脚本,我们可以将这些任务自动化处理,从而节省时间和精力,并减少人为错误的发生。无论是日常的文件操作、数据处理,还是复杂的系统管理和定时任务调度,Shell脚本都能够发挥重要的作用。

学习和掌握Shell脚本编写的必要性和好处:
        学习和掌握Shell脚本编写是一项具有广泛应用和实用价值的技能。无论您是一名IT专业人员、系统管理员、开发人员,还是任何对自动化任务感兴趣的人,掌握Shell脚本编写都会给您带来诸多好处。首先,通过自动化处理繁琐的重复任务,您可以提高工作效率,将更多时间和精力投入到更有价值的工作上。其次,Shell脚本的灵活性和可扩展性使得您可以适应不同的需求和场景,实现定制化的自动化任务和系统管理。此外,掌握Shell脚本编写还有助于加深对命令行工具和操作系统的理解,提升技术能力和综合素质。

        正因为Shell脚本在自动化任务和系统管理中的重要性以及学习和掌握Shell脚本编写的必要性和好处,我们有必要深入学习和探索这一领域。在接下来的文章中,我们将一起学习Shell脚本编写的基础知识、常用语法和实践技巧,并通过实例演示如何编写Shell脚本来简化日常操作、优化工作流程。

二、Shell脚本基础

1、Shell脚本的类型

        Shell脚本是一种基于命令行解释器的脚本语言,常见的有多种类型,每种类型都有其特定的语法和功能。以下是一些常见的Shell脚本类型:

(1)Bash(Bourne Again Shell)

        Bash是最常用的Shell脚本类型,广泛应用于Linux和Unix系统。它是对Bourne Shell的扩展和改进,提供了更丰富的功能和更友好的用户界面。Bash脚本通常以.sh作为文件扩展名,可以通过解释器直接运行,也可以作为可执行文件运行。

#!/bin/bash
# 这是一个简单的Bash脚本示例
echo "Hello, World!"

(2)Korn Shell(ksh)

        Korn Shell是一种在Unix环境下广泛使用的Shell脚本类型。它结合了Bourne Shell和C Shell的特点,并添加了一些新的功能,如命令行编辑和历史命令记录等。Korn Shell的语法和功能比Bash稍微复杂一些。

#!/bin/ksh
# 这是一个简单的Korn Shell脚本示例
echo "Hello, World!"

(3)C Shell(csh)

        C Shell是一种类似于C语言语法的Shell脚本类型,主要用于BSD和其他Unix系统。它提供了一些与C语言相似的语法结构,如条件语句和循环控制等。C Shell在命令行的交互性和脚本编写的便利性方面具有一定优势。

#!/bin/csh
# 这是一个简单的C Shell脚本示例
echo "Hello, World!"

Bash脚本在Linux系统中的广泛应用:

        在Linux和Unix系统中,Bash脚本是最常用和广泛应用的Shell脚本类型。Bash作为默认的命令行解释器,几乎存在于所有的Linux发行版和Unix系统中。它不仅提供了强大的脚本编写功能,还可以直接调用系统命令和工具,与操作系统和底层系统交互。这使得Bash脚本成为了自动化任务、系统管理和日常操作的首选工具。

Bash脚本在Linux系统中的广泛应用范围包括但不限于:

  • 自动化系统管理任务,如备份、日志清理、定时任务等。
  • 系统初始化和配置,如安装软件、设置环境变量等。
  • 文件和目录操作,如文件搜索、批量处理、文件权限管理等。
  • 数据处理和文本处理,如文件内容提取、格式化输出、数据转换等。
  • 网络和服务器管理,如网络监控、远程连接、服务启停等。

2、Shell脚本文件的结构

        Shell脚本文件通常由多个部分组成,包括开头行(shebang)、注释和变量定义、主体代码块等。下面将详细介绍每个部分的内容和作用。

(1)Shell脚本文件的开头行(shebang):

        Shell脚本文件的开头行通常以#!开头,称为shebang。它用于指定脚本文件中要使用的解释器。在Linux和Unix系统中,常见的shebang行是#!/bin/bash,表示使用Bash解释器来执行脚本。根据需要,也可以使用其他解释器,如#!/bin/sh(默认的Bourne Shell解释器)或#!/bin/python(Python解释器)等。

#!/bin/bash
# 这是一个Bash脚本的开头行

(2)注释和变量的定义:

        在Shell脚本中,注释用于添加说明和解释,对于代码的可读性和维护性非常重要。注释以#开头,可以单独一行或位于代码行的末尾。变量定义用于存储和操作数据,可以是字符串、数字、数组等。在Shell脚本中,变量名不需要事先声明,直接赋值即可。

#!/bin/bash
# 这是一个Bash脚本的开头行

# 这是一个注释
name="John"  # 定义一个字符串变量
age=25      # 定义一个整数变量

(3)主体代码块的编写和执行流程:

        Shell脚本的主体代码块包含一系列命令和脚本语句,用于实现具体的任务和逻辑。主体代码块从shebang行之后开始,直到文件的结尾。Shell脚本按照从上到下的顺序逐行执行。

#!/bin/bash
# 这是一个Bash脚本的开头行

# 这是一个注释
name="John"  # 定义一个字符串变量
age=25      # 定义一个整数变量

echo "Hello, $name!"  # 打印输出变量值

if [ $age -ge 18 ]; then  # 条件判断
    echo "You are an adult."
else
    echo "You are a minor."
fi

# 其他命令和脚本语句...

        在上述示例中,主体代码块包含了一个echo命令和一个条件判断语句。首先,echo命令用于打印输出变量$name的值。然后,使用条件判断语句if来判断变量$age的值是否大于等于18,根据判断结果输出相应的消息。

        Shell脚本的主体代码块可以包含各种命令和语句,如条件判断、循环控制、函数调用、文件操作等,用于实现复杂的逻辑和任务。

3、常用的Shell命令和语法

        Shell脚本的主体代码块可以包含各种命令和语句,用于实现复杂的逻辑和任务。下面将详细介绍Shell脚本中常见的命令和语句类型,并给出相应的示例。

(1)条件判断

        条件判断在Shell脚本中用于根据特定条件执行不同的代码块。常见的条件判断语句是if-else语句和case语句。

示例1:使用if-else语句进行条件判断

#!/bin/bash

age=20

if [ $age -ge 18 ]; then
    echo "You are an adult."
else
    echo "You are a minor."
fi

示例2:使用case语句进行条件判断

#!/bin/bash

fruit="apple"

case $fruit in
    "apple")
        echo "It's an apple."
        ;;
    "banana")
        echo "It's a banana."
        ;;
    *)
        echo "It's neither an apple nor a banana."
        ;;
esac

(2)循环控制

环控制语句用于重复执行一段代码块,常见的循环控制语句包括for循环和while循环。

示例1:使用for循环遍历数组

#!/bin/bash

fruits=("apple" "banana" "orange")

for fruit in "${fruits[@]}"; do
    echo "I like $fruit."
done

示例2:使用while循环进行条件控制

#!/bin/bash

count=1

while [ $count -le 5 ]; do
    echo "Count: $count"
    count=$((count + 1))
done

(3)函数调用

函数是一段可重复使用的代码块,可以在脚本中定义函数并在需要时进行调用。

示例:定义和调用函数

#!/bin/bash

# 定义函数
say_hello() {
    echo "Hello, World!"
}

# 调用函数
say_hello

(4)文件操作

        Shell脚本可以通过命令进行文件的创建、读取、写入和删除等操作。常见的文件操作命令包括touchcatechorm等。

示例:创建和写入文件

#!/bin/bash

# 创建文件
touch example.txt

# 写入内容
echo "This is an example file." > example.txt

三、Shell脚本编写实例

1、系统管理脚本

        编写用于系统管理任务的Shell脚本可以帮助自动化和简化各种系统管理操作。下面将详细介绍如何编写这样的脚本以及提供一些示例。

编写系统管理脚本时,需要考虑以下几个方面:

  • 定义脚本的目标:明确脚本的目标是什么,例如自动备份文件、定时任务调度、日志管理等。
  • 设置必要的权限:确保脚本拥有执行权限,可以使用chmod命令为脚本添加执行权限。
  • 使用适当的命令和语句:根据任务需求,选择合适的命令和语句来实现所需的功能,如文件操作、进程管理、定时任务等。在之前的回答中已经介绍了一些常见的命令和语句类型,可以参考之前的内容。

示例1:自动备份文件:

        以下是一个自动备份文件的示例脚本,它将指定的文件备份到另一个目录,并添加时间戳以区分每次备份。

#!/bin/bash

# 定义源文件和备份目录
source_file="/path/to/source/file.txt"
backup_dir="/path/to/backup/"

# 创建备份文件名
backup_file="${backup_dir}file_$(date +%Y%m%d%H%M%S).txt"

# 备份文件
cp "$source_file" "$backup_file"

echo "File backup complete: $backup_file"

        在上述示例中,首先定义了源文件的路径和备份目录的路径。然后,使用date命令生成当前时间的时间戳,并将其添加到备份文件名中。最后,使用cp命令将源文件复制到备份文件中,并打印出备份完成的消息。

示例2:定时任务调度:

以下是一个定时任务调度的示例脚本,它使用cron调度程序来定期执行指定的任务。

#!/bin/bash

# 定义要定时执行的任务
task="echo 'This is a scheduled task.'"

# 添加任务到cron表
echo "*/5 * * * * $task" | crontab -

echo "Task scheduled."

        在上述示例中,首先定义了要定时执行的任务字符串。然后,使用echo命令将任务字符串和cron表达式结合起来,并使用管道将其传递给crontab命令。通过crontab -命令将任务添加到当前用户的cron表中。最后,打印出任务已经被成功调度的消息。

2、数据处理脚本

        编写用于数据处理和转换的Shell脚本可以帮助自动化和简化各种数据处理操作。下面将详细介绍如何编写这样的脚本以及提供一些示例。

编写数据处理脚本时,需要考虑以下几个方面:

  • 定义脚本的目标:明确脚本的目标是什么,例如文本文件的搜索和替换、数据格式化、数据提取等。
  • 使用适当的命令和语句:根据数据处理需求,选择合适的命令和语句来实现所需的功能,如文本处理命令(grepsed等)、字符串处理命令(cutawk等)等。
  • 考虑数据的大小和复杂性:如果要处理大规模或复杂的数据集,可能需要优化脚本以提高性能。

示例1:文本文件的搜索和替换:

以下是一个用于在文本文件中搜索和替换内容的示例脚本。它使用sed命令来执行搜索和替换操作。

#!/bin/bash

# 定义文件路径
file="/path/to/file.txt"

# 执行搜索和替换
sed -i 's/old_text/new_text/g' "$file"

echo "Search and replace complete."

        在上述示例中,首先定义了要处理的文本文件的路径。然后,使用sed命令和正则表达式来搜索和替换文件中的内容。通过-i选项,sed命令直接在原始文件中进行替换。最后,打印出搜索和替换完成的消息。

示例2:数据格式化和提取:

以下是一个用于数据格式化和提取的示例脚本。它使用awk命令来对文本数据进行列格式化和提取。

#!/bin/bash

# 定义输入文件路径
input_file="/path/to/input.txt"

# 定义输出文件路径
output_file="/path/to/output.txt"

# 数据格式化和提取
awk '{ printf("%-10s %-10s %-10s\n", $1, $2, $3) }' "$input_file" > "$output_file"

echo "Data formatting and extraction complete."

        在上述示例中,首先定义了输入文件和输出文件的路径。然后,使用awk命令和格式化字符串来对输入文件中的数据进行格式化和提取。$1$2$3分别表示第一列、第二列和第三列的数据。通过重定向操作符>将结果写入输出文件。最后,打印出数据格式化和提取完成的消息。

3、自动化部署脚本

        编写用于自动化部署和配置的Shell脚本可以帮助简化软件部署、配置和环境设置的过程。下面将详细介绍如何编写这样的脚本以及提供一些示例。

编写自动化部署脚本时,需要考虑以下几个方面:

  • 定义脚本的目标:明确脚本的目标是什么,例如软件安装和配置、环境变量设置等。
  • 确定所需软件和配置:确定需要安装的软件、配置文件的位置和内容等。
  • 使用适当的命令和语句:根据部署和配置需求,选择合适的命令和语句来实现所需的功能,如软件包管理命令(apt-getyum等)、文件操作命令(cpmv等)、环境变量设置等。

示例1:软件安装和配置:

        以下是一个用于自动化安装和配置软件的示例脚本。它使用适合操作系统的软件包管理命令来安装软件,并使用配置文件来进行相应的配置。

#!/bin/bash

# 安装依赖软件包
apt-get install -y package1 package2

# 下载并解压软件包
wget -O software.tar.gz https://example.com/software.tar.gz
tar -xf software.tar.gz

# 进入软件目录
cd software

# 执行配置命令
./configure --option1=value1 --option2=value2

# 编译和安装软件
make
make install

echo "Software installation and configuration complete."

        在上述示例中,首先使用适合操作系统的软件包管理命令(如apt-get)来安装所需的依赖软件包。然后,使用wget命令下载软件包,并使用tar命令解压缩软件包。接着,进入软件目录并执行相应的配置命令,例如./configure命令。最后,使用make命令进行编译和安装。根据实际情况,可能需要根据软件的不同进行额外的配置和操作。

示例2:环境变量设置:

        以下是一个用于自动化设置环境变量的示例脚本。它将环境变量的设置添加到用户的配置文件中,并使其在每次登录后生效。

#!/bin/bash

# 定义要设置的环境变量
export VAR1=value1
export VAR2=value2

# 将环境变量添加到配置文件
echo "export VAR1=$VAR1" >> ~/.bashrc
echo "export VAR2=$VAR2" >> ~/.bashrc

echo "Environment variable setup complete."

        在上述示例中,首先定义要设置的环境变量及其对应的值。然后,使用export命令将环境变量设置为当前Shell的环境变量。接下来,使用echo命令将环境变量的设置添加到用户的配置文件(例如.bashrc)。这样,每次用户登录时,配置文件都会加载并设置相应的环境变量。

四、Shell脚本的调试和优化

1、调试Shell脚本的技巧和工具

(1)添加调试输出

        使用echoprintf语句在脚本中输出变量的值、关键步骤的信息等。这可以帮助您了解脚本的执行过程和中间结果。

#!/bin/bash

echo "Starting script."

# 设置调试输出
echo "Variable value: $var"

# 执行关键步骤
echo "Executing important step."

echo "Script completed."

(2)设置调试模式

在脚本中添加一个选项来启用调试模式,例如使用-d--debug参数。在调试模式下,您可以打印更详细的输出,或者在关键位置添加额外的日志语句。

#!/bin/bash

debug=0

# 解析命令行参数
while [[ "$#" -gt 0 ]]; do
    case $1 in
        -d|--debug) debug=1 ;;
        *) echo "Unknown option: $1" ;;
    esac
    shift
done

echo "Starting script."

if [[ $debug -eq 1 ]]; then
    echo "Debug mode enabled."
    # 打印更详细的输出或添加额外的日志语句
fi

# 执行脚本的其余部分

echo "Script completed."

(3)使用set -x

        在脚本的开头添加set -x命令,它会在执行每个命令之前打印出该命令及其扩展过程。这可以帮助您跟踪脚本的执行流程。

#!/bin/bash

set -x

echo "Starting script."

# 执行脚本的其余部分

echo "Script completed."

(4)检查返回值

        在关键命令执行后,使用$?变量检查其返回值。如果返回值不是预期的0,您可以添加适当的错误处理逻辑。

#!/bin/bash

echo "Starting script."

# 执行关键命令
ls /path/to/file.txt
if [[ $? -ne 0 ]]; then
    echo "Error: Failed to list file."
    exit 1
fi

# 执行脚本的其余部分

echo "Script completed."

(5)使用Shellcheck工具

        Shellcheck是一个静态代码分析工具,可以检查Shell脚本中的语法错误和潜在问题。您可以在https://www.shellcheck.net/ 上使用在线版本,或在本地安装Shellcheck并将其应用于脚本。

2、优化Shell脚本性能和可读性的方法

(1)减少命令调用

        尽量减少不必要的命令调用,特别是在循环中。每次调用都会产生额外的开销,因此可以通过合并命令或使用适当的工具来减少调用次数。

#!/bin/bash

# 避免不必要的命令调用
# 将多个命令合并为一个命令
result=$(command1 | command2 | command3)

(2)使用合适的数据结构和算法

        选择合适的数据结构和算法可以提高脚本的性能。例如,使用数组进行批量操作,使用哈希表进行快速查找等。

#!/bin/bash

# 使用数组进行批量操作
files=("file1.txt" "file2.txt" "file3.txt")
for file in "${files[@]}"; do
    # 对每个文件执行操作
done

(3)避免不必要的IO操作

        尽量避免在循环中进行频繁的读写操作,可以通过将数据存储在变量中进行处理,或使用临时文件来减少IO次数。

#!/bin/bash

# 将数据存储在变量中进行处理
data=$(cat file.txt)
for item in $data; do
    # 处理每个数据项
done

# 使用临时文件减少IO次数
tmpfile=$(mktemp)
# 将数据写入临时文件
echo "$data" > "$tmpfile"
# 对临时文件进行处理
# ...
# 删除临时文件
rm "$tmpfile"

4、使用并行处理

        对于需要处理大量数据的任务,可以尝试使用并行处理来提高性能。Shell脚本可以使用工具如parallel来实现并行执行命令。

#!/bin/bash

# 并行执行命令
files=("file1.txt" "file2.txt" "file3.txt")
parallel -j 4 process_file {} ::: "${files[@]}"

5、保持脚本可读性

        编写清晰、易读的脚本可以提高脚本的可维护性。使用有意义的变量和函数名,添加注释来解释脚本的关键部分,遵循一致的代码风格等。

#!/bin/bash

# 设置重要变量
data_dir="/path/to/data"
output_dir="/path/to/output"

# 处理数据
for file in "$data_dir"/*.txt; do
    # 对每个文件执行操作
done

# 保存结果
cp "$output_dir"/*.txt /backup/

6、使用函数模块化

        将相关功能封装到函数中,并在需要时进行调用。这有助于提高代码的可重用性和可读性,并使脚本更易于维护和调试。

#!/bin/bash

# 定义函数
process_file() {
    # 处理文件的逻辑
}

# 处理数据
for file in *.txt; do
    process_file "$file"
done

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

前端 video 实现全屏播放

只需要加上这句代码就行 controls <videoid"myVideo":src"detailDate.linkAddress":poster"detailDate.pictureUrl"enable-danmucontrolswebkit-playsinline"true"></video>

绘画参数配置及使用

绘画参数配置及使用 路径&#xff1a;站点后台-功能-AI绘画 进入参数配置 接口选择&#xff1a;多种接口自主选择&#xff08;需自己准备key&#xff09;&#xff0c;对应接口的key对话和绘画通用 存储空间&#xff1a; 位置在超管后台-存储空间 自主选择存储&#xff08;需…

【STL源码剖析】deque 的使用

别院深深夏席清&#xff0c;石榴开遍透帘明。 树阴满地日当午&#xff0c;梦觉流莺时一声。 目录 deque 的结构 deque 的迭代器剖析 deque 的使用 ​编辑 deque 的初始化 deque 的容量操作 deque 的访问操作 在 pos 位置插入另一个向量的 [forst&#xff0c;last] 间的数据​编…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

web安全基础学习笔记

这里写目录标题 1.使用hackbar2.php漏洞基本分析 弱类型语言2.2 php漏洞找到隐藏的源代码之 index.php~2.3 php漏洞找到隐藏的源代码之 vim的临时文件 /.index.php.swp3.php漏洞基本分析 数组 3.php漏洞基本分析 extract4.php漏洞基本分析 strpos eregi函数漏洞4.php漏洞基本分…

Java web应用性能分析之【java进程问题分析定位】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 由于篇幅限制、前面三篇讲了准备工作和分析小结&#xff0c;这里将详细操作java进程问题…

The First项目报告:去中心化知识产权治理协议MON Protocol如何革新链游产业?

2023年12月&#xff0c;RPG NFT 游戏 Pixelmon 首席执行官 GiulioX 在 X 平台表示&#xff0c;确认将推出代币 MON&#xff0c;代币生成&#xff08;TGE&#xff09;时间将取决于 MON 的路线图和主流 CEX 的启动板队列。12 月 11 日&#xff0c;RPG NFT 游戏 Pixelmon 首席执行…

防爆AGV叉车在现代物流行业的应用

AGV 随着机器人技术在中国的快速发展&#xff0c;国内企业开始推出区别于传统叉车的叉车AGV&#xff0c;旨在为企业降本增效&#xff0c;降低人工成本与对人的依赖&#xff1b;同时&#xff0c;也将人工从危险恶劣的环境中解放出来。随着技术的持续提升&#xff0c;叉车AGV已经…

API低代码平台介绍4-数据库记录插入功能

数据库记录插入功能 本篇文章我们将介绍如何使用ADI平台定义一个向目标数据库插入记录的接口&#xff0c;包括手工组装报文单表插入、手工组装报文多表插入、自动组装报文多表插入三种方式。无论是单表插入还是多表插入&#xff0c;任何一条记录写入失败&#xff0c;那么默认情…

kvm学习 - 迅速上手示例

目录 kvmtool kvmsample kvmtool GitHub - kvmtool/kvmtool: Stand-alone Native Linux KVM Tool repoStand-alone Native Linux KVM Tool repo. Contribute to kvmtool/kvmtool development by creating an account on GitHub.https://github.com/kvmtool/kvmtool.git cd …

17.Redis之主从复制

1.主从复制是怎么回事&#xff1f; 分布式系统, 涉及到一个非常关键的问题: 单点问题 单点问题&#xff1a;如果某个服务器程序, 只有一个节点(只搞一个物理服务器, 来部署这个服务器程序) 1.可用性问题,如果这个机器挂了,意味着服务就中断了~ 2.性能/支持的并发量也是比较有限…

C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

【UML用户指南】-06-面向对象建模-关系(relationship)

目录 1、面向对象建模常见的关系 2、关系的组成元素 3、依赖关系 4、泛化关系 5、关联关系 关联的四种修饰 1.名称 2.角色 3.多重性 4.聚合 6、常用建模技术 6.1、对简单依赖建模 6.2、对单继承建模 6.3、对结构关系建模 1、面向对象建模常见的关系 依赖 &#x…

flask轻松入门,概念讲解

Hello World Flask 是轻量级web框架&#xff0c;仅保留了核心功能&#xff1a; 请求响应处理模板渲染URL路由 文章目录 Hello Worldflask命令模式python命令模式两种模式对比修改入口文件配置flask命令修改python命令修改 修改端口和地址flask命令修改python命令修改 修改 URL …

jupyter之plt 画图弹出窗口展示图片以及静态图片切换方法

1. jupyter出图的三种方式 在python的Jupyter Notebook中&#xff0c;使用matplotlib绘制动态图形时&#xff0c;可能出现只显示一张静态图像。 这是因为在notebook中使用plt绘图共有三种模式&#xff1a; %matplotlib inline&#xff1a;这是默认的模式&#xff0c;输出的图片…

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…

【OPENMV】学习记录 (持续更新)

一、图像 1 设置彩色&#xff0f;黑白&#xff1a; sensor.set_pixformat() 设置像素模式。 sensor.GRAYSCALE: 灰度&#xff0c;每个像素8bit。sensor.RGB565: 彩色&#xff0c;每个像素16bit。 2 设置图像大小&#xff1a; sensor.set_framesize() 设置图像的大小 sensor.…

前端优化之图片压缩——tinyPNG

今天前端前辈新介绍的一个压缩图片的工具——tinyPNG&#xff0c;地址&#xff1a;TinyPNG – Compress WebP, PNG and JPEG images intelligently可以将图片压缩&#xff0c;进行优化。 一、使用方法——手动压缩 将超过200kb的图片拖到我标注的红框框里&#xff0c;拖到这里…

如何快速定位到影响mysql cpu飙升的原因——筑梦之路

通常我们只需要执行show processlist 进行查看&#xff0c;一般执行时间最长的SQL八九不离十就是罪魁祸首&#xff0c;但当show processlist的输出有近千条&#xff0c;那么很难第一眼就发现有问题的SQL&#xff0c;那么如何快速找到呢&#xff1f;其实也非常简单。我们知道mys…