shell命令笔记
一、shell基本基础知识
1. shell命令中捕获上一个命令执行是否成功,通过判断 $? 是否为0,为0则表示成功,其他错误码则表示执行失败。
2. sheel命令中,变量赋值时默认都是字符串类型。赋值时须注意单引号与双引号的区别:
单引号:不识别特殊语法。返回字符串内的原始内容。
双引号:可以识别特殊符号。
无引号:默认字符串,但是中间有空格时容易出错,建议双引号
反引号:``,用于命令返回的结果,等同于$()的用法。比如echo `ls -l`等价于echo $(ls -l),推荐后面的这种写法。
name="奥利给"
echo ${name}
>>奥利给 #输出奥利给
name1='${name}'
echo ${name1}
>>${name} #不识别name这个变量,输出原始文字
name2="${name}"
echo ${name2}
>>奥利给 #识别了name变量,并转成其值“奥利给”
3. bash和source及.的执行区别:通过bash执行shell脚本,相当于在当前窗口进行下启动一个子进程,而通过source及.执行shell脚本,是加载到当前的shell环境中。可通过pstree查看进程树。
4. 环境变量:
用户环境配置文件:在每个用户的目录下~/.bash_profile及~/.bashrc,这两个文件在用户登录时会自动加载运行。
系统配置文件:对所有的用户生效(全局),在/etc/profile中会自动加载运行
查找环境变量:
set/declare 显示所有的变量,包括全局变量和局部变量
env 显示全局变量
export 显示和设置环境变量值(临时的)
5. 支持多条命令执行,通过分号隔开
二、shell特殊变量
1. shell的特殊变量:用于脚本、函数传递参数的时候,有如下位置特殊变量:
(1)$0 获取shell脚本文件名,脚本路径
(2)$n 获取shell脚本的第n个位置参数,n取值在1-9之间,如果大于9,则要写${10},参数空格隔开
(3)$# 获取shell脚本执行的参数总个数
(4)$* 获取shell脚本的所有参数,不加引号等同于$@。加上引号"$*"表示接收所有参数为单个字符串,即所有的参数为一个整体。
(5)$@ 获取shell脚本的所有参数,不加引号等同于$*。加上引号"$@",每一个参数都是独立的。
2. shell脚本的特殊状态变量:
(1)$? 上一次执行命令返回值,返回为0表示成功,其他则为失败
(2)$$ 当前shell脚本的进程ID,可以用来停止当前脚本的进程
(3)$! 获取上一次后台执行的进程PID,可以用来停止上一个后台执行脚本的进程。
(4)$_ 获取上次命令的最后一个参数
三、shell内置命令
echo 打印到终端,相当于简化版的printf
eval 一次执行多个命令,命令之间用分号隔开。eval ls;cd /tmd
exec 不创建子进程执行命令,并且执行完后自动执行exit
四、shell变量子串的用法
${变量} 返回变量值
${#变量} 返回变量长度,字符长度
${变量:start} 返回变量start数值之后的字符,索引从0开始
${变量:start:length} 提取start之后的length限制的字符
${变量#word} 从变量开头删除最短匹配的word子串
${变量##word} 从变量开头删除最长匹配的word子串
${变量%word} 从变量结尾删除最短的word子串,这里的word可以用正则表达式来匹配。
${变量%%word} 从变量结尾删除最长的word子串
${变量/pattern/string} 用string替代第一个匹配的pattern.如果string为空,则表示删除匹配到的字符串
${变量//pattern/string} 用string替代所有匹配的pattern。如果string为空,则表示删除匹配到的字符串
name="Jolin Su"
name1="abcABC123ABCabc"
file="/home/user/documents/report.txt"
echo ${name} >> Jolin Su #返回变量的值
echo ${#name} >> 8 #返回变量的长度
echo ${name:3} >> in Su #从索引3开始输出
echo ${name:2:3} >> lin #从索引2开始输出3个字符
echo ${name#Jo} >> lin Su #从变量开头匹配上了Jo删掉
echo ${name#lin} >> Jolin Su #需要注意lin在中间,不能匹配上开头,所以返回原来的值
echo ${name1#a*c} >> ABC123ABCabc #从开始删除a*c匹配到的最短字符串
echo ${name1##a*c} >> #返回为空,所有的字符都被删掉了,a*c最长匹配到了最后一个
echo ${file#*/} >> home/user/documents/report.txt # #*/表示移除从开头开始的第一个斜杠及其之前的所有内容。
echo ${file##*/} >> report.txt # ##*/表示移除从开头开始的所有斜杠及其之前的所有内容,直到最后一个斜杠为止。
echo ${file/o/xx} >> /hxxme/user/documents/report.txt
echo ${file//o/xx} >> /hxxme/user/dxxcuments/repxxrt.txt
echo ${name/o/} >> Jlin Su
五、shell变量扩展用法
主要用于变量值为空的判断及处理
result=${parameter:-word} 如果${parameter}为空,返回word字符串给result
result=${parameter:=word} ${parameter}为空,返回word字符串给result并且赋值给parameter
result=${parameter:?word} ${parameter}为空,返回word字符串给result,相当于错误信息输出
result=${parameter:+word} ${parameter}为空,则什么都不做;如果非空,则返回word给result
六、父子shell
shell:source script -> command1 -> command2 在同一个shell窗口执行命令
shell:/bin/bash script --> --> 命令结束后返回父shell
subshell: -->comand1 -->command2 --> 在子shell执行命令
shell:./script --> -->命令结束后返回父shell
subshell: -->command1 -->command2 --> 在子shell执行命令
#注意三种执行script的父子shell的不同,在编写脚本时需要重点注意。
七、shell算数运算
7.1 shell中常见的算术运算符
运算符 | 意义(*表示常用) |
---|---|
+、- | 加号(正号)、减号(负号)* |
*、/、% | 乘号、除号、取余(取模)* |
** | 幂运算 * |
++、-- | 增加及减少,可前置也可放在变量结尾* |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or)* |
<、<=、>、>= | 比较符号(小于,小于等于,大于,大于等于) |
==、!=、= | 比较符号(相等,不相等,对于字符串'='也可以表示相等) * |
<<、>> | 向左移、或向右移 |
~、|、&、^ | 按位取反,按位异或,按位与,按位或 |
=、+=、-=、*=,/=、%= | 赋值运算符,例如a+=1相当于a=a+1 |
7.2 shell中常见的算术运算命令
运算操作符与运算命令 | 意义 |
---|---|
(()) | 相当于整数运算的常用运算符,效率很高 |
let | 用于整数运算类似"(())" |
expr | 可以用于整数运算,但还有其他的额外功能 |
bc | Linux下的一个计算器程序(适合整数及小数运算) |
$[] | 用于整数运算 |
awk | awk即可用于整数运算,也可以用于小数运算 |
declare | 定义变量值和属性,-i参数可以用于定义整形变量,做运算 |
- 双小括号(())
运算操作符与运算命令 | 意义 |
---|---|
((i=i+1)) | 此写法为运算后赋值法,即将i+1的结果赋值给变量i。注意,不能用echo ((i=i+1))的形式输出表达式的值,但可以用echo $((i=i+1) |
i=$((i+1)) | 可在(())符号前面加$符,表示将表达式运算结果赋值给i |
((8>7&&5==5)) | 可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断 |
echo $((2+1)) | 需直接输出运算表达式的运算结果时,可在(())前加$符 |
2. ++a和a++的区别
++a,先计算+1,在赋值给a
a++,先对变量a操作,再进行+1
a=5
echo $((a++)) #结果是5,先打印然后再+1赋值给a
echo $a #结果是6
b=5
echo $((++b)) #结果是6,先对b+1,再打印
echo $b #结果是6
7.3 expr命令
常用来做模式匹配,用法
expr string : ".*" #string为字符串对象,:为固定格式,表示匹配统计后面表达式的匹配到的长度。 ".*"这里.是固定的,*为正则表达式,可以根据需要修改。
7.4 bc工具
前面的字符通过管道符|交给bc来运算,并打印返回结果
echo "3*3.5" | bc #返回结果10.5
7.5 awk命令
echo "2.2 3.5" |awk '{print ($1 + $2)}'
八、条件判断
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
补充说明:shell脚本中命令支持&&和||的用法,&&表示前面的条件为真才执行,||前面的条件不成立才执行。举例:
test -e hello.txt && echo "文件存在" || echo "文件不存在"
test命令和[ ] 的使用,判断里面的条件表达式是否为真,为真则返回0,否则非0。
注意:
1. [ ] 里面的条件,在左右括号的前后必须有空格。
2. 在[ ]条件判断中,变量引用必须加上双引号" "。
3. [[ ]]双中括号的条件判断,可以更灵活;支持 &&
和 ||
逻辑运算符;而[ ] 要实现逻辑表达需要使用 -a 或者 -o 分别表示and和or。!表示非。
参数如下:
8.1 数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
num1=100
num2=100
if test $[num1] -eq $[num2]
thenecho '两个数相等!'
elseecho '两个数不相等!'
fi
8.2 字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
thenecho '两个字符串相等!'
elseecho '两个字符串不相等!'
fi
8.3 文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
cd /bin
if test -e ./bash
thenecho '文件已存在!'
elseecho '文件不存在!'
fi
九、条件判断
9.1. if语句来判断
#单条件循环
if [ ];then执行代码fi
#两条件循环
if [ ];then执行代码
else执行代码fi
#多条件循环
if [ ];then执行代码
elif [ ]执行代码
else执行代码
fi
9.2 case语句(多条件模式匹配)
#!/bin/bashecho "请输入一个数字 (1-3 或其他): "
read numbercase $number in1|2|3)echo "你输入了一个 1 到 3 之间的数字";;[4-9])echo "你输入了一个 4 到 9 之间的数字";;[0-9]*)echo "你输入了一个多位数";;*)echo "你输入的不是一个数字";;
esac
- 双分号 (
;;
):- 每个命令块以
;;
结尾,表示命令块的结束。 - 最后一个命令块(通常是默认情况)可以省略
;;
。
- 每个命令块以
- 使用
esac
:esac
是case
语句的结束标志,是case
的反向拼写。
十、函数
#函数的基本定义
function test(){定义函数的动作
}#函数调用
test
1. 函数必须先定义,再执行,从上往下执行
2. 函数体内定义的变量,为局部变量,仅在函数体内有效
3. 函数体内当有需要返回值时,添加return语句,作用是退出函数,且将返回值赋值给调用程序,在shell中通过$?获取其return的值
4.return语句和exit语句的差异:
(1)return是退出函数,只能写在函数中,给出返回值
(2)exit是shell内置命令,是退出shell脚本的执行,并返回码
5. 函数如果单独写入一个文件里,需要通过source读取
6.
相关文章:
shell命令笔记
一、shell基本基础知识 1. shell命令中捕获上一个命令执行是否成功,通过判断 $? 是否为0,为0则表示成功,其他错误码则表示执行失败。 2. sheel命令中,变量赋值时默认都是字符串类型。赋值时须注意单引号与双引号的区别…...
qml显示OpenCV mat图片
文章目录 方式一QQuickPaintedItem 类介绍主要特点使用方法示例代码在 QML 中使用主要方法和属性注意事项编写OpenCV mat显示代码方式二本篇博客介绍在Qt6.5.3 qml项目里介绍如何显示OpenCV mat图片。视频:https://edu.csdn.net/learn/40003/654043?spm=3001.4143 在qml里显示…...

类与对象(2)---类的6个默认成员函数
1.类的6个默认成员函数 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 2.构造函数 2.1构造函数特性 构造函数的主要任务是初始化对象。 它有如下特…...

华为云租户网络-用的是隧道技术
1.验证租户网络是vxlan 2.验证用OVS 2.1控制节点VXLAN 本端ip(local ip)192.168.31.8 2.2计算节点VXLAN 本端ip(local ip)192.168.31.11 计算节点用的是bond0做隧道网络 2.3查看bond文件是否主备模式...

手搓神经网络(MLP)解决MNIST手写数字识别问题 | 数学推导+代码实现 | 仅用numpy,tensor和torch基本计算 | 含正反向传播数学推导
手写数字识别(神经网络入门) 文章目录 手写数字识别(神经网络入门)实验概述实验过程数据准备模型实现线性变换层前向传播反向传播更新参数整体实现 激活函数层(ReLU)前向传播反向传播整体实现 Softmax层&am…...

esp32c3安装micropython环境
esp32c3竟然支持micropython环境,真的太让人高兴了。主要是python开发比较友好,开发速度要快于C和C, 可以用来快速创意验证。 下载 首先到官网:MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…...
ES6的Iterator 和 for...of 循环
写在前面 在JavaScript中,Iterator(遍历器)是一种接口,用于遍历数据结构(如数组、对象等)中的元素。它提供了一种统一的方式来访问集合中的每个项,包括值和位置。 默认 Iterator 接口 许多内…...
《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义
文章目录 助记提要7章 基本类型7.1 整数类型有符号整数和无符号整数整数类型的说明符整数类型的范围整型常量整数溢出读/写整数 7.2 浮点类型浮点数的范围浮点常量读/写浮点数 7.3 字符类型字符被当做整数来操作转义序列大小写转换scanf和printf读/写字符getchar和putchar读写字…...
MySQL(4)【数据类型 —— 数值类型】
阅读导航 引言一、数据类型分类二、数值类型取值范围三、tinyint 类型1. 💻数值越界测试⭕有符号案例⭕无符号案例 四、bit 类型1. 基本语法2. 使用示例✅创建表并插入数据✅使用 BIT 存储多个设置✅查询和格式化 BIT 数据✅更新 BIT 数据 五、小数类型1. float&…...

Golang超详细入门教程
Golang超详细入门教程 部分图片可能加载不出来,所以这里我上传到了自己的个人网站上也可以查看:http://dahua.bloggo.chat/testimonials/490.html 一、数据类型转换 C语言中数据可以隐式转换或显示转换, 但是Go语言中数据只能显示转换格式: 数据类型(…...

鸿蒙NEXT自定义组件:太极Loading
【引言】(完整代码在最后面) 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件,为你的应用增添独特的视觉效果。 【环境准备】 电脑系统:windows 10 开发工具:DevEco Studio NEXT Beta1 Build Vers…...

FPGA 第7讲 简单组合逻辑译码器
时间:2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码,实现译码操…...

opencv kdtree pcl kdtree 效率对比
由于项目中以一个环节需要使用kdtree ,对性能要求比较严苛,所以看看那个kdtree效率高一些。对比了opencv和pcl。 #include <array> #include <deque> #include <fstream> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp…...

1+X应急响应(网络)系统备份:
系统备份: 系统备份概述: 备份种类: 灾难恢复等级划分: 执行一次备份: 创建备份计划: 恢复备份:...
python os.path.dirname(path) 详解
dirname 是一个用于处理文件路径的 Python 函数,通常用于获取给定路径的目录部分。它是 os.path 模块中的一部分。下面是对 dirname 函数的详细解释和使用示例。 1、导入模块 首先,你需要导入 os 模块,因为 dirname 是 os.path 模块的一部分…...
深度解析 Feign
一、引言 在当今微服务架构盛行的时代,众多微服务相互协作构成了复杂的分布式系统。然而,各个微服务之间的调用往往涉及到诸多繁琐的细节,比如网络请求的构建、参数的处理、响应的解析等。为了让开发人员能够更加专注于业务逻辑的实现&#x…...

AI工业大模型报告:体系架构、关键技术与典型应用
研究意义 随着新一代人工智能的发展, 大模型(如 GPT-4o 等)凭借大规模训练数据、网络参数和算 力涌现出强大的生成能力、泛化能力和自然交互能力, 展现出改变工业世界的巨大潜力. 尽管大模型 已在自然语言等多个领域取得突破性进展, 但其在工业应用中的…...

深入理解接口测试:实用指南与最佳实践5.0(五)
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
常用List工具类(取交集、并集等等)
支持操作: 根据指定字段,获取两个对象集合的交集、补集、并集等将对象中的多个字段值,抽取到一个List中 import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function…...
4 C++ 复合类型:引用和指针
复合类型是指基于其它类型定义的类型。C 有几种复合类型,包括引用、指针。 1 引用 引用(reference)为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...