当前位置: 首页 > news >正文

二、shell脚本--变量与数据类型

1. 变量的定义与使用

定义变量:简单直接

在 Shell 里定义变量相当容易

  • 基本格式: variable_name=value
  • 关键点 ❗:赋值号 = 的两边绝对不能有空格!这绝对是初学者最容易踩的坑之一 😨,务必留意!
  • 起名字的规矩: 变量名通常由字母、数字、下划线构成,而且不能用数字开头。大家习惯用全大写表示环境变量或脚本常量,用小写或驼峰式表示本地变量
  • 值的“类型”: Shell 对变量不太讲究类型,基本上都当字符串来看待。就算你存个数字,它本质上也是个字符串(不过在做数学计算时,Shell 会尝试把它当数字处理)。
  • 给值加引号的学问:
    • 如果值里没有空格或特殊符号,可以省略引号myvar=hello
    • 如果值里有空格必须单引号 ' '双引号 " " 包起来:mymessage='Hello World'mymessage="Hello World"
    • 单引号 (’ ')“死心眼”引用。里面写啥就是啥,完全按字面处理变量 ($var) 不会展开,特殊字符也失去魔力。
    • 双引号 (" ")“灵活”引用。里面的变量引用 ($var) 会被替换成值,某些特殊字符(像 $\、```````)仍然有效
# 正确的变量定义
name="Alice"
age=30
city="Beijing"
greeting1='你好, ${name}!' # 单引号内 ${name} 不会被替换
greeting2="你好, ${name}!" # 双引号内 ${name} 会被替换成 Alice# 错误的变量定义 (等号两边有空格)
# wrong_var = "error"
引用变量:取出仓库里的东西

拿到用上变量存的值,就在变量名前面加个 $ 符号:

  • 基础用法: $variable_name
  • 更稳妥的用法: ${variable_name} (用花括号 {} 包起来)

为什么推荐用 ${} 🤔

  • 划清界限: 当变量名后面紧跟着其他字符时,花括号能明确告诉 Shell 变量名到哪里结束,避免混淆。比如 ${user}_id 就很清晰。
  • 高级玩法: 之后要玩转字符串操作(比如截取、替换),花括号是必备的。
#!/bin/bashuser="Bob"
action="studying"
echo "用户是: ${user}" # 输出 用户是: Bob
echo "${user} 正在 ${action} Shell。" # 输出 Bob 正在 studying Shell。
只读变量与删除变量
  • 只读变量 (Read-only): 把它锁起来 🛡️
    • readonly 命令,能让一个变量变成只读
    • 一旦设为只读,它的值就不能再改,也不能用 unset 删除
    • 适合定义脚本里不希望被意外修改的常量值。
#!/bin/bashreadonly app_version="1.0.2"
echo "当前应用版本: ${app_version}"# 尝试修改会报错
# app_version="1.0.3" # Error!# 尝试删除也会报错
# unset app_version # Error!
  • 删除变量 (Unset): 清空仓库 🗑️
    • unset 命令可以彻底删除一个变量(名字和值都没了)。
    • 记住: readonly 的变量是删不掉的。
#!/bin/bashtmp_dir="/tmp/my_app_temp"
echo "临时目录: ${tmp_dir}"unset tmp_dir # 删除这个变量# 再用它,就是空的了
echo "删除后的临时目录: ${tmp_dir}" # 这里会输出空行

2. 变量的作用域与类型

搞清楚变量在什么地方能用(作用域)非常关键。Shell 里主要有两大类作用域的变量:

本地变量 (普通变量) 🏠
  • 如何产生: 默认就是它!只要你用 variable_name=value 这样直接赋值,得到的就是本地变量。
  • 活动范围: 非常有限,只在创建它的那个当前的 Shell 进程里有效。可以想象成你房间里的私人物品,别人进不来拿不到。
  • 传给下一代? 不行 ❌。它不会被当前 Shell 启动的子进程(比如你运行的另一个脚本或命令)自动认识。子进程对父进程的本地变量一无所知
#!/bin/bash
# 定义本地变量
my_secret="这是我的小秘密"
echo "父脚本说,我有秘密: ${my_secret}"# 启动一个子 Shell 试试看
echo "--- 启动子 Shell ---"
bash -c 'echo "子 Shell 说,秘密是啥? ${my_secret}"' # 这里 ${my_secret} 是空的,子 Shell 拿不到
echo "--- 子 Shell 结束 ---"
环境变量 (全局变量) 🌍 与 export 命令:让信息传递下去
  • 活动范围: 环境变量的影响力更大,不只在当前 Shell 里有效。

  • 传给下一代? 可以 ✅!它们能被当前 Shell 启动的所有子进程继承。就像家族的公开信息,子子孙孙都能知道和使用。

  • 魔法棒 export ✨: 想让一个变量从本地的“私人物品”变成能被子进程继承“公开信息”(环境变量)吗?那就得用 export 命令!export 的核心作用就是把一个变量“发布”到环境中去。

  • export两种常见姿势 ✌️:

    1.先有鸡(本地变量),再有蛋(导出):

    # 1. 先定义一个普普通通的本地变量
    my_local_var="初始值"
    # 2. 然后,用 export 把它“提拔”成环境变量
    export my_local_var
    

    2.一步到位,定义的同时就导出: (这种更常用简洁)

    export shared_config_path="/etc/my_app/config"
    
  • 效果立竿见影: 变量一旦被 export,就光荣地成为了环境变量。从此刻起,这个 Shell 再启动任何新的子进程,这些子进程都能看到并使用这个环境变量了。

  • 实例见真章:

#!/bin/bash
# 本地变量,无法继承
local_info="只在父脚本可见"
# 用 export 创建环境变量,可以继承
export shared_info="父子都能看到"echo "父脚本说,本地信息: ${local_info}"
echo "父脚本说,共享信息: ${shared_info}"# 启动子 Shell 来验证
echo "--- 启动子 Shell ---"
bash -c 'echo "子 Shell 说,本地信息: ${local_info}"; echo "子 Shell 说,共享信息: ${shared_info}"'
# 注意看输出:子 Shell 里的 local_info 是空的,但 shared_info 有值!
echo "--- 子 Shell 结束 ---"
  • 查看当前的环境变量 📋: 想知道当前环境里都有哪些“公开信息”?在终端敲 env 或者 printenv 命令就行。你会看到很多系统预设的环境变量(比如 PATH, HOME, USER 等),以及你自己用 export 添加的那些。
让环境变量“永久生效”:修改配置文件 ⚙️

上面用 export 设置的环境变量只是临时的,一旦你关闭当前的 Shell 窗口(终端),它们就消失了 💨。如果希望某个环境变量长期有效,每次打开新终端都能用,就需要把它写进 Shell 的配置文件里。

  • 常见的配置文件 (Bash 为例):

    • ~/.bashrc: 最常用 👍。每次打开新的交互式 Shell(比如新开一个终端窗口)时,这里面的命令会被执行。非常适合放个人常用的环境变量和别名。
    • ~/.bash_profile (或 ~/.profile): 当你登录系统时(比如 TTY 登录,或者 SSH 登录)会执行一次。它通常会调用 ~/.bashrc。如果主要在图形界面下开终端,~/.bashrc 更常用。
    • /etc/profile: 系统全局的配置文件,影响所有用户的登录 Shell。修改它需要管理员权限。
  • 如何配置:

    1. 选择一个合适的配置文件(初学者推荐 ~/.bashrc)。

    2. 用文本编辑器打开它 (e.g., nano ~/.bashrcvim ~/.bashrc)。

    3. 在文件末尾添加你的 export 命令,例如:

      export MY_API_KEY="your_secret_api_key_here"
      export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
      
    4. 保存文件并退出编辑器。

    5. 让更改生效:

      • 方法一 (推荐):当前终端执行 source ~/.bashrc 命令,立即加载配置。
      • 方法二: 关闭当前终端,重新打开一个新的终端窗口,新窗口会自动加载 .bashrc
  • 示例:添加一个永久环境变量

    # 把 export 命令追加到 .bashrc 文件末尾
    echo 'export MY_APP_DATA_DIR="/var/myapp/data"' >> ~/.bashrc# 让当前终端也立刻知道这个新变量
    source ~/.bashrc# 现在可以验证一下了
    echo "我的应用数据目录是: ${MY_APP_DATA_DIR}"
    

    现在,每次你打开新的终端,${MY_APP_DATA_DIR} 这个变量就自动可用了!🎉

本地变量 vs 环境变量:总结回顾 🆚
特性本地变量 (普通变量) 🏠环境变量 (全局变量) 🌍
定义方式variable_name=value (默认)使用 export 命令 (如 export var=val)
作用域仅限当前 Shell 进程当前 Shell 进程 其所有子进程
继承性不被 子进程继承 ❌可被 子进程继承 ✅
持久性临时,随 Shell 关闭消失临时(若仅 export),可配置为永久(修改配置文件)
关键命令(默认)export (设置/导出), env/printenv (查看)
用途脚本内部计算、临时存储PATH设置、跨脚本共享配置、传递给子命令

一句话总结: 默认变量是本地的,用 export 把它变成环境变量,才能让子进程看到。想永久生效?写进配置文件 (~/.bashrc)。

变量描述
$0当前脚本的名称
$1$9脚本传递给脚本的第一个到第九个参数
$#脚本传递给脚本的参数个数
$@脚本传递给脚本的所有参数(如果加引号:“$@”,每个参数保持独立)
$*脚本传递给脚本的所有参数(如果加引号:“$*”,参数作为一个整体)
$$当前脚本的进程ID
$!最近一次后台运行命令的进程ID
$?上一个命令的退出状态码
$_上一个命令的最后一个参数
$-当前Shell的选项
$IFS输入字段分隔符,默认是空格、制表符和换行符赞
位置参数变量 🔢

(同前) 脚本运行时,跟在后面的参数。用 $0, $1, $2${10}… 引用。

#!/bin/bash
# 文件名: show_params.sh
echo "脚本名字 (\$0): $0"
echo "第一个参数 (\$1): $1"
echo "第二个参数 (\$2): $2"
# 执行方式: ./show_params.sh apple banana
特殊变量 ✨

(同前) Shell 自带的,有特殊含义。$# (个数), $* (整体参数), $@ (独立参数), $? (退出码), $$ (当前PID), $! (后台PID)。

#!/bin/bash
# 文件名: special_vars.sh
echo "收到参数个数 (\$#): $#"
ls /no_such_file_or_dir # 制造一个错误
echo "上个命令是否成功 (\$?): $?" # 0 代表成功, 非 0 代表失败
echo "本脚本的进程号 (\$\$): $$"
echo "--- 逐个看参数 ---"
idx=1
for param in "$@" # 推荐用 "$@" 来循环处理所有参数
do
echo "第 ${idx} 个参数是: ${param}"
idx=$((idx + 1))
done
# 执行方式: ./special_vars.sh "带空格的参数" 第二个参数

3. 字符串操作 ✂️🔗📏

(这部分内容和之前的版本相同,变量名英文,提示中文,无代码缩进)

字符串的定义与拼接

(同前)

#!/bin/bash
prefix="file_"
timestamp=$(date +%Y%m%d)
full_filename="${prefix}${timestamp}.log"
echo "完整文件名: ${full_filename}"
获取字符串长度 📏

(同前) ${#variable_name}

#!/bin/bash
sentence="学习 Shell 很有趣!"
len=${#sentence}
echo "这句话是: '${sentence}'"
echo "它的长度是: ${len}"
提取子字符串 ✂️

(同前) ${variable_name:offset:length}

#!/bin/bash
full_url="https://example.com/products/item123"
protocol=${full_url:0:5} # 从第0位开始,取5个字符
echo "协议是: ${protocol}" # https
product_id=${full_url:26} # 从第26位开始,取到末尾
echo "产品ID是: ${product_id}" # item123
字符串替换 🔁

(同前) ${var/pat/rep} (首个), ${var//pat/rep} (全部)

#!/bin/bash
raw_text="path is /home/user/data dir"
fixed_text=${raw_text/path is/directory is} # 替换第一个
echo "修正后的文本: ${fixed_text}"
no_spaces=${raw_text// /_} # 替换所有空格为下划线
echo "无空格版本: ${no_spaces}"

变量与数据类型练习题 🧠✍️

题目一:变量定义
❓ 以下哪个 Shell 变量定义是错误的,为什么?
A. my_var=hello
B. _value="some text"
C. count = 10
D. message='Error code: $?'

题目二:变量引用
❓ 假设有变量 filename="data.csv",如何安全地将其与字符串 _backup 拼接成 data.csv_backup?写出推荐的写法。

题目三:变量作用域辨析
本地变量(普通变量)和环境变量(全局变量)在被子进程继承方面有什么关键区别?哪个命令用于将本地变量变为环境变量?

题目四:位置参数
❓ 一个脚本 run.sh 被这样调用:./run.sh first second third。在 run.sh 内部,变量 $3 的值是什么?

题目五:特殊变量含义
❓ 执行一个命令后,应该检查哪个特殊变量来判断该命令是否成功执行?如果成功,这个变量的值通常是什么?

题目六:$* vs $@ 关键场景
❓ 当脚本的参数是 "文件 1.txt""文件 2.txt" 时,for i in "$*"for i in "$@" 遍历的结果有何不同?哪个更适合逐个处理这些文件名?

题目七:字符串长度
❓ 如何获取变量 address="北京市海淀区"长度

题目八:子串提取
❓ 给定 version_str="app-1.0.5-release",如何提取出中间的版本数字 1.0.5

题目九:字符串替换
❓ 如何将字符串 path_var="/usr/bin:/usr/local/bin:/bin"所有的冒号 : 替换为空格


参考答案 ✅💡

答案一:
C. count = 10 是错误的 ❌。
原因: Shell 变量赋值时,等号 = 两边绝对不能有空格。正确写法应为 count=10

答案二:
推荐使用花括号 {} 来界定变量名:${filename}_backup ✅。

答案三:
关键区别:本地变量 不会被子进程继承,而环境变量 可以被子进程继承 ✅。使用 export 命令将本地变量变为环境变量。

答案四:
变量 $3 的值是 third

答案五:
应该检查 $? ❓。如果命令成功执行,$? 的值通常是 0 ✅。非零值表示有错误发生。

答案六:
结果不同:

  • for i in "$*": 循环只执行一次,变量 i 的值是整个字符串 "文件 1.txt 文件 2.txt"
  • for i in "$@": 循环会执行两次。第一次 i"文件 1.txt",第二次 i"文件 2.txt"

因此,for i in "$@" 更适合逐个、且保持参数完整性地处理这些文件名 👍。

答案七:
使用 ${#address} 可以获取其长度 📏。

答案八:
可以使用 ${version_str:4:5}

  • 4 是起始偏移量 (索引从0开始,所以第5个字符’1’的索引是4)。
  • 5 是要提取的长度 (‘1.0.5’ 这5个字符)。

答案九:
使用双斜杠 // 进行全局替换:${path_var//:/ } 🔁。(冒号被替换为空格)。

相关文章:

二、shell脚本--变量与数据类型

1. 变量的定义与使用 定义变量:简单直接 在 Shell 里定义变量相当容易: 基本格式: variable_namevalue关键点 ❗:赋值号 的两边绝对不能有空格!这绝对是初学者最容易踩的坑之一 😨,务必留意&#xff01…...

GitHub Actions 和 GitLab CI/CD 流水线设计

以下是关于 GitHub Actions 和 GitLab CI/CD 流水线设计 的基本知识总结: 一、核心概念对比 维度GitHub ActionsGitLab CI/CD配置方式YAML 文件(.github/workflows/*.yml).gitlab-ci.yml执行环境GitHub 托管 Runner / 自托管GitLab 共享 Runner / 自托管市场生态Actions Mar…...

穿越数据森林与网络迷宫:树与图上动态规划实战指南

在 C 算法的浩瀚宇宙中,树与图就像是神秘的迷宫和茂密的森林,充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘,帮助我们找到最优路径。今天,就让我们一起深入这片神秘领域,揭开树与图上动态规划的神秘面纱&am…...

Java学习手册:Spring 生态其他组件介绍

一、微服务架构相关组件 Spring Cloud 服务注册与发现 : Eureka :由 Netflix 开源,包含 Eureka Server 和 Eureka Client 两部分。Eureka Server 作为服务注册表,接收服务实例的注册请求并管理其信息;Eureka Client 负…...

[android]MT6835 Android 移植brctl指令

说明 android默认brctl不支持showmacs选项,需要移植brctl-utils软件包 移除toybox中brctl编译 mssi/external/toybox/Android.bp 将 toybox_symlinks ["[","acpi","base64","basename","blockdev","br…...

安卓基础(悬浮窗分级菜单和弹窗)

initializeViews() 初始化 把全部的按钮都弄出来 // 主菜单按钮ImageButton mainButton floatingMenuView.findViewById(R.id.main_button);// 二级菜单按钮subButtons new ImageButton[3];subButtons[0] floatingMenuView.findViewById(R.id.sub_button_1);subButtons[1]…...

HTTP基础介绍+OSI七层参考模型+HTTP协议介绍

图片来源于网络 图片来源于网络 浏览器 Chrome:谷歌浏览器,推荐 Safari(WebKit):苹果浏览器,iOS,macOS Firefox:火狐浏览器,开源插件特别多(FireBug) IE:Wi…...

【项目实践】boost 搜索引擎

1. 项目展示 boost搜索引擎具体讲解视频 2. 项目背景 对于boost库,官方是没有提供搜索功能的,我们这个项目就是来为它添加一个站内搜索的功能。 3. 项目环境与技术栈 • 项目环境: ubuntu22.04、vscode • 技术栈: C/C、C11、S…...

接口隔离原则(ISP)

非常好,**接口隔离原则(ISP: Interface Segregation Principle)是 SOLID 五大原则中的第四个,它专门解决“一个接口太臃肿”**导致的麻烦。 我来从以下几个维度详细拆解: 🧠 什么是接口隔离原则&#xff1…...

Leetcode刷题记录29——矩阵置零

题源:https://leetcode.cn/problems/set-matrix-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路一: 💡 解题思路 本题中我们采用如下策略: 第一次遍历整个矩阵,记…...

复刻低成本机械臂 SO-ARM100 组装篇(打螺丝喽)

视频讲解: 复刻低成本机械臂 SO-ARM100 组装篇(打螺丝喽) 组装的视频有很多,参考大佬的《手把手复刻HuggingFace开源神作之Follower机械臂组装,资料已整理》_哔哩哔哩_bilibili,跟着视频做,大体…...

[更新完毕]2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学:LED显示屏颜色转换设计与校正

完整内容请看文章最下面的推广群 已经更新完整的文章代码 基于非线性映射与深度模型的多通道LED显示屏色彩校正 摘要 本研究聚焦于高动态色彩空间下LED显示屏的色彩映射与逐点校正问题,结合非线性回归理论与深度学习模型,构建了一套涵盖BT.2020映射、RG…...

Easy云盘总结篇-登录注册

**说在前面:该项目是跟着B站一位大佬写的,不分享源码,支持项目付费 ** 获取图形验证码 可以看到这里有2两种图形验证码,分为: type0:如上图下面那个,是完成操作后要进行注册的验证码 type1: 如…...

04 基于 STM32 的时钟展示程序

前言 我们经常会看到 各个场合下面有 基于数码管 的时钟程序 比如 在车站, 教室, 办公室 等等 各个场合都有 然后 这里就是做一个 简单的 时钟程序 展示程序 测试用例 每一秒钟更新时间, 然后 迭代更新 天, 时, 分 等等 然后 主流程 基于 天, 时分秒 渲染数码管 #incl…...

音视频开发技术总结报告

音视频开发技术总结报告 一、音视频开发基础 1、音频基础 声音原理 声波特性:频率、振幅、波长人耳听觉范围:20Hz-20kHz声音三要素:音调、音量、音色 数字音频基础 采样率:常见44.1kHz、48kHz、96kHz量化位数:8bit、…...

FastAPI系列13:API的安全防护

API的安全防护 1、HTTPS 强制什么是HTTPS强制如何在FastAPI中实现HTTPS强制 2、CORS跨域资源共享什么是CORS在 FastAPI 中开启 CORS 3、SQL注入防护什么是SQL注入如何在FastAPI中实现SQL注入防护 4、CSRF防护什么是CSRF防护如何在FastAPI中实现CSRF防护 在 FastAPI系列12&…...

每天一道面试题@第五天

1.包装类型的缓存机制了解么? 指部分包装类在创建对象时,会将一定范围内的对象缓存起来,当再次使用相同值创建对象时,优先从缓存中获取,而不是重新创建新对象。【提高性能】【节省内存】 列举几个常见的包装类缓存机…...

Python硬核革命:从微控制器到FPGA的深度开发指南

1. 重新定义硬件开发:Python的颠覆性突破 传统硬件开发长期被C/C++和Verilog/VHDL统治,但Python正通过两条路径改变这一格局: 1.1 微控制器领域的MicroPython革命 完整Python 3.4语法支持,运行在资源受限的MCU上(最低要求:64KB ROM,16KB RAM) 直接内存访问能力,突破…...

WebRTC 服务器之Janus概述和环境搭建

1 概述 Janus 是由 Meetecho 开发的通用 WebRTC 服务器,它为构建 WebRTC 应用程序提供了一个模块化框架。服务器目标:Janus WebRTC 网关被设计为轻量级、通用的 WebRTC 服务器,除了实现以下方法外,它本身不提供任何功能&#xff1…...

mcp+llm+rag

MCPRAG简介 前言一、MCP是什么?二、MCP工作原理(1. MCP Hosts(主机)(2.MCP Clients(客户端)(3. MCP Servers(服务端)(4. Local Data Sources(本地数据源&…...

Seata RM的事务提交与回滚源码解析

文章目录 前言一、RM提交事务二、RM回滚事务2.1、undo校验逻辑2.2、执行回滚逻辑 总结RM 的事务提交与回滚行为说明(基于 Seata AT 模式)1. 提交阶段(Phase Two Commit)2. 回滚阶段(Phase Two Rollback) 前…...

Ubuntu 24.04 完整Docker安装指南:从零配置到实战命令大全

Ubuntu 24.04 完整Docker安装指南:从零配置到实战命令大全 文章目录 Ubuntu 24.04 完整Docker安装指南:从零配置到实战命令大全1. 安装 Docker2. 配置 Docker 镜像加速器2.1 配置 Docker 镜像源2.2 重启 Docker 服务 3. Docker 常用命令3.1 Docker 常用命…...

设计模式简述(十七)备忘录模式

备忘录模式 描述组件使用 描述 备忘录模式用于将对象的状态进行保存为备忘录,以便在需要时可以从备忘录会对象状态;其核心点在于备忘录对象及其管理者是独立于原有对象之外的。 常用于需要回退、撤销功能的场景。 组件 原有对象(包含自身…...

【ICMP协议深度解析】从网络诊断到安全实践

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键报文类型说明协议版本对比 二、实战演示环境配置要求核心实验实现实验1:标准ping流程实验2:traceroute路径发现实验3:自定义ICMP…...

《应用开发突围指南:敏捷开发的实战精髓》

如何在应用开发中精准且深入地应用敏捷开发方法呢?让我们一同深入探索。 敏捷开发,绝非仅仅是一种开发流程,更是一种蕴含深刻智慧的理念与思维方式。它与传统开发模式有着本质的区别,传统开发模式如同严谨的线性旅程,…...

【Mytais系列】SqlSession

MyBatis 的 SqlSession 是框架的核心接口之一,它是应用程序与 MyBatis 交互的顶层 API,用于执行 SQL 命令、管理事务和访问数据库。以下是关于 SqlSession 的详细说明: 1. 核心功能 (1) 执行 SQL 操作 增删改查:通过方法如 sele…...

【掌握 DDL】:SQL 中的数据库与表管理

掌握 DDL:SQL 中的数据库与表管理 掌握 DDL:SQL 中的数据库与表管理数据库 DDL创建数据库查看数据库查看所有数据库查看数据库创建语句 进入数据库删除数据库备份数据库备份恢复 查看数据库连接深入理解数据库创建与删除数据库字符集与校验规则 表 DLL创…...

第43周:GAN总结

目录 摘要 Abstract 计算机视觉中的分类 架构变体 损失变体 时间序列中的GAN 连续型GAN 离散型GAN 总结 摘要 本周总结了GAN的变形,主要从图像处理和时间序列生成两部分入手,分别找出了其中比较经典的几种GAN变种模型,简单分析了…...

安卓基础(MediaProjection)

1. Display 类 ​​作用​​:代表显示设备(手机屏幕、外接显示器)​​常用方法​​: display.getRotation() // 获取屏幕方向(横屏/竖屏) display.getRefreshRate() // 获取屏幕刷新率(如&…...

Android Compose 物联网(IoT)UI 组件库封装指南

Android Compose 物联网封装组件 在物联网(IoT)应用开发中,使用Jetpack Compose可以创建现代化、响应式的用户界面。以下是一些针对物联网场景的Compose封装组件思路和实现方法: 常用物联网组件封装 1. 设备状态指示器 Composable fun DeviceStatusI…...

实用在线工具箱OmniTools

简介 OmniTools 是一个自托管的网络应用,提供多种在线工具,旨在简化日常任务。它包含了一系列独立的、小型但实用的工具,涵盖了文件处理、文本操作、网络请求、系统监控等多个方面。 OmniTools 的设计理念是简单、易用、可定制,方…...

【AI大模型学习路线】第一阶段之大模型开发基础——第三章(大模型实操与API调用)单轮对话与多轮对话调用。

【AI大模型学习路线】第一阶段之大模型开发基础——第三章(大模型实操与API调用)单轮对话与多轮对话调用? 【AI大模型学习路线】第一阶段之大模型开发基础——第三章(大模型实操与API调用)单轮对话与多轮对话调用&…...

数字化转型进阶:26页华为数字化转型实践分享【附全文阅读】

本文分享了华为数字化转型的实践经验和体会。华为通过数字化变革,致力于在客户服务、供应链、产品管理等方面提高效率,并把数字世界带入每个组织,构建万物互联的智能世界。华为的数字化转型愿景是成为行业标杆,通过推进数字化战略、构建面向业务数字化转型的IT组织阵型、坚…...

Go语言的优势与应用场景 -《Go语言实战指南》

一、 Go语言的五大核心优势 1. 语法简洁,开发高效 Go语言借鉴了C语言的表达方式,但去掉了多余复杂的特性(如继承、多态、异常处理等),语法风格清晰明了,极大地降低了学习成本: • 无需头文件…...

3D人物关系图开发实战:Three.js实现自动旋转可视化图谱(附完整代码)

3D人物关系图开发实战:Three.js实现自动旋转可视化图谱 效果核心解析场景初始化自动旋转控制器节点创建(带图片和标签)关系连线动画循环数据格式说明 代码 效果 本文将带您使用Three.js实现一个带自动旋转功能的3D人物关系图谱,核…...

文件操作-

1. 为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化…...

硬件零基础入门(尚硅谷)

1 一个碳原子有一个自由电子。所以能够导电。 金刚石四个都是都弄成共价键了,所以没有自由电子不能自由电子。 2 新的电子进来,因为互斥电荷进行了定向运动,产生了能量。两边电子平衡就停止了。所以电池的负极有电子。 电荷就是质子和电…...

【Ai零件】高德开放平台MCP的API-key注册

前言 基本操作文档,为n8n等平台,调用高德MCP服务做准备,本文记录其API-Key的生成步骤。 操作步骤 高德开发平台官网:https://lbs.amap.com/ 完成后,进入控制台界面: 创建新应用 进入【应用管理】,点击页…...

安卓基础(startActivityForResult和onActivityResult)

onActivityResult 方法有三个参数: requestCode:启动 Activity 时传入的请求码,用于区分不同的启动请求。resultCode:返回结果的状态码,通常为 RESULT_OK 或 RESULT_CANCELED。data:一个 Intent 对象&…...

安卓基础(悬浮窗)

悬浮窗 import android.app.Service; import android.content.Context; import android.graphics.PixelFormat; import android.os.IBinder; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager…...

《windows GCC 版本升级到9以上》

《windows GCC 版本升级到9以上》 在 Windows 系统上升级 GCC 到 9 以上版本通常有两种主流方案:MinGW-w64 和 WSL(Windows Subsystem for Linux)。以下是具体操作步骤: 方案一:使用 MinGW-w64(原生 Windows 环境) 步骤 1:安装 MSYS2 MSYS2 是 Windows 上的软件分发…...

LeetCode —— 102. 二叉树的层序遍历

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…...

Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)

摘要:本文介绍面向对象编程基础概念,包括类与对象、封装、继承和多态等。以Python语言为例,详细讲述了类的定义与使用、构造函数与析构函数、类的访问控制等。面向对象编程通过将数据和操作封装在一起,提高代码的模块化和可维护性…...

【AI论文】DeepCritic:使用大型语言模型进行有意识的批判

摘要:随着大型语言模型(LLMs)的快速发展,对其输出提供准确的反馈和可扩展的监督成为一个紧迫而关键的问题。 利用LLM作为评判模型来实现自动化监督是一种有前景的解决方案。 在这项工作中,我们专注于研究和提高LLM的数…...

硬件工程师面试常见问题(12)

第五十六问:PCI总线基本知识 关于PCI总线的描述,错误的是:(A)(4分) A.PCI总线是一个16位宽的总线。 B.PCI的地址线与数据线是复用的。 C.PCI是一种独立于处理器的总线标准,可以支持多种处理器。 D.PCI支持即插即用功能。 解释: …...

大数据Spark(五十八):Spark Pi介绍

文章目录 Spark Pi介绍 Spark Pi介绍 Spark Pi是Apache Spark官方提供的一个示例程序,该案例使用 Spark 进行分布式计算,通过蒙特卡罗方法估算圆周率(π)的值,其估算π原理如下: 上图中,正方形…...

深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件

1. 引言 1.1 Java 中的轻量级 HTTP 服务需求 随着微服务、工具类应用和嵌入式系统的兴起,开发者对轻量级 HTTP 服务的需求日益增长。相比引入庞大的框架(如 Spring Boot),使用 JDK 原生 API 构建 HTTP 服务成为一种快速、低依赖的替代方案。 JDK 提供了 com.sun.net.htt…...

MaC QT 槽函数和Lambda表达式

在C Qt框架中&#xff0c;槽函数&#xff08;Slot&#xff09;是一种特殊的成员函数&#xff0c;用于响应信号&#xff08;Signal&#xff09;的触发&#xff0c;从而实现对象间的通信和事件处理。 #include<QMessageBox>//包含槽函数的头文件 //定义槽函数 响应特定的信…...

JMM 与 JVM 运行时数据区有什么区别和联系?

JMM&#xff08;Java Memory Model&#xff09;和 JVM 运行时数据区&#xff08;JVM Runtime Data Areas&#xff09;是 Java 内存管理中的两个不同但密切相关的概念。 1. JVM 运行时数据区 (JVM Runtime Data Areas) 是什么&#xff1f; JVM 运行时数据区是 JVM 在程序执行过程…...

LeetCode Hot100题解

目录 一、数组 & 字符串 1. 两数之和&#xff08;简单&#xff09; 2. 删除有序数组中的重复项&#xff08;简单&#xff09; 3. 移除元素&#xff08;简单&#xff09; 4. 合并两个有序数组&#xff08;简单&#xff09; 5. 买卖股票的最佳时机&#xff08;简单&…...