Tips
Go
(18条消息) Go语言自学系列 | golang包_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之channel的遍历_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之select switch_COCOgsta的博客-CSDN博客_golang select switch
(18条消息) Go语言自学系列 | golang并发编程之runtime包_COCOgsta的博客-CSDN博客_golang runtime包
(18条消息) Go语言自学系列 | golang接口值类型接收者和指针类型接收者_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之Timer_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang方法_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之WaitGroup实现同步_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang构造函数_COCOgsta的博客-CSDN博客_golang 构造函数
(18条消息) Go语言自学系列 | golang方法接收者类型_COCOgsta的博客-CSDN博客_golang 方法接收者
(18条消息) Go语言自学系列 | golang接口_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang接口和类型的关系_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang结构体_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang结构体_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang标准库os模块 - File文件读操作_COCOgsta的博客-CSDN博客_golang os.file
(18条消息) Go语言自学系列 | golang继承_COCOgsta的博客-CSDN博客_golang 继承
(18条消息) Go语言自学系列 | golang嵌套结构体_COCOgsta的博客-CSDN博客_golang 结构体嵌套
(18条消息) Go语言自学系列 | golang并发编程之Mutex互斥锁实现同步_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发变成之通道channel_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之原子操作详解_COCOgsta的博客-CSDN博客_golang 原子操作
(18条消息) Go语言自学系列 | golang并发编程之原子变量的引入_COCOgsta的博客-CSDN博客_go 原子变量
(18条消息) Go语言自学系列 | golang并发编程之协程_COCOgsta的博客-CSDN博客_golang 协程 并发
(18条消息) Go语言自学系列 | golang接口嵌套_COCOgsta的博客-CSDN博客_golang 接口嵌套
(18条消息) Go语言自学系列 | golang包管理工具go module_COCOgsta的博客-CSDN博客_golang 包管理器
(18条消息) Go语言自学系列 | golang标准库os模块 - File文件写操作_COCOgsta的博客-CSDN博客_go os模块
(18条消息) Go语言自学系列 | golang结构体的初始化_COCOgsta的博客-CSDN博客_golang 结构体初始化
(18条消息) Go语言自学系列 | golang通过接口实现OCP设计原则_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang标准库os包进程相关操作_COCOgsta的博客-CSDN博客_golang os包
(18条消息) Go语言自学系列 | golang标准库ioutil包_COCOgsta的博客-CSDN博客_golang ioutil
(18条消息) Go语言自学系列 | golang标准库os模块 - 文件目录相关_COCOgsta的博客-CSDN博客_go语言os库
Golang技术栈,Golang文章、教程、视频分享!
(18条消息) Go语言自学系列 | golang结构体指针_COCOgsta的博客-CSDN博客_golang 结构体指针
Ansible
太厉害了,终于有人能把Ansible讲的明明白白了,建议收藏_互联网老辛
ansible.cfg配置详解
Docker
Docker部署
linux安装docker和Docker Compose
linux 安装 docker
Docker中安装Docker遇到的问题处理
Docker常用命令
docker常用命令小结
docker 彻底卸载
Docker pull 时报错:Get https://registry-1.docker.io/v2/library/mysql: net/http: TLS handshake timeout
Docker 拉镜像无法访问 registry-x.docker.io 问题(Centos7)
docker 容器内没有权限
Linux中关闭selinux的方法是什么?
docker run 生成 docker-compose
Docker覆盖网络部署
docker pull后台拉取镜像
docker hub
Redis
Redis 集群别乱搭,这才是正确的姿势
linux_离线_redis安装
怎么实现Redis的高可用?(主从、哨兵、集群) - 雨点的名字 - 博客园
redis集群离线安装
always-show-logo yes
Redis集群搭建及原理
[ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some - 亲爱的不二999 - 博客园
Redis daemonize介绍
redis 下载地址
Redis的redis.conf配置注释详解(三) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(一) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(二) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(四) - 云+社区 - 腾讯云
Linux
在终端连接ssh的断开关闭退出的方法
漏洞扫描 - 灰信网(软件开发博客聚合)
find 命令的参数详解
vim 编辑器搜索功能
非root安装rpm时,mockbuild does not exist
Using a SSH password instead of a key is not possible because Host Key checking
(9条消息) 安全扫描5353端口mDNS服务漏洞问题_NamiJava的博客-CSDN博客_5353端口
Linux中使用rpm命令安装rpm包
ssh-copy-id非22端口的使用方法
How To Resolve SSH Weak Key Exchange Algorithms on CentOS7 or RHEL7 - infotechys.com
Linux cp 命令
yum 下载全量依赖 rpm 包及离线安装(终极解决方案) - 叨叨软件测试 - 博客园
How To Resolve SSH Weak Key Exchange Algorithms on CentOS7 or RHEL7 - infotechys.com
RPM zlib 下载地址
运维架构网站
欢迎来到 Jinja2
/usr/local/bin/ss-server -uv -c /etc/shadowsocks-libev/config.json -f /var/run/s
ruby 安装Openssl 默认安装位置
Linux 常用命令学习 | 菜鸟教程
linux 重命名文件和文件夹
linux命令快速指南
ipvsadm
Linux 下查找日志中的关键字
Linux 切割大 log 日志
CentOS7 关于网络的设置
rsync 命令_Linux rsync 命令用法详解:远程数据同步工具
linux 可视化界面安装
[问题已处理]-执行yum卡住无响应
GCC/G++升级高版本
ELK
Docker部署ELK
ELK+kafka+filebeat+Prometheus+Grafana - SegmentFault 思否
(9条消息) Elasticsearch设置账号密码_huas_xq的博客-CSDN博客_elasticsearch设置密码
Elasticsearch 7.X 性能优化
Elasticsearch-滚动更新
Elasticsearch 的内存优化_大数据系统
Elasticsearch之yml配置文件
ES 索引为Yellow状态
Logstash:Grok filter 入门
logstash grok 多项匹配
Mysql
Mysql相关Tip
基于ShardingJDBC实现数据库读写分离 - 墨天轮
MySQL-MHA高可用方案
京东三面:我要查询千万级数据量的表,怎么操作?
OpenStack
(16条消息) openstack项目中遇到的各种问题总结 其二(云主机迁移、ceph及扩展分区)_weixin_34104341的博客-CSDN博客
OpenStack组件介绍
百度大佬OpenStack流程
openstack各组件介绍
OpenStack生产实际问题总结(一)
OpenStack Train版离线部署
使用Packstack搭建OpenStack
K8S
K8S部署
K8S 集群部署
kubeadm 重新 init 和 join-pudn.com
Kubernetes 实战总结 - 阿里云 ECS 自建 K8S 集群 Kubernetes 实战总结 - 自定义 Prometheus
【K8S实战系列-清理篇1】k8s docker 删除没用的资源
Flannel Pod Bug汇总
Java
Jdk 部署
JDK部署
java线程池ThreadPoolExecutor类使用详解 - bigfan - 博客园
ShardingJDBC实现多数据库节点分库分表 - 墨天轮
Maven Repository: Search/Browse/Explore
其他
Git在阿里,我们如何管理代码分支?
chrome F12调试网页出现Paused in debugger
体验IntelliJ IDEA的远程开发(Remote Development) - 掘金
Idea远程调试
PDF转MD
强哥分享干货
优秀开源项目集合
vercel 配合Github 搭建项目Doc门户
如何用 Github Issues 写技术博客?
Idea 2021.3 Maven 3.8.1 报错 Blocked mirror for repositories 解决
列出maven依赖
[2022-09 持续更新] 谷歌 google 镜像 / Sci-Hub 可用网址 / Github 镜像可用网址总结
阿里云ECS迁移
linux访问github
一文教你使用 Docker 启动并安装 Nacos-腾讯云开发者社区-腾讯云
Nginx
Nginx 部署
Nginx 部署安装
Nginx反向代理cookie丢失的问题_longzhoufeng的博客-CSDN博客_nginx 代理后cookie丢失
Linux 系统 Https 证书生成与Nginx配置 https
数据仓库
实时数仓
松果出行 x StarRocks:实时数仓新范式的实践之路
实时数据仓库的一些分层和分层需要处理的事情,以及数据流向
湖仓一体电商项目
湖仓一体电商项目(一):项目背景和架构介绍
湖仓一体电商项目(二):项目使用技术及版本和基础环境准备
湖仓一体电商项目(三):3万字带你从头开始搭建12个大数据项目基础组件
数仓笔记
数仓学习总结
数仓常用平台和框架
数仓学习笔记
数仓技术选型
尚硅谷教程
尚硅谷学习笔记
尚硅谷所有已知的课件资料
尚硅谷大数据项目之尚品汇(11数据质量管理V4.0)
尚硅谷大数据项目之尚品汇(10元数据管理AtlasV4.0)
尚硅谷大数据项目之尚品汇(9权限管理RangerV4.0)
尚硅谷大数据项目之尚品汇(8安全环境实战V4.0)
尚硅谷大数据项目之尚品汇(7用户认证KerberosV4.1)
尚硅谷大数据项目之尚品汇(6集群监控ZabbixV4.1)
尚硅谷大数据项目之尚品汇(5即席查询PrestoKylinV4.0)
尚硅谷大数据项目之尚品汇(4可视化报表SupersetV4.0)
尚硅谷大数据项目之尚品汇(3数据仓库系统)V4.2.0
尚硅谷大数据项目之尚品汇(2业务数据采集平台)V4.1.0
尚硅谷大数据项目之尚品汇(1用户行为采集平台)V4.1.0
数仓治理
数据中台 元数据规范
数据中台的那些 “经验与陷阱”
2万字详解数据仓库数据指标数据治理体系建设方法论
数据仓库,为什么需要分层建设和管理? | 人人都是产品经理
网易数帆数据治理演进
数仓技术
一文看懂大数据生态圈完整知识体系
阿里云—升舱 - 数据仓库升级白皮书
最全企业级数仓建设迭代版(4W字建议收藏)
基于Hue,Dolphinscheduler,HIVE分析数据仓库层级实现及项目需求案例实践分析
详解数据仓库分层架构
数据仓库技术细节
大数据平台组件介绍
总览 2016-2021 年全球机器学习、人工智能和大数据行业技术地图
Apache DolphinScheduler 3.0.0 正式版发布!
数据仓库面试题——介绍下数据仓库
数据仓库为什么要分层,各层的作用是什么
Databend v0.8 发布,基于 Rust 开发的现代化云数据仓库 - OSCHINA - 中文开源技术交流社区
数据中台
数据中台设计
大数据同步工具之 FlinkCDC/Canal/Debezium 对比
有数数据开发平台文档
Shell
Linux Shell 命令参数
shell 脚本编程
一篇教会你写 90% 的 Shell 脚本
Kibana
Kibana 查询语言(KQL)
Kibana:在 Kibana 中的四种表格制作方式
Kafka
Kafka部署
canal 动态监控 Mysql,将 binlog 日志解析后,把采集到的数据发送到 Kafka
OpenApi
OpenAPI 标准规范,了解一下?
OpenApi学术论文
贵阳市政府数据开放平台设计与实现
OpenAPI简介
开放平台:运营模式与技术架构研究综述
管理
技术部门Leader是不是一定要技术大牛担任?
华为管理体系流程介绍
DevOps
*Ops
XOps 已经成为一个流行的术语 - 它是什么?
Practical Linux DevOps
Jenkins 2.x实践指南 (翟志军)
Jenkins 2权威指南 ((美)布伦特·莱斯特(Brent Laster)
DevOps组件高可用的思路
KeepAlived
VIP + KEEPALIVED + LVS 遇到Connection Peer的问题的解决
MinIO
MinIO部署
Minio 分布式集群搭建部署
Minio 入门系列【16】Minio 分片上传文件 putObject 接口流程源码分析
MinioAPI 浅入及问题
部署 minio 兼容 aws S3 模式
超详细分布式对象存储 MinIO 实战教程
Hadoop
Hadoop 部署
Hadoop集群部署
windows 搭建 hadoop 环境(解决 HADOOP_HOME and hadoop.home.dir are unset
Hadoop 集群搭建和简单应用(参考下文)
Hadoop 启动 NameNode 报错 ERROR: Cannot set priority of namenode process 2639
jps 命令查看 DataNode 进程不见了 (hadoop3.0 亲测可用)
hadoop 报错: Operation category READ is not supported in state standby
Spark
Spark 部署
Spark 集群部署
spark 心跳超时分析 Cannot receive any reply in 120 seconds
Spark学习笔记
apache spark - Failed to find data source: parquet, when building with sbt assembly
Spark Thrift Server 架构和原理介绍
InLong
InLong 部署
Apache InLong部署文档
安装部署 - Docker 部署 - 《Apache InLong v1.2 中文文档》 - 书栈网 · BookStack
基于 Apache Flink SQL 的 InLong Sort ETL 方案解析
关于 Apache Pulsar 在 Apache InLong 接入数据
zookeeper
zookeeper 部署
使用 Docker 搭建 Zookeeper 集群
美团技术团队
StarRocks
StarRocks技术白皮书(在线版)
JuiceFS
AI 场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
JuiceFS format
元数据备份和恢复 | JuiceFS Document Center
JuiceFS 元数据引擎选型指南
Apache Hudi 使用文件聚类功能 (Clustering) 解决小文件过多的问题
普罗米修斯
k8s 之 Prometheus(普罗米修斯)监控,简单梳理下 K8S 监控流程
k8s 部署 - 使用helm3部署监控prometheus(普罗米修斯),从零到有,一文搞定
k8s 部署 - 使用 helm3 部署监控 prometheus(普罗米修斯),从零到有,一文搞定
k8s 部署 - 如何完善 k8s 中 Prometheus(普罗米修斯)监控项目呢?
k8s 部署 - k8s 中 Prometheus(普罗米修斯)的大屏展示 Grafana + 监控报警
zabbix
一文带你掌握 Zabbix 监控系统
Stream Collectors
Nvidia
Nvidia API
CUDA Nvidia驱动安装
NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
ubuntu 20 CUDA12.1安装流程
nvidia开启持久化模式
nvidia-smi 开启持久化
Harbor
Harbor部署文档
Docker 爆出 it doesn't contain any IP SANs
pandoc
其他知识
大模型
COS 597G (Fall 2022): Understanding Large Language Models
如何优雅的使用各类LLM
ChatGLM3在线搜索功能升级
当ChatGLM3能用搜索引擎时
OCR神器,PDF、数学公式都能转
Stable Diffusion 动画animatediff-cli-prompt-travel
基于ERNIE Bot自定义虚拟数字人生成
pika负面提示词
开通GPT4的方式
GPT4网站
低价开通GPT Plus
大模型应用场景分享
AppAgent AutoGPT变体
机器学习
最大似然估计
权衡偏差(Bias)和方差(Variance)以最小化均方误差(Mean Squared Error, MSE)
伯努利分布
方差计算公式
均值的高斯分布估计
没有免费午餐定理
贝叶斯误差
非参数模型
最近邻回归
表示容量
最优容量
权重衰减
正则化项
Sora
Sora官方提示词
看完32篇论文,你大概就知道Sora如何炼成? |【经纬低调出品】
Sora论文
Sora 物理悖谬的几何解释
Sora 技术栈讨论
RAG垂直落地
DB-GPT与TeleChat-7B搭建相关RAG知识库
ChatWithRTX
ChatRTX安装教程
ChatWithRTX 踩坑记录
ChatWithRTX 使用其他量化模型
ChatWithRTX介绍
RAG 相关资料
英伟达—大模型结合 RAG 构建客服场景自动问答
又一大模型技术开源!有道自研RAG引擎QAnything正式开放下载
收藏!RAG入门参考资料开源大总结:RAG综述、介绍、比较、预处理、RAG Embedding等
RAG调研
解决现代RAG实际生产问题
解决现代 RAG 系统中的生产问题-II
Modular RAG and RAG Flow: Part Ⅰ
Modular RAG and RAG Flow: Part II
先进的Retriever技术来增强你的RAGs
高级RAG — 使用假设文档嵌入 (HyDE) 改进检索
提升 RAG:选择最佳嵌入和 Reranker 模型
LangGraph
增强型RAG:re-rank
LightRAG:使用 PyTorch 为 LLM 应用程序提供支持
模型训练
GPU相关资料
[教程] conda安装简明教程(基于miniconda和Windows)
PyTorch CUDA对应版本 | PyTorch
资料
李一舟课程全集
零碎资料
苹果各服共享ID
数据中心网络技术概览
华为大模型训练学习笔记
百度AIGC工程师认证考试答案(可换取工信部证书)
百度智能云生成式AI认证工程师 考试和证书查询指南
深入理解 Megatron-LM(1)基础知识
QAnything
接入QAnything的AI问答知识库,可私有化部署的企业级WIKI知识库
wsl --update失效Error code: Wsl/UpdatePackage/0x80240438的解决办法
Docker Desktop 启动docker engine一直转圈解决方法
win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present
WSL虚拟磁盘过大,ext4迁移 Windows 中创建软链接和硬链接
WSL2切换默认的Linux子系统
Windows的WSL子系统,自动开启sshd服务
新版docker desktop设置wsl(使用windown的子系统)
WSL 开启ssh
Windows安装网易开源QAnything打造智能客服系统
芯片
国内互联网大厂自研芯片梳理
超算平台—算力供应商
Linux 磁盘扩容
Linux使用growpart工具进行磁盘热扩容(非LVM扩容方式)
关于centos7 扩容提示no tools available to resize disk with 'gpt' - o夜雨随风o - 博客园
(小插曲)neo4j配置apoc插件后检查版本发现:Unknown function ‘apoc.version‘ “EXPLAIN RETURN apoc.version()“
vfio-pci与igb_uio映射硬件资源到DPDK的流程分析
KubeVirt
vnc server配置、启动、重启与连接 - 王约翰 - 博客园
虚拟机Bug解决方案
kubevirt 如何通过CDI上传镜像文件
在 K8S 上也能跑 VM!KubeVirt 簡介與建立(部署篇) | Cloud Solutions
KubeVirt 04:容器化数据导入 – 小菜园
Python
安装 flash_attn
手把手教你在linux上安装pytorch与cuda
AI
在启智社区基于PyTorch运行国产算力卡的模型训练实验
Scaling law
免费的GPT3.5 API
AI Engineer Roadmap & Resources 🤖
模型排行
edk2
K8S删除Evicted状态的pod
docker 中启动 docker
远程本地多用户桌面1.17(一种不让电脑跟你抢键鼠的思路) - 哔哩哔哩
-
+
首页
一篇教会你写 90% 的 Shell 脚本
shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。 shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。 shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。 **那么什么是shell脚本呢?** shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。 shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。 注释 “# ”开头的就是注释,被编译器忽略 变量 **变量类型** 运行shell时,会同时存在三种变量: 1. 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 2. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 3. shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行 **变量操作** - 创建普通变量: name="test" (=两边不可有空格) - 创建只可函数体中使用的局部变量: local name="test" (使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用) - 使用变量: echo $name 或者 echo ${name} (推荐使用大括号版) - 变量重新赋值: name="new\_test" (将原值覆盖) - 只读变量: name="only\_read" -> readonly name (使用readonly标识后的变量,不可被修改) - 删除变量: unset name; (删除之后不可访问,删除不掉只读变量) **字符串变量** 1)单引号 - 单引号变量var='test' ,只能原样输出,变量无效 - 单引号中不能出现一个单独的单引号,转义也不可以 2)双引号 - 双引号变量var="my name is ${name}",变量有效 - 可出现转义符 3)拼接字符串 - 中间无任何+,之类的字符 - name="this is"" my name"; name="this is my name"; name="this" is "my name" 等效 - name='this is'' my nam'; name='this is my name'; name='this' is 'my name' 等效 4)获取字符串长度 - 在${}中使用“#”获取长度 - name="test"; - echo ${#name}; # 输出为4 5)提取子字符串 - 1:4 从第2个开始 往后截取4个字符 - ::4 从第一个字符开始 往后截取4个字符 - name="this is my name"; - echo ${name:1:4} #输出 is i - echo ${name::4} #输出 this **数组** bash只支持一维数组,不支持多维数组 - 定义数组:array\_name=(li wang xiang zhang) (小括号做边界、使用空格分离) - 单独定义数组的元素: array\_para\[0\]="w"; array\_para\[3\]="s" (定义时下标不连续也可以) - 赋值数组元素:array\_name\[0\]="zhao"; - 获取数组元素: - array\_name\[0\]="li" - array\_name\[3\]="zhang" - echo ${array\_name\[0\]} # 输出"li" - echo ${array\_name\[1\]} # 输出" " - echo ${array\_name\[3\]} # 输出"zhang" - echo ${array\_name\[@\]} # 输出"li zhang" 输出数组所有元素,没有元素的下标省略 - 取得元素个数:${#array\_name\[@\]} 或者 ${#array\_name - 取得单个元素长度:${#array\_name\[1\]} 参数传递 - 获取参数值: - $0 : 固定,代表执行的文件名 - $1 : 代表传入的第1个参数 - $n : 代表传入的第n个参数 - \\$#:参数个数 - \\$\*: 以一个单字符串显示所有向脚本传递的参数。如"$\*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数 - \\$@:与$\*相同,但是使用时加引号,并在引号中返回每个参数。 - \\$\\$:脚本运行的当前进程号 - \\$!:后台运行的最后一个进程的ID - \\$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 - \\$\* 与 $@ 区别 - 相同点:都是引用所有参数。 - 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " \* " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。 运算符 **算数运算** - \+ 、-、\*、\\ : 乘号前必须加\\进行转义才可以进行乘法运算 - 加法运算 - val=\`expr 2 + 2\` (使用linux命令expr进行辅助运算) - val=$\[2+2\] (4个空格不是必要的,不同于条件判断) - val=$((2+2)) **数字关系运算符** 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 下面假定变量 a 为 10,变量 b 为 20 - \-eq :检测两个数是否相等,相等返回 true。 \[ $a -eq $b \] 返回 false。 - \-ne: 检测两个数是否不相等,不相等返回 true。 \[ $a -ne $b \] 返回 true。 - \-gt: 检测左边的数是否大于右边的,如果是,则返回 true。 \[ $a -gt $b \] 返回 false。 - \-lt : 检测左边的数是否小于右边的,如果是,则返回 true。 \[ $a -lt $b \] 返回 true。 - \-ge: 检测左边的数是否大于等于右边的,如果是,则返回 true。 \[ $a -ge $b \] 返回 false。 - \-le : 检测左边的数是否小于等于右边的,如果是,则返回 true。 \[ $a -le $b \] 返回 true。 **字符串运算符** 下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg": - \= :检测两个字符串是否相等,相等返回 true。 \[ $a = $b \] 返回 false。 - != :检测两个字符串是否相等,不相等返回 true。 \[ $a != $b \] 返回 true。 - \-z :检测字符串长度是否为0,为0返回 true。 \[ -z $a \] 返回 false。 - \-n :检测字符串长度是否为0,不为0返回 true。 \[ -n "$a" \] 返回 true。 - $ :检测字符串是否为空,不为空返回 true。 \[ $a \] 返回 true。 **布尔运算符** 下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20: - ! :非运算,表达式为 true 则返回 false,否则返回 true。 \[ ! false \] 返回 true。 - \-o :或运算,有一个表达式为 true 则返回 true。 \[ $a -lt 20 -o $b -gt 100 \] 返回 true。 - \-a :与运算,两个表达式都为 true 才返回 true。 \[ $a -lt 20 -a $b -gt 100 \] 返回 false。 **逻辑运算符** 以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20: - && :逻辑的 AND \[\[ $a -lt 100 && $b -gt 100 \]\] 返回 false - || :逻辑的 OR \[\[ $a -lt 100 || $b -gt 100 \]\] 返回 true **文件运算符** - \-b file :检测文件是否是块设备文件,如果是,则返回 true。 \[ -b $file \] 返回 false。 - \-c file :检测文件是否是字符设备文件,如果是,则返回 true。 \[ -c $file \] 返回 false。 - \-d file :检测文件是否是目录,如果是,则返回 true。 \[ -d $file \] 返回 false。 - \-f file :检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 \[ -f $file \] 返回 true。 - \-g file :检测文件是否设置了 SGID 位,如果是,则返回 true。 \[ -g $file \] 返回 false。 - \-k file :检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 \[ -k $file \] 返回 false。 - \-p file :检测文件是否是有名管道,如果是,则返回 true。 \[ -p $file \] 返回 false。 - \-u file :检测文件是否设置了 SUID 位,如果是,则返回 true。 \[ -u $file \] 返回 false。 - \-r file :检测文件是否可读,如果是,则返回 true。 \[ -r $file \] 返回 true。 - \-w file :检测文件是否可写,如果是,则返回 true。 \[ -w $file \] 返回 true。 - \-x file :检测文件是否可执行,如果是,则返回 true。 \[ -x $file \] 返回 true。 - \-s file :检测文件是否为空(文件大小是否大于0),不为空返回 true。 \[ -s $file \] 返回 true。 - \-e file :检测文件(包括目录)是否存在,如果是,则返回 true。 \[ -e $file \] 返回 true。 执行相关 **命令替换** 命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。 执行命令: 1. \`ls /etc\` : 反引号 (所有的unix系统都支持) 2. $(ls /etc) : $+() (部分unix系统不支持) 多个嵌套使用时,从内向外执行for file in \\s /etc\\ 或 for file in $(ls /etc) 循环中使用 \`dirname \\$0\` 获取脚本文件所在的目录 path=$(cd \`dirname $0\`;pwd) : 获取脚本当前所在目录,并且执行cd命令到达该目录,使用pwd获取路径并赋值到path变量 **算术运算** 1. $\[ \] : 加减乘除,不必添加空格 2. $(( )) :加减乘除等,不必添加空格 **逻辑判断** 1. \[ \] : 中括号旁边和运算符两边必须添加空格 (可以使用,不推荐) 2. \[\[ \]\]:中括号旁边和运算符两边必须添加空格 (字符串验证时,推荐使用) 3. (()) : 中括号旁边和运算符两边必须添加空格 (数字验证时,推荐使用) 4. \[\[\]\] 和 (()) 分别是\[ \]的针对数学比较表达式和字符串表达式的加强版。 5. 使用\[\[ ... \]\]条件判断结构,而不是\[ ... \],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于\[\[ \]\]条件判断结构中,但是如果出现在\[ \]结构中的话,会报错。比如可以直接使用if \[\[ $a != 1 && $a != 2 \]\], 如果不适用双括号, 则为if \[ $a -ne 1\] && \[ $a != 2 \]或者if \[ $a -ne 1 -a $a != 2 \]。 \[\[ \]\]中增加模式匹配特效; (( ))不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号 ![](http://47.98.208.51:10086/media/202207/2022-07-24_231421_5391070.06998794630833383.jpeg) 输出 **echo** 仅用于字符串的输出,没有使用printf作为输出的移植性好,建议使用printf **printf** printf 不会像 echo 自动添加换行符,我们可以手动添加 \\n - 格式:printf format-string \[arguments...\] 其中(format-string: 格式控制字符串、arguments: 参数列表) - 案例:printf "%-10s %-8s %-4.2f\\n" 郭靖 男 66.1234 - %s %c %d %f 都是格式替代符 - d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错! - s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错 - c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错 - f:Float 浮点 对应位置参数必须是数字型 否则报错 - %-10s : 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。 - %-4.2f :指格式化为小数,宽度为4个字符,其中.2指保留2位小数。 - 转义符: - \\a :警告字符,通常为ASCII的BEL字符 - \\b :后退 - \\c :抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 - \\f :换页(formfeed) - \\n :换行 - \\r :回车(Carriage return) - \\t :水平制表符 - \\v :垂直制表符 - \\ :一个字面上的反斜杠字符 - \\ddd :表示1到3位数八进制值的字符。仅在格式字符串中有效 - \\0ddd :表示1到3位的八进制值字符 流程控制 和Java、PHP等语言不一样,sh的流程控制不可为空,即if或者else的大括号中无任何语句 **if else** - ifif condition then command1 command2 ... commandN fi - if elseif condition then command1 command2 ... commandN else command fi - if else-if elseif condition1 then command1 elif condition2 then command2 else commandN fi **for** for var in item1 item2 ... itemN do command1 command2 ... commandN done **while** - while conditionwhile condition do command done - while 无限循环while : do command done **until** until 循环执行一系列命令直至条件为 true 时停止。 until 循环与 while 循环在处理方式上刚好相反。 until condition do command done **case** Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。 case需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break,其中“;;”不是跳出循环,是不在去匹配下面的模式 case语句格式如下: case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac **跳出循环** 1. break :跳出总循环 2. continue:跳出当前循环,继续下一次循环 定义函数 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。 - **函数定义** \[ function \] funname() { action; \[return int;\] } - **参数传递** - 调用函数: fun\_name 2 3 4 - 函数中使用:和shell取用函数相同 $n $# $\* $? 或者加上{}funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $\* !"} funWithParam 1 2 3 4 5 6 7 8 9 34 73 echo $? \\# 判断执行是否成功 - **函数返回值** - return字样可存在也可不存在 - return 只能为 return \[0-255\],此处的返回可作为函数执行的状态,通过$?获取的便是这个返回值 - 如果不加return , 则默认最后一条语句的执行状态所为函数执行状态的返回值,如果最后一条语句执行成功,则$?为0,否则不为0 - **使用函数返回值** (Janusgraph图数据库官方启动服务脚本片段) - return返回的数字,只是作为函数执行状态的返回值,也就是接下来$?获取的值 - 对于类似于下面的BIN=\\abs\_path\`\`语句,获取的是函数体内所有的echo、printf输出 组合成的一个字符串 abs\_path() { SOURCE="${BASH\_SOURCE\[0\]}" while \[ -h "$SOURCE" \]; do DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" SOURCE="$(readlink "$SOURCE")" \[\[ $SOURCE != /\* \]\] && SOURCE="$DIR/$SOURCE" done echo "test" echo "$( cd -P "$( dirname "$SOURCE" )" && pwd )" **#** 此函数的两个echo输出会组合成一个字符串作为下述BIN的值 } BIN=abs\_path # BIN赋值函数返回值,如果没有return,则函数中所有的echo、printf输出组合成一个字符串传入BIN path=${BIN}/nodetool # 可直接使用 1. \#### 输入输出重定向 2. 一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件: 3. \* 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。 4. \* 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。 5. \* 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。 6. 默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。 7. 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null: 8. \*\*输入重定向\*\* 9. 1\. bash.sh < file : 将脚本的输入重定向到file,由file提供参数 10. \*\*输出重定向\*\* 11. 1\. bash.sh > file : 将脚本的输出数据重定向到file中,覆盖数据 12. 2\. bash.sh >> file : 将脚本的输出数据重定向到file中,追加数据 13. 3\. command >> file 2>&1 : 将 stdout 和 stderr 合并后重定向到 file 14. \#### 读取外部输入 15. 命令:\`read arg\` (脚本读取外部输入并赋值到变量上) 16. 在shell脚本执行到上述命令时,停止脚本执行并等待外部输入,将外部输入赋值到arg变量上,继续执行脚本 17. \#### 文件引用 18. 引用其他的文件之后,可以使用其变量、函数等等,相当于将引用的文件包含进了当前文件 19. 两种方式: 20. 1\. \*\*.\*\* file\_path\\file\_name 21. 2\. \*\*source\*\* file\_path\\file\_name 22. \#### 颜色标识 23. \`\`\`shell 24. printf "\\033\[32m SUCCESS: yay \\033\[0m\\n"; 25. printf "\\033\[33m WARNING: hmm \\033\[0m\\n"; 26. printf "\\033\[31m ERROR: fubar \\033\[0m\\n"; 输出结果: ![](http://47.98.208.51:10086/media/202207/2022-07-24_231421_5325650.3421219415948765.jpeg) 长句换行 在shell中为避免一个语句过长,可以使用“\\”进行换行 使用“\\”换行,在脚本执行过程中还是当做一行一个语句执行,不同于enter直接换行 注意:\\ 前添加一个空格 。 \\ 后无空格直接换行。 shell操作mysql 下面案例为登录mysql,并选择操作数据库,之后进行导入数据 /mysql/mysql/bin/mysql \\ -h test\_host -P 000 \\ -u test\_user -ptest\_password \\ -e"use test\_database; source data\_faile; " # -e 代表执行sql语句 \-u 用户名 \-p 用户密码 \-h 服务器ip地址 \-D 连接的数据库 \-N 不输出列信息 \-B 使用tab键 代替 分隔符 \-e 执行的SQL语句 退出脚本命令:exit 在退出脚本时使用不同的错误码,这样可以根据错误码来判断发生了什么错误。 在绝大多数 shell 脚本中,exit 0 表示执行成功,exit 1 表示发生错误。 命令:set -e 或者 set +e set -e表示从当前位置开始,如果出现任何错误都将触发exit。相反,set +e表示不管出现任何错误继续执行脚本。 如果脚本是有状态的(每个后续步骤都依赖前一个步骤),那么请使用set -e,在脚本出现错误时立即退出脚本。 shell脚本调试 检查是否有语法错误-n: bash -n script\_name.sh 使用下面的命令来执行并调试 Shell 脚本-x: bash -x script\_name.sh **调试count\_odd\_number.sh 程序案例:** 1. #!/usr/bin.env bash 2. \# 用于计算数组中奇数的和 3. \# @author liyangyang 4. \# @time 2019/09/17 5. sum=0 6. for num in 1 2 3 4;do 7. re=${num}%2 8. if (( ${re} == 1 ));then 9. sum=$\[${sum}+${num}\] 10. fi 11. done 12. echo ${sum} 1. 首先检查有无语法错误: bash -n count\_odd\_number.sh 2. 没有输出,说明没有错误,开始实际调试: bash -x count\_odd\_number.sh 3. 调试结果如下: 1. \+ sum=0 2. \+ for num in 1 2 3 4 3. \+ re=1%2 4. \+ (( 1%2 == 1 )) 5. \+ sum=1 6. \+ for num in 1 2 3 4 7. \+ re=2%2 8. \+ (( 2%2 == 1 )) 9. \+ for num in 1 2 3 4 10. \+ re=3%2 11. \+ (( 3%2 == 1 )) 12. \+ sum=4 13. \+ for num in 1 2 3 4 14. \+ re=4%2 15. \+ (( 4%2 == 1 )) 16. \+ echo 4 1. 其中的输出显示了程序执行的每一步,通过观察程序执行的步骤是否满足预期从而达到调试的效果 带有 + 表示的是 Shell 调试器的输出,不带 + 表示程序的输出。 案例: 这是es(ElasticSearch)官方启动服务的脚本,看可不可以理解吧~ 1. #!/usr/bin/env bash 2. \# CONTROLLING STARTUP: 3. \# This script relies on a few environment variables to determine startup 4. \# behavior, those variables are: 5. \# ES\_PATH\_CONF -- Path to config directory 6. \# ES\_JAVA\_OPTS -- External Java Opts on top of the defaults set 7. \# Optionally, exact memory values can be set using the \`ES\_JAVA\_OPTS\`. Note that 8. \# the Xms and Xmx lines in the JVM options file must be commented out. Example 9. \# values are "512m", and "10g". 10. \# ES\_JAVA\_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch 11. source "\`dirname "$0"\`"/elasticsearch-env 12. parse\_jvm\_options() { 13. if \[ -f "$1" \]; then 14. echo "\`grep "^-" "$1" | tr '\\n' ' '\`" 15. fi 16. ES\_JVM\_OPTIONS="$ES\_PATH\_CONF"/jvm.options 17. ES\_JAVA\_OPTS="\`parse\_jvm\_options "$ES\_JVM\_OPTIONS"\` $ES\_JAVA\_OPTS" 18. \# manual parsing to find out, if process should be detached 19. if ! echo $\* | grep -E '(^-d |-d$| -d |--daemonize$|--daemonize )' > /dev/null; then 20. exec \\ 21. "$JAVA" \\ 22. $ES\_JAVA\_OPTS \\ 23. \-Des.path.home="$ES\_HOME" \\ 24. \-Des.path.conf="$ES\_PATH\_CONF" \\ 25. \-cp "$ES\_CLASSPATH" \\ 26. org.elasticsearch.bootstrap.Elasticsearch \\ 27. "$@" 28. else 29. exec \\ 30. "$JAVA" \\ 31. $ES\_JAVA\_OPTS \\ 32. \-Des.path.home="$ES\_HOME" \\ 33. \-Des.path.conf="$ES\_PATH\_CONF" \\ 34. \-cp "$ES\_CLASSPATH" \\ 35. org.elasticsearch.bootstrap.Elasticsearch \\ 36. "$@" \\ 37. <&- & 38. retval=$? 39. pid=$! 40. \[ $retval -eq 0 \] || exit $retval 41. if \[ ! -z "$ES\_STARTUP\_SLEEP\_TIME" \]; then 42. sleep $ES\_STARTUP\_SLEEP\_TIME 43. fi 44. if ! ps -p $pid > /dev/null ; then 45. exit 1 46. fi 47. exit 0 48. fi 49. exit $? [CSDN一堆劝退文!到底是干嵌入式还是互联网?](https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/n4HDZqt8SlmWpOWXPyTviQ)
yg9538
2022年7月24日 23:17
529
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码