当前位置: 首页 > news >正文

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可以用于整数运算,但还有其他的额外功能
bcLinux下的一个计算器程序(适合整数及小数运算)
$[]用于整数运算
awkawk即可用于整数运算,也可以用于小数运算
declare定义变量值和属性,-i参数可以用于定义整形变量,做运算
  1. 双小括号(())
运算操作符与运算命令意义
((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
  1. 双分号 (;;)
    • 每个命令块以 ;; 结尾,表示命令块的结束。
    • 最后一个命令块(通常是默认情况)可以省略 ;;
  2. 使用 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命令中捕获上一个命令执行是否成功&#xff0c;通过判断 $? 是否为0&#xff0c;为0则表示成功&#xff0c;其他错误码则表示执行失败。 2. sheel命令中&#xff0c;变量赋值时默认都是字符串类型。赋值时须注意单引号与双引号的区别&#xf…...

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个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 2.构造函数 2.1构造函数特性 构造函数的主要任务是初始化对象。 它有如下特…...

华为云租户网络-用的是隧道技术

1.验证租户网络是vxlan 2.验证用OVS 2.1控制节点VXLAN 本端ip&#xff08;local ip&#xff09;192.168.31.8 2.2计算节点VXLAN 本端ip&#xff08;local ip&#xff09;192.168.31.11 计算节点用的是bond0做隧道网络 2.3查看bond文件是否主备模式...

手搓神经网络(MLP)解决MNIST手写数字识别问题 | 数学推导+代码实现 | 仅用numpy,tensor和torch基本计算 | 含正反向传播数学推导

手写数字识别&#xff08;神经网络入门&#xff09; 文章目录 手写数字识别&#xff08;神经网络入门&#xff09;实验概述实验过程数据准备模型实现线性变换层前向传播反向传播更新参数整体实现 激活函数层&#xff08;ReLU&#xff09;前向传播反向传播整体实现 Softmax层&am…...

esp32c3安装micropython环境

esp32c3竟然支持micropython环境&#xff0c;真的太让人高兴了。主要是python开发比较友好&#xff0c;开发速度要快于C和C&#xff0c; 可以用来快速创意验证。 下载 首先到官网&#xff1a;MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…...

ES6的Iterator 和 for...of 循环

写在前面 在JavaScript中&#xff0c;Iterator&#xff08;遍历器&#xff09;是一种接口&#xff0c;用于遍历数据结构&#xff08;如数组、对象等&#xff09;中的元素。它提供了一种统一的方式来访问集合中的每个项&#xff0c;包括值和位置。 默认 Iterator 接口 许多内…...

《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义

文章目录 助记提要7章 基本类型7.1 整数类型有符号整数和无符号整数整数类型的说明符整数类型的范围整型常量整数溢出读/写整数 7.2 浮点类型浮点数的范围浮点常量读/写浮点数 7.3 字符类型字符被当做整数来操作转义序列大小写转换scanf和printf读/写字符getchar和putchar读写字…...

MySQL(4)【数据类型 —— 数值类型】

阅读导航 引言一、数据类型分类二、数值类型取值范围三、tinyint 类型1. &#x1f4bb;数值越界测试⭕有符号案例⭕无符号案例 四、bit 类型1. 基本语法2. 使用示例✅创建表并插入数据✅使用 BIT 存储多个设置✅查询和格式化 BIT 数据✅更新 BIT 数据 五、小数类型1. float&…...

Golang超详细入门教程

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

鸿蒙NEXT自定义组件:太极Loading

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

FPGA 第7讲 简单组合逻辑译码器

时间&#xff1a;2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程&#xff0c;在编码时&#xff0c;每一种二进制代码&#xff0c;都赋予了特定的含义&#xff0c;即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码&#xff0c;实现译码操…...

opencv kdtree pcl kdtree 效率对比

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

1+X应急响应(网络)系统备份:

系统备份&#xff1a; 系统备份概述&#xff1a; 备份种类&#xff1a; 灾难恢复等级划分&#xff1a; 执行一次备份&#xff1a; 创建备份计划&#xff1a; 恢复备份&#xff1a;...

python os.path.dirname(path) 详解

dirname 是一个用于处理文件路径的 Python 函数&#xff0c;通常用于获取给定路径的目录部分。它是 os.path 模块中的一部分。下面是对 dirname 函数的详细解释和使用示例。 1、导入模块 首先&#xff0c;你需要导入 os 模块&#xff0c;因为 dirname 是 os.path 模块的一部分…...

深度解析 Feign

一、引言 在当今微服务架构盛行的时代&#xff0c;众多微服务相互协作构成了复杂的分布式系统。然而&#xff0c;各个微服务之间的调用往往涉及到诸多繁琐的细节&#xff0c;比如网络请求的构建、参数的处理、响应的解析等。为了让开发人员能够更加专注于业务逻辑的实现&#x…...

AI工业大模型报告:体系架构、关键技术与典型应用

研究意义 随着新一代人工智能的发展, 大模型&#xff08;如 GPT-4o 等&#xff09;凭借大规模训练数据、网络参数和算 力涌现出强大的生成能力、泛化能力和自然交互能力, 展现出改变工业世界的巨大潜力. 尽管大模型 已在自然语言等多个领域取得突破性进展, 但其在工业应用中的…...

深入理解接口测试:实用指南与最佳实践5.0(五)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…...

常用List工具类(取交集、并集等等)

支持操作&#xff1a; 根据指定字段&#xff0c;获取两个对象集合的交集、补集、并集等将对象中的多个字段值&#xff0c;抽取到一个List中 import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function…...

4 C++ 复合类型:引用和指针

复合类型是指基于其它类型定义的类型。C 有几种复合类型&#xff0c;包括引用、指针。 1 引用 引用&#xff08;reference&#xff09;为对象起了另外一个名字&#xff0c;引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型&#xff0c;其中d是声明的变量…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...