Linux学习笔记(五):shell脚本,强大的文本处理工具awk,sed

news2024/11/27 8:26:22

Linux学习笔记(五):shell脚本,awk,sed,服务管理

1. Shell 脚本

Shell 脚本是一种使用 Shell 编写的脚本,它可以在 Linux 系统中执行各种任务。

1.1 变量

  • 声明变量: 使用 export 命令声明变量。

    export 变量名
    
  • 修改变量: 在子 Shell 中修改变量,相当于创建了一个新的变量,不会影响父 Shell 中的变量。

  • 删除变量: 使用 unset 命令删除变量。

    unset 变量名
    
  • 声明类型: 使用 declare 命令声明变量的类型。

    declare -i 变量名  # 声明整型变量
    declare -r 变量名  # 声明只读变量
    declare -x 变量名  # 声明环境变量
    

1.2 特殊变量

  • $$ 符号用于引用特殊变量。
  • $?$? 用于获取上一个命令的退出状态码。
  • $-$- 用于获取当前 Shell 的选项。
  • $#$# 用于获取传递给脚本的参数个数。
  • $$$$ 用于获取当前 Shell 的进程 ID。
  • $_$_ 用于获取前一条命令的最后一个参数。
  • ${!变量名}${!变量名} 用于获取变量的值。

1.3 间接引用

  • ${变量名}: 使用 ${变量名} 进行间接引用,可以访问变量的值。

1.4 逻辑运算符

  • ${a:-b}: 如果 a 为空,则使用 b
  • ${a:=b}: 如果 a 为空,则将 b 赋值给 a
  • ${a:?b}: 如果 a 为空,则将 b 写入标准错误并退出。
  • ${a:+b}: 如果 a 为空,则返回空字符串,否则返回 b

1.5 文件操作

在这里插入图片描述

  • 文件存在test -e 文件名
  • 文件不存在test ! -e 文件名
  • 文件可读test -r 文件名
  • 文件可写test -w 文件名
  • 文件可执行test -x 文件名
    在这里插入图片描述

1.6 数组

  • 声明数组: 使用 declare -a 命令声明数组。
declare -a 数组名
  • 访问数组元素: 使用 ${数组名[索引]} 访问数组元素。

1.7 运算

  • 算术运算: 使用 expr 命令进行算术运算。
expr 10 + 20
  • 条件运算: 使用 test 命令进行条件运算。
test $x -eq $y

2. Shell 脚本深入扩展

Shell 脚本作为一种灵活的工具,可以应用于各种场景。

在这里插入图片描述

2.1 变量与参数

  • 位置参数$1, $2, $3 等用于获取传递给脚本的参数。
  • 特殊参数$*, $@, $# 等用于处理特殊参数。
  • $*:所有参数作为一个单词。
  • $@:所有参数作为单独的单词。
  • $#:传递给脚本的参数个数。
  • 获取命令行"$@""$*" 可以获取完整的命令行。

2.2 控制流

  • if 语句: 用于条件判断。
if [ 条件 ]; then
  # 条件为真时执行的命令
fi
  • case 语句: 用于多条件匹配。
case 变量 in
  情况1)
    # 情况1对应的命令
    ;;
  情况2)
    # 情况2对应的命令
    ;;
  *)
    # 默认情况
    ;;
esac
  • for 循环: 用于循环遍历。
for 变量 in 列表; do
  # 循环体
done
  • while 循环: 用于循环直到条件为假。
while [ 条件 ]; do
  # 循环体
done

2.3 函数

  • 定义函数: 使用 function 关键字定义函数。
function 函数名() {
  # 函数体
}
  • 调用函数: 使用函数名调用函数。
函数名 [参数]

2.4 输入输出

  • 读取输入: 使用 read 命令读取用户输入。
read 变量名
  • 输出文本: 使用 echo 命令输出文本。
echo "文本内容"
  • 重定向输出: 使用 >>> 运算符将输出重定向到文件。
命令 > 文件
命令 >> 文件

2.5 脚本结构

  • 注释: 使用 # 符号添加注释。
  • 空白字符: 空白字符(空格、制表符等)用于分隔命令和参数。
  • 管道: 使用 | 运算符将一个命令的输出作为另一个命令的输入。

2.6 脚本调试

  • 打印变量值: 使用 echo 命令打印变量的值,用于调试。
  • 设置断点: 使用 set -x 命令开启调试模式,打印每条命令及其参数。

2.7 Shell 类型

  • Bash: 最常用的 Shell,功能强大,易于学习和使用。
  • Zsh: 功能丰富的 Shell,支持语法高亮、别名等功能。
  • Ksh: 类似于 Bash,但有一些不同的特性。

3. 强大的文本处理工具awk

awk 是一种强大的文本处理工具,它可以将文本文件视为由记录和字段组成的数据流,并允许用户对数据进行复杂的操作。

在这里插入图片描述

3.1 基本概念

  • 记录(Record): 每一行文本都是一个记录。记录通常由换行符分隔。
  • 字段(Field): 每个记录由多个字段组成,字段通常由空白字符(空格、制表符等)分隔。
  • 字段分隔符(FS): 默认的字段分隔符是空白字符,可以使用 -F 选项指定其他分隔符,例如 -F, 使用逗号作为分隔符。
  • 模式匹配(Pattern)awk 可以根据模式匹配特定的记录。
  • 动作(Action): 对匹配的记录执行的动作,通常涉及输出或修改数据。

3.2 语法

awk [选项] '模式 {动作}' 文件...
  • 选项: 用于指定 awk 的行为,例如 -F 指定字段分隔符。
  • 模式: 用于匹配记录,可以是正则表达式或比较操作符。
  • 动作: 对匹配的记录执行的操作,可以是输出、打印、修改等。

3.3 基本用法

在这里插入图片描述
在这里插入图片描述

  • 打印所有记录
awk '{print}' 文件
  • 打印第 1 列
awk -F '\t' '{print $1}' 文件
  • 打印第二列大于 10 的记录
awk -F '\t' '$2 > 10 {print}' 文件
  • 计算所有记录的总和
awk -F '\t' '{sum += $2} END {print sum}' 文件
  • 打印包含特定单词的记录
awk '/特定单词/ {print}' 文件

3.4 高级用法

  • 嵌套模式: 可以使用多个模式进行嵌套匹配。
  • 循环和条件语句awk 支持循环和条件语句,可以执行更复杂的操作。
  • 内置函数awk 提供了大量的内置函数,例如 length(), sqrt(), strftime() 等。
  • 用户定义函数: 可以编写自己的函数,并将其添加到 awk 脚本中。

4. awk扩展用法与高级特性

4.1 复杂模式匹配

awk 支持正则表达式,这使得模式匹配更加灵活。可以使用 ~!~ 运算符来分别匹配和排除正则表达式。

# 打印包含特定模式的记录
awk '$1 ~ /模式/ {print}' 文件

# 打印不包含特定模式的记录
awk '$1 !~ /模式/ {print}' 文件

4.2 字段引用

awk 提供了多种字段引用方式,包括直接引用 $1, $2, $3 等,以及使用 NF(字段总数)、$0(整个记录)和 NR(记录数)等特殊变量。

# 打印所有记录的第三列
awk '{print $3}' 文件

# 打印每条记录的行号和所有字段
awk '{print NR, $0}' 文件

4.3 数组和关联数组

awk 支持数组和关联数组,可以用来存储和操作复杂的数据结构。

# 初始化一个关联数组
awk '{
    a[$1]++
} END {
    for (key in a) print key, a[key]
}' 文件

4.4 流控制语句

awk 支持循环和条件语句,如 for, while, if 等。

# 使用 for 循环遍历数组
awk 'BEGIN {
    for (i = 1; i <= 10; i++) print i
}'

# 使用 if 语句进行条件判断
awk '{if ($1 > 5) print $0}' 文件

4.5 内置变量和函数

awk 提供了大量的内置变量和函数,可以用于字符串操作、数学运算、日期处理等。

# 使用内置函数 split
awk -F ',' '{split($0,a," "); print a[1]}' 文件

# 使用内置变量 RS 和 RS
awk -v RS='-' '{print}' 文件

4.6 用户定义变量和函数

可以在 awk 脚本中定义自己的变量和函数。

awk '
    # 定义用户变量
    var = 10

    # 定义用户函数
    add(a, b) { return a + b }

    {
        # 使用用户变量和函数
        print var
        print add($1, $2)
    }
' 文件

4.7 处理二进制数据

awk 可以处理二进制文件,使用 -b 选项。

awk -b '{print $0}' 二进制文件

4.8 嵌套 awk 脚本

可以使用一个 awk 脚本作为另一个 awk 脚本的输入。

awk '{
    # 处理第一行
    print $0 > "output1"
    # 处理第二行
    print $0 >> "output1"
}' 文件 | awk '{
    # 处理输出文件
    print $0
}'

5. awk在shell脚本中的使用

awk 在 shell 脚本中是非常有用的,因为它可以用于处理和转换文本数据,这在脚本编写中是非常常见的任务。

5.1 简单文本处理

在 shell 脚本中,可以使用 awk 来执行简单的文本处理任务,比如打印文件的每一行。

#!/bin/bash

# 打印文件中的每一行
awk '{print}' filename

# 将输出重定向到另一个文件
awk '{print}' filename > output.txt

5.2 字段提取

awk 可以用来提取文本文件的特定列。

#!/bin/bash

# 提取第一列
awk -F, '{print $1}' filename

# 使用自定义字段分隔符
awk -F; '{print $2, $3}' filename

5.3 数据过滤

使用 awk 可以根据条件过滤数据。

#!/bin/bash

# 打印第二列大于 10 的行
awk -F, '$2 > 10' filename

# 打印包含特定单词的行
awk '/特定单词/ {print}' filename

5.4 数据计算

awk 可以用来对数据进行数学计算。

#!/bin/bash

# 计算所有记录的第二列总和
awk -F, '{sum += $2} END {print sum}' filename

# 计算平均值
awk -F, '{total += $2; count++} END {print total / count}' filename

5.5 数据排序

awk 可以用来对数据进行排序。

#!/bin/bash

# 按第二列排序
awk -F, '{print $2, $0}' filename | sort -n | awk '{print $2, $0}'

# 按第一列逆序排序
awk -F, '{print $1, $0}' filename | sort -nr | awk '{print $1, $0}'

5.6 数据转换

awk 可以用来转换数据格式。

#!/bin/bash

# 将 CSV 转换为 JSON
awk -F, '{printf "{\"%s\": \"%s\"}\n", $1, $2}' filename > output.json

5.7 复杂数据处理

在更复杂的脚本中,awk 可以嵌入在循环或条件语句中,进行更复杂的数据处理。

#!/bin/bash

# 循环遍历文件并处理每一行
while IFS= read -r line; do
    # 使用 awk 处理每一行
    awk '{print $1, $2}' <<< "$line"
done < filename

5.8 作为子shell

在 shell 脚本中,可以将 awk 命令放在子shell中执行,以避免在后台执行。

#!/bin/bash

awk '{print}' filename &
wait

注意事项

  • 当在 shell 脚本中使用 awk 时,确保文件名和变量名没有特殊字符,或者使用引号将其引起来,以避免解析错误。
  • 使用 IFS(内部字段分隔符)可以改变字段分隔符,这在处理包含空格的文件名时非常有用。
  • 在处理大量数据时,awk 可能会消耗大量内存,特别是在进行复杂的数据处理时。

6. 强大的文本处理工具sed

sed(Stream Editor)是一个强大的文本处理工具,它允许用户对文本进行编辑、转换、过滤等操作,而不需要直接对原始文件进行修改。sed 处理的是文本流,通常来自文件或标准输入(stdin)。

6.1 基本概念

  • 流编辑sed 是一个流编辑器,它一次处理一行文本。
  • 命令行编辑sed 可以在命令行上直接编辑文本,也可以从文件中读取文本。
  • 模式匹配sed 可以基于模式来选择文本行进行操作。
  • 替换sed 的主要功能之一是替换文本。

6.2 语法

sed [选项] [命令] [输入文件]
  • 选项:用于指定 sed 的行为,例如 -n 用于抑制默认的自动打印。
  • 命令:用于指定对文本进行的操作,如 p(打印)、s(替换)等。
  • 输入文件:指定输入文件名,也可以是 -' 来表示从标准输入读取。

6.3 基本用法

  • 打印匹配模式的行
sed -n '/模式/p' 文件
  • 替换文本
sed 's/旧文本/新文本/g' 文件

这里,s 是替换命令,/旧文本/ 是被查找的模式,/新文本/ 是要替换的文本,g 是全局替换标志。

6.4 高级用法

  • 删除行
sed '/模式/d' 文件

这里,d 是删除命令。

  • 添加行
sed '/模式/i 添加的文本' 文件

这里,i 是插入命令。

  • 替换并打印
sed '/模式/s/旧文本/新文本/g' 文件

这里,p 命令会打印替换后的行。

注意事项

  • sed 的替换操作默认只替换每行的第一个匹配项。要替换所有匹配项,需要使用全局替换标志 g
  • sed 的模式匹配是按行进行的,如果模式包含换行符,需要特别处理。
  • sed 的命令可以链式组合,形成复杂的文本处理流程。

7. sed的扩展用法与高级特性

7.1 使用地址范围

sed 允许你指定地址范围,这意味着你可以对文本中的特定行或行范围进行操作。

  • 指定单行
sed '3p' 文件  # 打印第三行
  • 指定多行范围
sed '1,3p' 文件  # 打印第一行到第三行
  • 反向指定
sed '3,$p' 文件  # 打印第三行到文件末尾

7.2 使用正则表达式

sed 支持复杂的正则表达式,这使得模式匹配更加灵活。

  • 使用正则表达式进行匹配
sed '/[0-9]\+/p' 文件  # 打印包含一个或多个数字的行
  • 使用括号分组
sed 's/\([0-9]\+\)/\1 square/s' 文件  # 将数字替换为其平方

7.3 使用宏和函数

sed 允许你定义宏和函数,这使得你可以重用代码。

  • 定义宏
sed -E '/pattern/{x;N;G;}' 文件  # 使用宏处理多行文本
  • 使用函数
sed -E '{
    s/\([0-9]+\)/\1*2/;  # 定义一个简单的函数
    p;
}' 文件

7.4 使用管道和重定向

sed 可以与其他命令结合使用,通过管道(|)和重定向(>)进行更复杂的文本处理。

  • 使用管道
cat 文件 | sed 's/old/new/g'  # 将 cat 命令的输出通过 sed 处理
  • 使用重定向
sed 's/old/new/g' 文件 > 新文件  # 将 sed 的输出重定向到新文件

7.5 使用 sed 进行文本转换

sed 可以用来进行各种文本转换,如转换行结束符、替换字符等。

  • 转换行结束符
sed 's/\r$//' 文件  # 将 Windows 行结束符 (\r\n) 转换为 Unix 行结束符 (\n)
  • 替换字符
sed 's/字符1/字符2/g' 文件

7.6 使用 sed 进行批量操作

sed 可以用于批量操作,比如同时替换多个模式。

sed -E '{
    s/模式1/替换文本1/g;
    s/模式2/替换文本2/g;
    p;
}' 文件

8. sed在shell脚本的使用

在shell脚本中使用sed可以极大地提高脚本处理文本数据的能力。

8.1 替换文本

在脚本中,可以使用sed来替换文件中的文本。

#!/bin/bash

# 替换文件中所有的'old'为'new'
sed -i 's/old/new/g' filename

这里,-i选项表示直接修改文件,s/old/new/g是替换命令,表示替换所有出现的’old’为’new’。

8.2 条件替换

有时候你可能只想替换符合特定条件的文本。

#!/bin/bash

# 只替换第一行中出现的'old'为'new'
sed -i '1s/old/new/g' filename

8.3 复合命令

在脚本中,你可以将多个sed命令组合起来。

#!/bin/bash

# 先替换文本,然后打印结果
sed -n 's/old/new/gp' filename

这里,-n抑制了默认的自动打印,p命令用来打印匹配的行。

8.4 过滤输出

使用sed过滤不需要的输出。

#!/bin/bash

# 仅打印包含特定模式的行
sed -n '/pattern/p' filename

8.5 文本提取

从文本中提取特定信息。

#!/bin/bash

# 提取第一列数据
sed -n 's/[^,]*,\([^\n]*\)/\1/p' filename

8.6 删除行

删除文件中的特定行。

#!/bin/bash

# 删除包含特定模式的行
sed -i '/pattern/d' filename

8.7 增加行

在文件的特定位置增加行。

#!/bin/bash

# 在第一行后增加新行
sed -i '1i\New line' filename

8.8 文件替换

在脚本中替换多个文件中的文本。

#!/bin/bash

# 替换所有文件中的'old'为'new'
for file in *.txt; do
    sed -i 's/old/new/g' "$file"
done

注意事项

  • 使用-i选项时,sed会直接修改文件。如果你不确定替换结果,可以先使用sed的输出功能来查看将要进行的修改。
  • 在使用sed进行替换时,注意转义字符的使用。例如,如果文本中包含斜杠/,你需要用双斜杠//来转义。
  • 如果你的模式或替换文本包含空格,确保它们被引号包围,以避免shell解释错误。

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

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

相关文章

C++容器类型内置函数随笔

vector 容器 添加数据 vector <int> v ; v.push_back(数据); 访问数据的两个迭代器b.begin()和v.end() vector <int> :: iterator it_begin v. begin(); //容器起始位置元素的指针vector <int> :: iterator it_end v.end(); //指向容器最后一个元素下一…

FinOps三人行:云计算时代的FinOps 反模式和SRE(文字+视频版)

简介 9月20日&#xff0c;由SRE专委会和雅菲奥朗主办的“FinOps三人行&#xff1a;云计算时代的FinOps 反模式和SRE”在线研讨会成功举办&#xff0c;三位业界专家雅菲奥朗刘峰老师、易点天下董金老师和辛诺科技Larry老师齐聚一堂&#xff0c;聚焦于云计算环境下的并购模式、运…

Python编码规范与常见问题纠正

Python编码规范与常见问题纠正 Python 是一种以简洁和易读性著称的编程语言&#xff0c;因此&#xff0c;遵循良好的编码规范不仅能使代码易于维护&#xff0c;还能提升代码的可读性和可扩展性。编写规范的 Python 代码也是开发者职业素养的一部分&#xff0c;本文将从 Python…

Java-数据结构-Map和Set(三)-习题 o(´^`)o

目录 ❄️一、习题一(只出现一次的数字)&#xff1a; ❄️二、习题二(随机链表的复制)&#xff1a; ❄️三、习题三(宝石与石头)&#xff1a; ❄️四、习题四(旧键盘)&#xff1a; ❄️五、习题五(前k个高频单词)&#xff1a; ❄️总结&#xff1a; ❄️一、习题一(只出现一…

【Nacos架构 原理】内核设计之Nacos一致性协议

文章目录 Nacos一致性协议为什么需要一致性协议Nacos选择了Raft&#xff08;强一致性&#xff09;&Distro&#xff08;最终一致性&#xff09;服务发现角度配置管理角度 Nacos自研Distro协议背景设计思想数据初始化数据校验写操作读操作 Nacos一致性协议 为什么需要一致性…

大模型笔记05--coze经典案例分析

大模型笔记05--coze经典案例分析 介绍经典案例分析抖音视频转小红书文案艺术照 & 卡通照片助手艺术照图像流卡通照片图像流多功能图像助手 注意事项说明 介绍 扣子是新一代 AI 应用开发平台&#xff0c;具备完善的生态系统&#xff0c;是国内最出色的AI平台之一。用好coze…

C/C++/EasyX ——入门图形编程(2)

【说明】这一篇的内容都是很基础的&#xff0c;所以内容会很多&#xff0c;具体现在也不知道要写多少&#xff0c;先写下去吧&#xff0c;新手小白们都不用担心&#xff0c;这个内容不会很难&#xff0c;因为我也是从一无所知过来的&#xff0c;很好入门的&#xff0c;&#xf…

游览器输入URL并Enter时都发生了什么 面试完美回答

文章目录 前言URL解析DNS解析**浏览器缓存****操作系统缓存**&#xff1a;**路由器缓存**&#xff1a;ISP&#xff08;Internet service provider&#xff09;缓存DNS递归解析IP地址的获取缓存结果 建立TCP连接发送HTTP请求服务器响应TCP链接断开渲染页面解析一 HTML解析过程解…

带你快速了解后端API服务的搭建

前言&#xff1a;写这篇文章的初衷是想分享一下我学习搭建后端API的过程&#xff0c;希望能帮助到和我一样想快速写API接口并部署到服务器上的同学&#x1f61c; 第一步&#xff1a;创建阿里云服务器 1、首先注册一个阿里云账号&#x1f917; 2、出于学习成本考虑&#xff0…

Linux系统,docker容器内查看pikachu源代码

在Linux系统中&#xff0c;要查看Docker容器内的Pikachu的源代码&#xff0c;需要先确保Pikachu的Docker镜像已经运行在系统上。以下是步骤和示例代码&#xff1a; 1、查找Pikachu容器的ID或名称&#xff1a; docker ps -a 2、使用docker exec命令进入运行中的Pikachu容器&am…

Spring MVC的运行流程详解

Spring MVC作为一个广泛使用的框架&#xff0c;提供了灵活且强大的MVC架构支持。尤其在业务系统中&#xff0c;Spring MVC能够有效地处理大量并发请求&#xff0c;提供良好的用户体验。本文将详细讲解Spring MVC的运行流程&#xff0c;以电商交易系统为案例&#xff0c;帮助读者…

不再烦恼!四款AI工具助你轻松打造完美PPT

嘿&#xff0c;各位办公室的小伙伴们&#xff0c;今儿咱们来聊聊那些让咱们工作生活大变样的“智能小伙伴”。作为每天跟PPT打交道的办公室文员&#xff0c;我敢说&#xff0c;自从有了这些神器&#xff0c;我的工作效率简直坐上了火箭&#xff0c;嗖嗖地往上涨&#xff01; 1…

Vue-Lecture1-Notes

渐进式框架 Vue 被称为“渐进式框架”&#xff0c;是因为它允许开发者根据项目的需求逐步引入和使用其功能&#xff0c;而不需要一次性使用整个框架。简单来说&#xff0c;Vue 提供了从简单到复杂的功能层次&#xff0c;可以灵活选择使用。 按需使用&#xff1a;Vue 的核心功能…

CSP-J Day 3 模拟赛补题报告

姓名&#xff1a;王胤皓&#xff0c;校区&#xff1a;和谐校区&#xff0c;考试时间&#xff1a; 2024 2024 2024 年 10 10 10 月 3 3 3 日 9 : 00 : 00 9:00:00 9:00:00~ 12 : 30 : 00 12:30:00 12:30:00&#xff0c;学号&#xff1a; S 07738 S07738 S07738 请关注作者的…

docker运行arm64架构的镜像、不同平台镜像构建

背景 Docker 允许开发者将应用及其依赖打包成一个轻量级、可移植的容器&#xff0c;实现“一次构建&#xff0c;到处运行”的目标。然而&#xff0c;不同的操作系统和硬件架构对容器镜像有不同的要求。例如&#xff0c;Linux 和 Windows 系统有不同的文件系统和系统调用&#…

银河麒麟桌面操作系统修改默认Shell为Bash

银河麒麟桌面操作系统修改默认Shell为Bash &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在银河麒麟桌面操作系统&#xff08;ARM版&#xff09;中&#xff0c;若要将默认Shell从Dash改为Bash&#xff0c;可执行以下步骤&#xff1a; 打开…

谈及医疗和教育真实需求是什么

医疗就是健康&#xff0c;物质基础身体棒&#xff1b; 教育就是心智&#xff0c;心理稳定智慧高。 提示&#xff1a;能让人内心充盈并不断提升自我能力的教育才是高品质的。 全文终结 需求量萎缩对品质端的改变-CSDN博客 与参考资料中的内容以及“贪嗔痴”的关联性进行详细扩…

【C++】vector类的模拟实现

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 本篇文章参考博客&#xff1a;【C】…

HTML5+CSS+JavaScript剪子石头布游戏

HTML5CSSJavaScript剪子石头布游戏 用HTML5CSSJavaScript剪子石头布游戏实现剪子石头布游戏&#xff0c;游戏有成绩计数&#xff0c;人、机输赢情况&#xff0c;及平局情况。 ✂代表剪刀&#xff0c;▉代表石头&#xff0c;▓ 代表布&#xff0c;给出人机双方的出拳情况 游戏…

对于无人机行业技术、人才、实验环境共享,这事你怎么看?

对于无人机行业技术、人才、实验环境共享这一话题&#xff0c;我认为这是一个具有前瞻性和积极意义的趋势&#xff0c;对于推动无人机行业的健康发展具有重要意义。以下是我对此事的详细看法&#xff1a; 一、技术共享促进创新与发展 1. 加快技术创新&#xff1a;技术共享能够…