linux ubuntu的脚本知
目录
一、变量的引用
二、判断指定的文件是否存在
三、判断目录是否存在
四、判断最近一次命令执行是否成功
五、一些比较符号
六、"文件"的读取和写入
七、echo打印输出
八、ubuntu切换到root用户
N、其它可以参考的网址
脚本功能强大,用起来也方便得很。本文进行记录,方便以后自己查看
一、变量的引用
如下的脚本:
usbcont=$(lsusb | grep "1234:")
echo "usb content is $usbcont"
if [ "$usbcont" != "" ]
thenecho ok
elseecho "error"
fi
如果usb的列表中有“1234:”字符串时,usbcont的值为“Bus 004 Device 003: ID 1234:0a04”(以我的测试为例),否则它的值为空。以上可以正常打印,如果列出的usb列表中有“1234:”的字符串内容,则后面的if判断条件成立,就打印出 "ok",否则变量 usbcont 的内容是空的,打印出 "error"。开始一行也可以打印出 "usb content is Bus 004 Device 003: ID 1234:0a04"
如果改成如下的样子:
usbcont=$(lsusb | grep "1234:")
echo 'usbct is $usbcont'
if [ '$usbcont' != '' ]
thenecho ok
elseecho "error"
fi
即第2、3行的双引号改成单引号,则不能正常工作,就不能打印变量的值了,会把$usbcont当作字符串直接打印出来:usbct is $usbcont,后面的if比较就永远成立了,不管是否有“1234:”的usb列表内容都会打印出“ok”
这个情况在终端也是一样的:

第一次采用单引号,结果直接把 $usbcont 当作字符串打印了出来,第二次采用双引号打印出了变量 usbcont 的值
二、判断指定的文件是否存在
if [ ! -f /data/aa.txt ]
thentouch /data/aa.txt
fi
以上示例代码,如果文件 /data/aa.txt 不存在,则创建它。
if [ -f /data/aa.txt ]
thenrm -f /data/aa.txt
fi
以上示例代码,如果文件 /data/aa.txt 存在,则删除它
三、判断目录是否存在
if [ ! -d /data/bb ]
thenmkdir /data/bb
fi
如果目录 /data/bb 不存在,则创建它。
if [ -d /data/bb ]
thencd /data/bbmkdir conftouch aa.txt
fi
以上示例代码,如果目录 /data/bb 存在,则进入到 /data/bb,然后创建目录conf和文件 aa.txt
四、判断最近一次命令执行是否成功
mount /dev/mmcblk1p1 /mnt/sd
if [ $? -ne 0 ]
thenecho Error
elseecho Ok
fi
$? 表示最近一次的命令执行结果,通常执行成功为0,其它为失败,上面示例代码中,如果mount成功,则打印出 Ok,否则打印出 Error 字符串。
如果要卸载tf卡,则:
umount /mnt/sd
这样,再 ls /mnt/sd 时,结果就是空的了。
挂载tf卡时,如果不知道其原本的节点,可以通过命令来查询:
fdisk -l
我的结果如下所示:

最下面的 /dev/mmcblk1p1 就是tf卡的分区节点名称了:
mount /dev/mmcblk1p1 /mnt/sd
注意,这个是要挂载一个分区而不是上面的整个tf卡节点 /dev/mmcblk1,下面的示例:
mount /dev/mmcblk1 /mnt/sd
提示如下错误:
mount: /mnt/sd: wrong fs type, bad option, bad superblock on /dev/mmcblk1, missing codepage or helper program, or other error.
五、一些比较符号
-ne :不等于,上述第四节的示例代码表示最后一次的执行结果如果不等0,就走第一个分支,打印 Error
-eq :等于
-gt :大于
-ge:大于等于
-lt :小于
-le :小于等于
以上用于数字的比较,字符串则用普通c语言的方式:
if [ $a == $b ] #如果a等于b,则条件成立
if [ $a1 != $b2 ] #如果a不等于b,则条件成立
if [ -n $a ] #如果a 非空,则条件成立
if [ -z $a ] #如果a 为空,则条件成立
if [ $a ] #如果a 非空,则条件成立
需要注意的是,[] 的内外都要加空格,比如 if [ $a == $b ] 是正确的,而 if [$a == $b] 是不正确的
如果有多个条件,可以进行连接:
if [ $a ] && [ $a == $b ] #如果a不为空,而且a和b一样,则条件成立
if [ -z $a ] || [ $a != $b ] #如果a为空,或者a和b不一样,则条件成立
可以通过 ! 符号来反方向判断:
if [ ! $a == $b ] #如果a和b不相等,则条件成立
if [ -d /data/bb ] #如果目录 /data/bb 存在,则条件成立
if [ ! -d /data/bb ] #如果目录 /data/bb 不存在,则条件成立
六、"文件"的读取和写入
这里的“文件”是个代指,它可以是一个实际的文件,也可以是一个管脚,或者是一个“设备”。
读取一个gpio管脚的值,并赋给一个变量:
gpio_val=$(cat /sys/class/gpio/gpio123/value)
这里用cat显示它的值,然后用符号$来使它可以被引用,这个赋值方式和第一节中的完全一样,只是命令不一样罢了。如果要向它写入一个值就比较简单了:
echo 1 > /sys/class/gpio/gpio123/value
通过echo命令,可以方便地向任何“文件”写入内容,上述示例中向gpio123管脚写入了“1”。对于不同的“文件”,其允许接受的写入内容是不一样的,如果是普通文件,则可以写入任何内容,如果是特殊的“文件”,就比如上述的gpio管脚,可以写入“0”、“1”,但如果要写入“abcd”,那必定是失败的
如果要显示一个文件的内容,则:
cat /data/config.txt # 输出文件 /data/config.txt 的内容
cat /sys/class/gpio/gpio123/value # 显示gpio123管脚当前的值
echo /sys/class/gpio/gpio123/value # 打印:/sys/class/gpio/gpio123/value
echo cat /sys/class/gpio/gpio123/value # 打印:cat /sys/class/gpio/gpio123/value
echo $(cat /sys/class/gpio/gpio123/value) # 打印:1
由于脚本中是直接执行命令的:
cd /data
mkdir aa
/mnt/sd/test.sh
/sys/class/gpio/gpio123/value # bash: /sys/class/gpio/gpio123/value: command not found
所以,如果要把一个gpio管脚的值赋给一个变量,就不能是这样的:
gpio_val=/sys/class/gpio/gpio123/value
这样赋值之后,gpio_val的值是“/sys/class/gpio/gpio123/value”
七、echo打印输出
echo的打印输出很方便,可以有不同的形式:
a=1234
b="1234"
c='1234'
echo abc is a string #打印:abc is a string
echo "abc is a string" #打印:abc is a string
echo 'abc is a string' #打印:abc is a string
echo "a=$a, b=$b, c=$c" # 打印:a=1234, b=1234, c=1234
echo 'a=$a, b=$b, c=$c' # 打印:a=$a, b=$b, c=$c
echo "a="$a, "b="$b, "c="$c # 打印:a=1234, b=1234, c=1234echo a="$a", b="$b", c="$c" # 打印:a=1234, b=1234, c=1234
echo a=$a, b=$b, c=$c # 打印:a=1234, b=1234, c=1234
echo a=$(a) # bash输出:bash: a: command not found,然后打印:a=
echo $a # 打印:1234
根据实验表明,变量不能放在括号内:$(a),这样就不行,()内必需是相关的命令才行,所以对于第一节的示例来说:
usbcont=$(lsusb | grep "1234:")
echo "usb content is $usbcont"
是可以正常打印的,如果把第一行分开:
usb_all=$(lsusb)
usbcont=$($usb_all | grep "1234:")
echo "usb content is $usbcont"
则提示:bash: Bus: command not found
八、ubuntu切换到root用户
一般情况下,都是用普通用户登录进行操作的,如果有些操作需要root用户权限,可以通过命令前加 sudo 来临时提升权限
user@ubuntu# sudo mount /dev/mmcblk1p1 /mnt/sd
此时通常是需要输入当前用户的密码。
在有些情况下,希望直接以root用户来操作,可以通过如果方式切换到root:
user@ubuntu# sudo -S su
然后输入当前用户密码切换成功:
root@ubuntu#
N、其它可以参考的网址
shell 脚本中的 '-f' 和 '-d' 是什么意思_linux shell_脚本之家
LINUX Shell命令中$0、$1-9、$#、$?、$*、$@、$!、$、$-、$IFS含义及举例 - 寻梦99 - 博客园
linux——shell脚本中关于$和特殊变量的使用细节 - moutory - 博客园
shell变量及赋值_shell变量赋值-CSDN博客
Ubunt网卡命名enp1s0的说明
相关文章:
linux ubuntu的脚本知
目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 N、其它可以参考的网址 脚本功能强大,用起来也…...
HTTP有哪些风险?是怎么解决的?
一、风险 HTTP是通过明文传输的,存在窃听风险、篡改风险以及冒充风险。 二、如何解决 HTTPS在HTTP的下层加了一个SSL/TLS层,保证了安全,通过混合加密解决窃听风险、数字签名解决篡改风险、数字证书解决冒充风险。 (1࿰…...
3.12MayBeSomeLinearAlgebra
X是M*(D1),XT为(D1)*M Ω是一行D1列,X乘以欧米噶是M行D1列 行是说样本个数,列是特征数量 如果是小样本,那么可能会出现特征数量大于样本个数 如果MD*DM就是M*M,...
学习日志015--python单链表
创建 class Node:def __init__(self,data):# 数据域self.data data# 链接域self.next Noneclass LinkList:def __init__(self,):# 初始化头节点self.head None# 记录链表的长度self.size 0 增加 #头插def insert_head(self,value):# 创建新节点node Node(value)q self…...
如何在Windows右键新建菜单中添加自定义项
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\.py] "Python.File"[HKEY_CLASSES_ROOT\.py\ShellNew] "NullFile"""[HKEY_CLASSES_ROOT\Python.File] "FriendlyTypeName""文本.py"[HKEY_CLASSES_ROOT\Python.Fil…...
Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE
Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE 历史背景 javax变成Jakarta的主要原因是因为Java EE项目从Oracle转移到了Eclipse Foundation,并改名为Jakarta EE。 JavaEE是从Java 1.2版本开始推出的Java企业级开发平台,最初的名称是J2EE(J…...
pdf文档动态插入文字水印,45度角,旋转倾斜,位于文档中央,多行水印可插入中文
一行水印 /*** param inputFile 你的PDF文件地址* param outputFile 添加水印后生成PDF存放的地址* param waterMarkName 你的水印* return*/public static boolean waterMark(String inputFile,String outputFile, String waterMarkName){try {PdfReader reader new PdfRead…...
[ 渗透测试面试篇-2 ] 针对大规模资产的攻击思路
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute)
深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute) 最新发现flask3.1.0 的版本引入了新的特性:对CHIPS的支持。不少同学对这个可能有点陌生,本文带大家了解一下。 为了在隐私保护和功能需求之间取得平衡,Goo…...
从搭建uni-app+vue3工程开始
技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader,注意需要版本10,…...
归并排序与逆序对问题(C语言版)
一、引言 归并排序是一种高效且稳定的排序方法,而逆序对问题是算法领域的一个经典问题,本文教大家如何实现归并排序,以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解:将待排序的数组分成两半,…...
网络爬虫总结与未来方向
通过深入学习和实际操作,网络爬虫技术从基础到进阶得以系统掌握。本节将全面总结关键内容,并结合前沿技术趋势与最新资料,为开发者提供实用性强的深度思考和方案建议。 1. 网络爬虫技术发展趋势 1.1 趋势一:高性能分布式爬虫 随…...
C++ 核心数据结构:Stack 与 Queue 类深度解析
🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 目录 💯前言 💯Stack 类 (一)Stack 类的概念与特点 (二&#x…...
Python枚举类详解:用enum模块高效管理常量数据
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 在编程中,常量的管理是一个关键环节,合理的管理常量可以提高代码的可读性和可维护性。Python的enum模块提供了一种有效的方式来组织常量数据,通过枚举类(Enum)将相关的常量值集合在一起,使代码更具结…...
企业OA管理系统:Spring Boot技术深度探索
4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...
汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力
故障现象 一辆2012款路虎揽胜运动版车,搭载3.0T柴油发动机(型号为306DT),累计行驶里程约为10.2万km。车主进厂反映,车辆行驶中加速无力,且发动机故障灯异常点亮。 故障诊断 接车后试车,发动…...
uniapp接入高德地图
下面代码兼容安卓APP和H5 高德地图官网:我的应用 | 高德控制台 ,绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…...
(UI自动化测试)web自动化测试
web自动化测试 UI自动化测试介绍 自动化测试理论: 图片上的文字等等不能做测试,只能发现固定的bug 工具选择及介绍 浏览器驱动:找元素--核心:驱动(操作元素)--通过代码...
【es6进阶】如何使用Proxy实现自己的观察者模式
观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行。这里,我们是使用es6的proxy及reflect来实现这个效果。 实现效果 业务分析 源数据 const object2 {name: "张三"…...
住宅IP怎么在指纹浏览器设置运营矩阵账号
矩阵账号的运营已经成为了许多企业和个人推广策略中的重要一环。通过构建和管理多个社交媒体或电商平台的账号,可以有效地扩大品牌影响力,提高市场覆盖率。然而,随着平台对账号关联的限制越来越严格,如何安全、有效地运营这些矩阵…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...
英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
