1、Shell 基本概述
版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin
1、Shell基本概述
1.什么是shell
shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,将用户输入的命令翻译给操作系统,并将处理的结果输出至屏幕。
当然shell命令是存在 交互式、非交互式两种方式。way? 其实是我们日常使用最多的一种模式、登录终端、执行命令、 返回结果。再次输入命 令然后等待结果。最后结束工作退出Shell会话。当退出Shel/会话后 ,当前的shell会 话也就终止了。 那什么又是shell非交互式:在这种模式下, shel/不与你进行交互,而是直接读取某个 文件进行执行。那文件中都有什么, "其实就是一堆的命令”。 当该文件丛头执行到 尾,结束后,当shell也就终止了。
2.什么是shell脚本
2.1.将系统命令堆积在一起,顺序执行简称系统命令堆积
示例: [root@test ~]# vim test.sh [root@test ~]# sh -x test.sh ##(-x参数是显示脚本执行的过程) + pwd /root + ls test.sh + ll test.sh: line 3: ll: command not found + cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
2.2.特定的格式+特定的语法+系统的命令=文件。
1.申明我们是一个shell脚本 2.if for 3.command { ls | pwd | awk | sed }
2、Shell脚本能做什么
shell脚本能做什么(shell其实就是基于标准化之上的>脚本工具 1、基础配置系统初始化操作、系统更新、 内核调整、网络、时区、SSH优化 2、安装程序部署LNMP、LNMT、 MySQL、Nginx、 Redis、 ELK等等 3、配置变更Nginx Conf、PHP Conf、MySQL Conf、Redis Conf 4、业务部署Shel/配台git、jenkins实现自动化部署php、java代码,以及代码回滚 5、日常备份:使用ShelI脚本对MySQL进行每晚的全备与增量备份 6、信息采集Zabbix+Shel/,硬件、系统、服务、网络、等等 7、日志分析取值>排序>去重>统计>分析 8、服务打扩容打容监控服务器集群pu,如cpu负载持续80% +触发动作脚本,脚本 调用api开通云主机>初始化环境>加入集群>对外提供 9、服务缩容监控服务器集群pu使用率, -> 低于20%->检测当前有多少web节点>判断 是否超过预设>缩减到对应的预设状态>变更负载的配置 PS:注意Shell脚本主要的作用是简化操作步骤提高效率,减少人为干预,减少系统故障
3、Shell脚本预备知识
1.学习shelI脚本需要的预备知识
1、熟练使用vim编辑器 2、熟练使用inux 基础命令 3、 熟练使用linux三剑客 PS:注意如果我们对命令使用不够熟练、对基本服务也不会手动搭建、那么一定学不会Shell
2.如何才能学好shelI脚本
1、基础命令+基础服务+练习+思路。(必备) 2、能看懂Shell脚本—> 能修改Shell脚本—>能编写Shell脚本—>能优化ShelI脚本
shell需要基础:
1、基础命令 { awk | sed | find | grep | ps | netstat | useradd | ..... } + 基础服务 + 练习 + 思路。 (必备) 需求:获取nginx7中状态的指标: 1.如何打印nginx7中状态 1.1)安装nginx . 1.2)开启状态模块 2.如何提取状态中的值 2.1) curl获取到结 果 2.2)使用awk提取具体的值 Active Connection: 1 ------------------------------------------------------------------------------- 2、能看懂Shell脚本->能修改Shell脚本-->能编写Shell脚本-->能优化Shell脚本 ------------------------------------------------------------------------------- 1.基础配置: yum源 ssh 软件包 创建用户 内核参数 ...... { shell | ansible } 2.配置变更: Nginx PHP Tomcat MySQL { shell | ansible } 3.部署代码: Gitlab Jenkins shell|ansible web集群 { shell | ansible } 4.监控服务: Zabbix ............... { shell } 5.日志分析: pv uv ip { awk } elkstack 6.自动扩容: 监控系统+ 弹性伸缩服务(免费) { shell | Python } 7.自动缩容: 8.日常备份: Shell \ rsync { shell }
4、shell脚本书写格式
1.shell脚本命名:
名字要有意义,不要使用a、b、c、1、2、3、这种方式命名,虽然inux系统中,文件没有打展名的概念,依然建议你用.sh结尾,名字不要太长,最好能在30个字节以内解决。例如: check _memory.sh
示例:
比如我们创建了两个文件。一个是1.py,另一个是1.sh。那么以py结尾的一定是Pytho件?1.sh一定是脚本文件吗?并不是!具体是什么文件可以用file命令查看
2.shell脚本格式:
shell脚本开头必须指定脚本运行环境以# ! 这个特殊符号组台来组成。如:
!/bin/bash指定该脚本是运行解析由/bin/bash来完成的。
3.实现编写.sh结尾文件时自动添加开头
[root@test ~]# vim /root/.vimrc [root@test ~]# cat /root/.vimrc autocmd BufNewFile *.sh exec ":call AddTitleForShell()" function AddTitleForShell() call append(0,"#!/bin/bash") call append(1,"# **********************************************************") call append(2,"# * Author : oldzhang") call append(3,"# * Email : 1224256589@qq.com") call append(4,"# * Create time : ".strftime("%Y-%m-%d %H:%M")) call append(5,"# * Filename : ".expand("%:t")) call append(6,"# * Description : xxxxxx") call append(7,"# **********************************************************") endfunction
##当我们编写.sh结尾的文件时会自动添加开头
[root@test ~]# vim test.sh [root@test ~]# cat test.sh #!/bin/bash # ********************************************************** # * Author : oldzhang # * Email : 1224256589@qq.com # * Create time : 2021-06-21 07:16 # * Filename : test.sh # * Description : xxxxxx # ********************************************************** ls [root@test ~]# sh test.sh -x 1.py 1.sh 2.txt file.txt test.sh user.txt user.txtn
5、shell执行方式
bash /check.sh 直接使用bash解释器去翻译这个文件中的内容
/check.sh 必须要有执行权限 ( #!/bin/bash ) 默认是bash
演示:
编辑一个test1.sh的文件 [root@test ~]# vim test1.sh
把#!bin/bash这一行去掉
接下来分别用bash和./来运行
[root@test ~]# bash test1.sh [root@test ~]# ./test1.sh
上面它提示权限不足。好,那我们就赋予它执行权限 [root@test ~]# chmod =x test1.sh [root@test ~]# ./test1.sh
可以执行,是因为脚本文件中不加开头的话,默认就是bash运行,如果我们改个开头呢? 这里我们以Python为例 [root@test ~]# vim test1.sh [root@test ~]# cat test1.sh #!/usr/bin/env python # ********************************************************** # * Author : oldzhang # * Email : 1224256589@qq.com # * Create time : 2021-06-21 07:29 # * Filename : test1.sh # * Description : xxxxxx # ********************************************************** echo "123"
#接下来我们用./来执行一下 [root@test ~]# ./test1.sh
6、shell变量
@ 1.什么是变量
变量是shell中传递数据的一种方法。
简单理解就是用一个固定的字符串去表示不固定的值,便于后续引用。
-----------------------------------------------------------------------------
@ 2.变量命名的书写规范
不允许:
1、数字开头 2、特殊字符开头 3、不能与系统命令冲突
允许:
1、开头最好是大写 2、最好是一个好记忆的名称 3、比如说我们想取出系统负载值 Load_ava_1 = $() Load_Ava_5 = Load_Ava_15 = Path = /backup
3.变量定义的几种方式:
3.1.用户自定义变量:人为定义变量名与变量的值。
例如: Load_ava_1 = $() 等号代表的是一个赋值的操作,等号的两边不能有空格
3.2.系统环境变量:保存的是和系统操作环境相关的数据,所有用户都可以使用。
例如: 需求: 脚本只能是root运行,非root拒绝运行 解决: 3.2.1.判断当前用户的uid是否为1 ,如果是 则运行, 如果不是0 则拒绝 if [ $UID -ne 0 ];then echo "请切换到root身份运行此脚本" exit fi echo "Done....." 3.2.2.判断当前用户是否为root, 如果是 则运行,如果不是root 则拒绝 if [ $USER != "root" ];then echo "请切换到root身份运行此脚本" exit fi echo "Done....."
4.位置参数变量:向脚本中进行参数传递(传参),变量名不能自定义,变量作用是固定的。
脚本内容
[root@oldzhang~]# cat test.sh #!/bin/bash echo "#当前she11 脚本的文件名: $0" echo "#第1个she11 脚本位置参数: $1" echo "#第2个she11脚本位置参数: $2" echo "#第3个she11 脚本位置参数: $3" echo "#所有传递的位置参数是: $*" echo "#所有传递的位置参数是: $@" echo "#总共传递的参数个数是: $#" echo "#当前程序运行的PID是: $$" echo “#表示上一个在后台运行的脚本的PID是:$! “ echo "#上一个命令执行的返回结果: $?"
4.1.使用场景
需求1:通过位置变量创建 Linux 系统账户及密码,执行 var1.sh username password
[root@m01-shell /server/scripts]# cat userpasswd.sh #!bin/bash useradd $1 echo "$2" | passwd --stdin $1
需求2:通过位置变量创建 Linux 系统账户及密码,执行 var1.sh username password,控制最多传递两个参数
[root@m01-shell /server/scripts]# cat userpd.sh #1.判断传递的参数是否为2,如果不是,则提示该脚本如何使用: if [ $# -ne 2 ];then echo "USAGE: $0 { Username && Password }" exit fi #2.如果符合条件,则会执行后续的创建操作 useradd $1 echo "$2" | passwd --stdin $1
需求3: 继需求2, 继续实现,脚本只能是root运行,非root拒绝运行:
分析:
借助系统的环境变量,来做判断:
USER: 用户名称的比对
UID: 用户的ID比对
条件:
如果UID为0,则运行脚本,否则拒绝运行
[root@m01-shell /server/scripts]# cat userpwd.sh #1.由于创建用户只能是root运行,所以判断执行者的身份 if [ $UID -ne 0 ];then # 如果UID不等于0 -ne 不等于的意思 echo "Please su - SuperMan Admin...." exit fi #2.判断传递的参数是否为2,如果不是,则提示该脚本如何使用: if [ $# -ne 2 ];then echo "USAGE: $0 { Username && Password }" exit fi #3.如果符合条件,则会执行后续的创建操作 useradd $1 echo "$2" | passwd --stdin $1
需求4: 做一个备份场景: 会传递两个参数: { 一个是源文件 一个是目标位置 } , 控制必须是两个,不可以是三个:
分析:
1.控制仅传递两个参数: $#
1.1) 两个参数: 继续往下执行
1.2) 超过两个参数: 提示脚本应该如何使用
2.执行备份操作:
cp -rp 源 目标
[root@m01-shell /server/scripts]# cat backup.sh #1.判断传递的参数: if [ $# -ne 2 ];then echo "USAGE: $0 { Source_File | Dest_File }" exit fi # 2.执行拷贝动作 cp -rpv $1 $2
7、变量赋值
1.变量赋值的方式read?
除了自定义变量,以及系统内置变量,还可以使用read命令通过交互式方式传递变
量。
read选项 | 选项含义 |
---|---|
-p | 打印信息 |
-t | 限定时间 |
-s | 不回显(不显示明文信息) |
-n | 指定字符个数 |
需求1:使用 read编写一个备份脚本,需要用户传递2个参数,源和目标。
[root@m01-shell /server/scripts]# cat read1.sh #!/bin/bash read -p "请输入需要备份的目录或文件: " sourc read -p "请输入目标地址: " dest echo "你要备份的是: " $sourc read -p "你确定要将 ${sourc} 被分到 ${dest} 吗? [ Y | N ]: " Action if [ $Action == "Y" ];then cp -rp ${sourc} ${dest} echo "备份完成" fi
需求2:使用read模拟Linux登陆页面
[root@m01-shell /server/scripts]# vim login.sh [root@m01-shell /server/scripts]# cat login.sh #!/bin/bash hostnamectl | awk -F ':' '/Operating/{ print $2 }' hostnamectl | awk '/Kernel/' | awk -F '[ :]+' '{ print $2,$4}' uname -m Oprating=$(hostnamectl | awk -F ': ' '/Operating/{ print $2 }') Kernel=$(hostnamectl | awk '/Kernel/' | awk -F '[ :]+' '{ print $2,$4}') Hostname=$(hostname) echo "$Oprating" echo "$Kernel on an $(uname -m)" echo "" read -p "$Hostname Login: " User read -s -p "Password: " Pass echo "" if [ $User == "root" -a $Pass == "123" ];then echo "欢迎 Root 归队..." else echo "用户或者密码错误...." fi
需求3:使用 read编写一个探测主机存活脚本,需要用户传递测试的IP地址。
分析:
ping -c1 10.0.0.1
0: 成功
1: 失败
[root@m01-shell /server/scripts]# cat testip.sh #!/bin/bash read -p "请输入你要探测的主机IP地址: " Ip ping -c1 -W1 $Ip &>/dev/null if [ $? -eq 0 ];then echo -e "\033[32m $Ip 通... \033[0m" else echo -e "\033[31m $Ip 不通... \033[0m" fi
需求4:使用read编写一个修改系统主机名称脚本。
分析:
1.打印下当前的主机名称是什么?
2.询问你要修改后的主机名称是什么?
3.确认一下: 是否要真的修改?
是:
调用hostnamectl命令修改
否:
[root@m01-shell /server/scripts]# vim name.sh [root@m01-shell /server/scripts]# cat name.sh #!/bin/bash Old_Hostname=$(hostname) echo "当前的主机名称是 ${Old_Hostname}" read -p "你要修改的主机名称是: " New_Hostname read -p "你确定要将 ${Old_Hostname} 修改为 ${New_Hostname} 吗? [ Y | N ]: " Action if [ $Action == "Y" ];then hostnamectl set-hostname ${New_Hostname} fi
8、shell变量替换
1.什么是变量替换?
简单来说,就是在不改变原有变量的情况下,对变量进行替换。
2.为什么要用变量替换?
比如:我们需要对某个变量的值进行整数比对,但变量的值是一个小数。 怎么办?我们
可以使用变量替换的方式,将小数位进行删除,然后在进行整数比对。
3.变量替换的几种方式:
变量 | 说明 |
---|---|
$ | 从头开始匹配,最短删除 |
$ | 从头开始匹配,最长删除 |
$ | 从尾开始匹配,最短删除 |
$ | 从尾开始匹配,最长删除 |
$ | 替换变量内的旧字符串为新字符串,只替换第一个 |
$ | 替换变量内的旧字符串为新字符串,全部替换 |
演示:
url=www.sina.com.cn [root@mananger variables]# echo ${url#*.} sina.com.cn [root@mananger variables]# echo ${url##*.} cn [root@mananger variables]# echo ${url%.*} www.sina.com [root@mananger variables]# echo ${url%%.*} www
需求:查看内存/当前使用状态,如果使用率超过80%则报警发邮件:
分析:
1.内存怎么看? free -m
2.如何提取百分比
3.如果有小数,需要变量替换
[root@m01-shell /server/scripts]# vim neicun.sh [root@m01-shell /server/scripts]# cat neicun.sh #!/bin/bash free_use=$(free -m | awk '/^Mem/ {print $3/$2*100}') if [ ${free_use%.*} -eq 80 ];then echo "发邮件..." echo "内存已经超过了百分之80,目前的内存使用率是 ${free_use}%" else echo "没有超过80% 正常状态" echo "目前内存已经使用 ${free_use}%" fi
需求: centos6.7 系统,centos7 的系统, 安装yum源:
分析:
1.获取当前系统的版本 6.7 7
2.判断比对
如果为6: 则安装6的源
如果为7: 则安装7的源
[root@m01-shell /server/scripts]# cat yum2.sh #!/bin/bash os_relase_version=$(awk '{print $(NF-1)}' /etc/redhat-release) if [ ${os_relase_version%%.*} -eq 7 ];then wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo fi if [ ${os_relase_version%%.*} -eq 6 ];then wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-6.repo fi
基于上面的需求在完善一下:
[root@m01-shell /server/scripts]# vim yum2.sh [root@m01-shell /server/scripts]# cat yum2.sh #!/bin/bash #centos6和centos7获取当前文件中的列不同 os_ver=`cat /etc/redhat-release |awk '{print $(NF-1)}'` if [ ${os_ver%%.*} -eq 7 ] then ping -c2 -W1 114.114.114.114 &>/dev/null if [ $? -ne 0 ];then echo "网络不通正在重启网络请稍后......" systemctl restart network ping -c2 -W1 114.114.114.114 &>/dev/null [ $? -ne 0 ] && echo "sendmail......管理员请尽快检查服务器的网络" fi if [ `rpm -qa wget|wc -l` -eq 0 ];then yum -y install wget &>/dev/null if [ $? -eq 0 ];then echo "wget 安装成功......." else echo "安装失败 检查网络或YUM源....." fi fi wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null if [ $? -eq 0 ];then echo "YUM源更新成功" else echo "YUM源更新不成功 可能是由于网络引起" fi elif [ ${os_ver%%.*} -eq 6 ] then wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-6.repo else echo "请检查您的系统版本" if [ $? -eq 0 ];then echo "YUM源更新成功" else echo "YUM源更新不成功 可能是由于网络引起" fi fi
需求:二级菜单
PHP MySQL Redis Nginx 每个服务有不同的版本
[root@m01-shell /server/scripts]# vim yum3.sh [root@m01-shell /server/scripts]# cat yum3.sh #!/bin/bash while true do echo "------------------------------SERVER安装列表-----------------------------" echo "| 1.INSTALL PHP |" echo "| 2.INSTALL MySQL |" echo "| 3.INSTALL Redis |" echo "| 4.INSTALL Nginx |" echo "| 5.退出当前脚本 |" echo "------------------------------SERVER安装列表-----------------------------" read -p "请输入你要安装服务的编号或者服务名称:[1|PHP|2|MySQL] " num if [ "$num" = "1" -o $num = "PHP" ];then echo "------------------------------PHP安装列表-----------------------------" echo "| 1.INSTALL PHP5.1 |" echo "| 2.INSTALL PHP5.2 |" echo "| 3.INSTALL PHP5.3 |" echo "| 4.INSTALL PHP5.4 |" echo "------------------------------PHP安装列表-----------------------------" read -p "请输入你要安装服务的编号或者版本号:[1|PHP|2|MySQL] " num1 if [ "$num1" = "1" -o "$num1" = "PHP5.1" ];then echo "安装YUM源......." sleep 2 echo "PHP5.1安装成功" elif [ "$num1" = "2" -o "$num1" = "PHP5.2" ];then echo "安装YUM源......." sleep 2 echo "PHP5.2安装成功" fi elif [ "$num" = "2" -o $num = "MySQL" ];then echo "------------------------------MySQL安装列表-----------------------------" echo "| 1.INSTALL MySQL5.4 |" echo "| 2.INSTALL MySQL8.0 |" echo "| 3.INSTALL MySQL8.1 |" echo "| 4.INSTALL MySQL8.2 |" echo "------------------------------MySQL安装列表-----------------------------" read -p "请输入你要安装服务的编号或者版本号:[1|PHP|2|MySQL] " num2 if [ "$num2" = "1" -o "$num2" = "MySQL5.4" ];then echo "安装YUM源......." sleep 2 echo "MySQL5.4安装成功" elif [ "$num2" = "2" -o "$num2" = "MySQL5.5" ];then echo "安装YUM源......." sleep 2 echo "MySQL5.5安装成功" fi elif [ "$num" = "5" ];then echo "欢迎下次再来再见!!!" exit fi done
需求:写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比语塞数字大或者小
[root@m01-shell /server/scripts]# cat caishuzi.sh #!/bin/bash num=`echo $((RANDOM%100+1))` i=1 #输入一个数值($num1) read -p "请输入一个整数:" num1 #while循环 while true;do #使用$num1和$num比较 if [ $num1 -gt $num ];then echo "这个数字太大了啊!" read -p "请输入一个整数:" num1 elif [ $num1 -lt $num ];then echo "您输入的数字太小。" #当$num1不等于$num的时候,提示用户重新输入$num1 read -p "请输入一个整数:" num1 else #当输入的$num1和$num相同时,输出"You WIN" echo "恭喜您答对了!" break fi #依次递增,当$num1和$num不相等时继续循环 let i++ done #输出你总共输出了多少($i)次 echo "您总数输入了 $i 次"
9、变量的整数运算
1.什么是变量运算?
其实就是我们以前学习过的加减乘除。
2.为什么要学习变量运算?
比如:当我们需要开发一个计算器的时候是不是就需要运算了?
3.变量运算使用什:么方式来实现?
通常整数运算有‘expr. []等方式,小数运算有bc、awk方式。
操作符 | 含义 |
---|---|
num1+num2 | 加 |
num1-num2 | 减 |
num1*num2 | 乘 |
num1/num2 | 除 |
num1%num2 | 余 |
需求:编写一个shell计算器
[root@m01-shell /server/scripts]# vim jisuanqi.sh [root@m01-shell /server/scripts]# cat jisuanqi.sh #!/bin/bash # 功能介绍 function echo_info() { echo " ----------------------------------" echo "|这是一个简单的整数计算器,biubiu |" echo " ----------------------------------" echo } # 接受参数 function accept_data(){ read -p "请输入第$1 个整数:" num expr $num + 0 &> /dev/null if [ $? -eq 0 ];then return 0 else return 1 fi } # 接受输入的操作 function operation(){ echo "-------------------" echo "| 1.加法 |" echo "| 2.减法 |" echo "| 3.乘法 |" echo "| 4.除法 |" echo "-------------------" read -p "请输入您想执行的操作:" choice expr $choice + 0 &> /dev/null if [ $? -eq 0 ];then if [ $choice -lt 5 -a $choice -ge 1 ];then return $choice else echo "输入超出范围" fi else echo "非法输入" fi } function func_menu(){ echo -e "继续:1 \n退出 2" read -p '输入选项:' inp_num if [ $inp_num -eq 1 ];then return 1 elif [ $inp_num -eq 2 ];then return 2 else return 3 fi } function judge(){ declare -A match=([1]="+" [2]="-" [3]='*' [4]="/") for i in ${!match[*]} do if [ $i -eq $3 ];then res=`echo "$1 ${match[$i]} $2" | bc ` echo "$1 ${match[$i]} $2 = $res" fi done } function main(){ while true do echo_info accept_data 1 if [ $? -eq 0 ];then num_1=$num accept_data 2 if [ $? -eq 0 ];then num_2=$num else echo "必须输入整数!" continue fi else echo "必须输入整数!" continue fi operation judge $num_1 $num_2 $? func_menu flag=$? if [ $flag -eq 2 ];then break elif [ $flag -eq 3 ];then echo '非法操作' func_menu elif [ $flag -eq 1 ];then echo '再次计算 !' fi done } main
需求:根据系统时间,打印今年和明年时间.。
根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:
分析:
1.打印系统时间: date
2.date + 1 = 明年
[root@m01-shell /server/scripts]# echo "今年是 $(date +%Y) , 明年是 $[ $(date +%Y) + 1 ]" 今年是 2021 , 明年是 2022
根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:
分析:
1.计算下从年初到现在已经过了多少天 ( date +%j )
\2. 天数 / 7 --> 过了多少周
\3. ( 365 - 天数 ) / 7 --> 还剩下多少周
[root@m01-shell /server/scripts]# vim time.sh [root@m01-shell /server/scripts]# cat time.sh #!/bin/bash Day=$(date +%j) echo "从年初到现在已经过了多少天 $Day" echo "距离新年还剩下多少天: $[ 366 - ${Day} ]" echo "从年初到现在已经过了多少周: $[ ${Day} / 7 ]" echo "距离新年还有多少周: $[ (366 - ${Day}) / 7 ]"
本文来自博客园,作者:kirin(麒麟),转载请注明原文链接:https://www.cnblogs.com/kirin365/articles/16137652.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)