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. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql 日期周处理方式

MySql 日期周处理方式 最近在做数仓相关工作&#xff0c;最近遇到 几个问题&#xff0c; 1、计算指定日期是一年中的第几周&#xff0c;周一为周的第一天 2、计算周的开始时间&#xff0c;结束时间 3、计算周对应的年 比如 2023-01-01 WEEKOFYEAR(2023-01-01) 是2022年的52周&…

多模态大模型简介

多模态大模型是机器学习领域的一个新兴趋势&#xff0c;它结合了文本、图像、音频等多种数据模态&#xff0c;以实现更全面和深入的信息理解和处理。这种模型能够处理跨模态任务&#xff0c;如图像标注、视觉问答、文本到图像的生成等&#xff0c;是人工智能领域的重要进展。 技…

微服务即时通讯系统的实现(客户端)----(1)

目录 1. 项目整体介绍1.1 项目概况1.2 界面预览和功能介绍1.3 技术重点和服务器架构 2. 项目环境搭建2.1 安装Qt62.3 安装vcpkg2.3 安装protobuf2.4 构建项目2.5 配置CMake属性 3. 项目核心数据结构的实现3.1 创建data.h存放核心的类3.2 工具函数的实现3.3 创建编译开关 4. 界面…

STM32WB55RG开发(3)----生成 BLE 程序连接手机APP

STM32WB55RG开发----3.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置结果演示 概述 本项目旨…

Unity类银河战士恶魔城学习总结(P124 CharacterStats UI玩家的UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了玩家属性栏&#xff0c;仓库&#xff0c;物品栏UI的制作 UI_StatSlot.cs 这个脚本是用来在Unity的UI上显示玩家属性&#xf…

Python实现PSO粒子群优化算法优化CNN-Transformer回归模型(优化权重和阈值)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 本项目旨在利用粒子群优化&#xff08;PSO&#xff09;算法优化卷积神经网络&#xff08;CNN&…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前&#xff0c;需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置&#xff0c;如下图所示 2.输入你想扩展的磁盘容量&#xff0c;以本次实操为例&#xff0c;我这里输入的30G&#xff08;具体按照实…

内网渗透-搭建域环境

声明 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致力于网络安全领域&#xff0c;目前作为一名学习者&#xff0c;很荣幸成…

【Qt】使用QString的toLocal8Bit()导致的问题

问题 使用Qt发送一个Http post请求的时候&#xff0c;服务一直返回错误和失败信息。同样的url以及post参数&#xff0c;复制黏贴到postman里就可以发送成功。就感觉很神奇。 原因 最后排查出原因是因为参数中含有汉字而导致的编码问题。 在拼接post参数时&#xff0c;使用了…

H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

【HarmonyOS】Hdc server port XXXX has been used.Configure environment variable

【HarmonyOS】Hdc server port XXXX has been used.Configure environment variable 一、 问题背景&#xff1a; 无法调试debug应用&#xff0c;IDE右下角显示该弹窗&#xff1a; Hdc server port XXXX has been used.Configure environment variable ‘OHOS_HDC_SERVER_POR…

AdaBoost 二分类问题

代码功能 生成数据集&#xff1a; 使用 make_classification 创建一个模拟分类问题的数据集。 数据集包含 10 个特征&#xff0c;其中 5 个是有用特征&#xff0c;2 个是冗余特征。 数据集划分&#xff1a; 将数据分为训练集&#xff08;70%&#xff09;和测试集&#xff08;3…

初识Linux · 信号保存

目录 前言&#xff1a; Block pending handler表 信号保存 前言&#xff1a; 前文我们已经介绍了信号产生&#xff0c;在时间的学习线上&#xff0c;信号的学习分为预备知识&#xff0c;信号产生&#xff0c;信号保存&#xff0c;信号处理&#xff0c;本文我们学习信号保存…

01 最舒适的python开发环境

0 前言 我自己经过尝试&#xff0c;总结出python3开发环境的最舒适方式。 python3安装创建虚拟环境 venvjupyter notebook 笔记本安装vscode插件(Python, Pylance, Jupyter) 1 python3安装 ubuntu系统下安装最新版本的python3 sudo apt update sudo apt install python32 …

vue3:computed

vue3:computed 扫码或者点击文字后台提问 computed 支持选项式写法 和 函数式写法 1.选项式写法 支持一个对象传入get函数以及set函数自定义操作 2.函数式写法 只能支持一个getter函数不允许修改值的 基础示例 <template><div><div>姓&#xff1a;<i…

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…

124. 二叉树中的最大路径和【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…

跳房子(弱化版)

题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画 n 个格子&#xff0c;这些格子都在同一条直线上。每个格子内…

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…

【开发基础】语义化版本控制

语义化版本控制 基础三级结构主版本号次版本号修正版本号 思维导图在node包管理中的特殊规则 参考文件 基础 语义化版本控制是一套通用的包/库的版本管理规范。在各类语言的包管理中都有用到&#xff0c;一般以x.x.x的形式出现在包的命名中。 三级结构 在语义化版本控制中&a…