Linux Shell脚本编写指南

news2024/7/4 5:22:45

        大家好,在当今快节奏的科技时代,自动化和高效的工作流程对于个人和组织来说变得愈发重要。而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.coloradmin.cn/o/1798863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript的核心语法

JavaScript JavaScript:JavaScript的组成:核心语法:Hello:变量:JS的基本数据类型:特殊点: 数组:流程控制语句:函数:函数的重载:函数的递归:预定义…

算法:226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

算法学习笔记(7.4)-贪心算法(区间调度问题)

目录 ##什么是区间调度问题 ##贪心解法 ##具体的例题示例讲解 ##452. 用最少数量的箭引爆气球 - 力扣(LeetCode) ##435. 无重叠区间 - 力扣(LeetCode) ##56. 合并区间 - 力扣(LeetCode) ##什么是区间调…

学习周报:文献阅读+Fluent案例+Fluent相关算法学习

目录 摘要 Abstract 文献阅读:求解正逆运动波问题的物理信息神经网络 文献摘要 讨论|结论 理论基础 KWM(运动波动方程) Hard constraint (硬约束方式) 具有重新分布的搭配点的PINN 具有停止梯度的分数阶方程 …

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样(见图1),Nginx造成该错误的原因: 1. 我在配置域名解析成IP时,没有把所有解析配置都修改,见图2:解析 *.hanxiaozhang.xyz 配置的是新IP地…

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的,如果修改其值会导致…

汽车EDI——Volvo EDI 项目案例

项目背景 作为Volvo的长期合作伙伴,C公司收到Volvo的EDI对接邀请,需要实现EDI对接。C公司将会面临哪些挑战?又应该相应地选择何种EDI解决方案呢? 汽车行业强调供需双方的高效协同(比如研发设计、生产计划、物流信息等…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难:将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40,按照向导将fedora40安装到真机的sda7分区中得到报错如下内容: Failed to find a suitable stage1 device: E…

最大矩形问题

柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高,因此只要能确定每个矩形的宽和高,就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始,到下标为 j 的柱子结束,那么这两根柱子之间的矩形(含两端的柱…

论文敲公式敲到“崩溃”?合合信息扫描全能王“公式识别”一键解决公式提取难题

毕业季临近,全国高校毕业生陆续进入了忙碌的“答辩季”。进入“百米冲刺”阶段,论文至关重要。对于理科工学生而言,论文中的数理化公式,稍不注意就容易输错,手动输入误差难以避免。 近日,合合信息旗下扫描…

【C++课程学习】:C++入门(函数重载)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🌈函数重载: 🍉1.参数个数不同: 🍉2.参数…

【计算机视觉(9)】

基于Python的OpenCV基础入门——形态学操作 形态学操作腐蚀膨胀开运算闭运算梯度运算顶帽黑帽 形态学操作代码实现以及效果图 形态学操作 形态学操作是数字图像处理中的一种方法,用于改变和提取图像中的结构和形状信息。它基于图像的形状和大小特征,通过…

【Framework系列】Excel转Json,配置表、导表工具介绍

今天来介绍一下Framework系列的配置部分,这一部分归属于Framework-Design之中。读过《Framework系列介绍》的小伙伴应该了解整个Framework框架是由多个工程项目组成,没看过的小伙伴可以点击链接了解一下。 Framework-Design设计的初衷是给策划同学用的&a…

为Android组件化项目搭建Maven私服

概览 文章目录 概览前言搭建 maven 私服服务器环境jdk安装配置nexus安装配置管理创建存储点、仓库 项目中使用 maven 私服上传 module 到仓库自动发布 module手动上传单个aar包 引用仓库中的 modulebuild.gradle引入远程module FAQ开发阶段有些module用远程依赖,有些…

苹果警告部分 iPhone 用户称他们遭到雇佣间谍软件攻击

苹果警告部分 iPhone 用户称他们遭到“雇佣间谍软件攻击 苹果正在提醒用户注意针对 iPhone 的新一轮已识别雇佣间谍软件攻击。可能的受害者已经收到来自苹果的电子邮件,其中描述了该攻击如何“远程破坏 iPhone”。据路透社报道,印度和其他 91 个国家的受…

内容产品运营方案业务架构解析与实践探索

### 背景 在信息爆炸的时代背景下,内容产品运营成为各行各业竞争的重要环节。构建合理的内容产品运营方案业务架构,能够帮助企业更好地管理内容生产、推广和变现,提升品牌影响力和商业价值。 ### 业务架构设计 #### 1. 内容生产与管理 建立…

一套java开发的(未来工厂核心MES系统成品源码)技术架构:java+springboot 支撑多端管理,可商用

MES定义为“位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统” 20世纪90年代初期,中国就开始对MES以及ERP的跟踪研究、告知或试点,而且曾经发言 “管控一体化”,“人、财、物、产、供、销”等颇具中国独具一格的CIMS、…

input组件 type为nickname pc端获取不到这个绑定的值?

一、input组件 type为nickname pc端获取不到这个绑定的值&#xff1f; 在pc端 使用input blur 事件获取选择昵称结果失败 代码如下&#xff1a; <input type"nickname" bindblur"binname" name"nickName" placeholder"请输入昵称"…

2024年政治经济学与社会科学国际会议(ICPESS 2024)

2024年政治经济学与社会科学国际会议 2024 International Conference on Political Economy and Social Sciences 会议简介 2024年政治经济学与社会科学国际会议是一个致力于探讨政治经济学与社会科学交叉领域前沿问题的国际盛会。本次会议汇聚了全球顶尖的专家学者、研究人员和…

传统产品经理AI产品经理

前言 随着科技的发展&#xff0c;技术的革新&#xff0c;AI技术当今已经渗入到各个行业里边&#xff0c;身处其中的产品经理也面临的新的挑战和机遇&#xff0c;下面是笔者整理分享的关于传统的产品经理如何顺应时代发展&#xff0c;成功转换成AI产品经理的相关内容&#xff0…