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

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=1234

echo 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&#xff0…...

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语言版)

一、引言 归并排序是一种高效且稳定的排序方法,而逆序对问题是算法领域的一个经典问题,本文教大家如何实现归并排序,以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解:将待排序的数组分成两半&#xff0c…...

网络爬虫总结与未来方向

通过深入学习和实际操作,网络爬虫技术从基础到进阶得以系统掌握。本节将全面总结关键内容,并结合前沿技术趋势与最新资料,为开发者提供实用性强的深度思考和方案建议。 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怎么在指纹浏览器设置运营矩阵账号

矩阵账号的运营已经成为了许多企业和个人推广策略中的重要一环。通过构建和管理多个社交媒体或电商平台的账号,可以有效地扩大品牌影响力,提高市场覆盖率。然而,随着平台对账号关联的限制越来越严格,如何安全、有效地运营这些矩阵…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...