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是声明的变量…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

Python异步编程:深入理解协程的原理与实践指南
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...