Shell文本处理编写单行指令的诀窍

基于ESP32-C3的物联网硬件设计:从免费工具链到PCB打样全流程实战 在物联网和嵌入式开发领域,硬件设计是连接软件逻辑与物理世界的关键环节。其核心原理在于通过电路设计将微控制器、传感器、通信模块等电子元件有机整合,实现特定功能。掌握硬件设计能力的技术价值在于能够自主实现产品原型,优化成本与性能,并深入理解系统底层运作。常见的应用场景包括智能家居节点、环境监测设备、工业传感终端等。本文以热门的ESP32-C3 RISC-V物联网芯片和广泛使用的KiCad免费EDA工具为例,详细解析了从核心器件选型、射频电路布局、PCB设计规则到Gerber文件生产的完整流程,并分享了在嘉立创平 阅读详情

640?wx_fmt=jpeg

小编编程资质一般,刚出道的时候使用的是windows来做程序开发,平时linux命令的知识仅限于在学校里玩ubuntu的时候学到的那丁点。在一次偶然看见项目的主程敲着复杂的shell单行命令来处理日志的时候感到惊讶不已。后来自己自学了一点shell编程,刚看完一本书没过多久就忘记了,因为工作中用到的实在太少,而且命令如此之多,学了一个忘了另一个,始终摸不着门道在哪。

直到某天灵感爆发,发现了一个窍门之后,才牢牢地把握住了shell指令的精髓。

用写SQL查询的思维写shell命令

写SQL小编非常在行,毕业第一年的时候SQL就写的行云流水。经常别人写了一个存储过程来干某件事的时候,哥用一条语句搞定。自然这样的语句也是被不少人吐槽的,难以看懂。

偶然一天我将一个数据表导入成一个CSV文件的时候发现了这个窍门。如果把这个CSV文件看成一个数据表,把各种shell指令看成SQL的查询条件,这两种数据处理方式在思维模式上就没有什么区别了。

然后就开始仔细研究了一番,又有了好多惊人的发现。原来shell指令除了查询之外还可以做修改,相当于SQL的DML操作。shell指令除了能做单表数据处理之外还可以实现类似于SQL多表的JOIN操作。连排序和聚合功能也能轻松搞定。

640?wx_fmt=jpeg

首先下载本章用到的数据,该数据有20多M,建议耐心等待。

git clone https://github.com/pyloque/shellquery_ppt.git

第一个文件groups.txt表示小组,有三个字段,分别是小组ID、小组名称和小组创建时间

第二个文件rank_items.txt代表行为积分。字段分别是行为唯一ID、行为类型、行为关联资源ID、行为时间和行为积分。行为类型包含group单词的是和小组相关的积分行为。其它行为还有与帖子、用户、问题、文章相关的。

文本文件等价于数据表table

数据表是有模式的数据,每个列都有特定的含义。表的模式信息可以在数据库的元表里找到。

CSV文本文件也是有模式的数据,只不过它的列信息只存在于用户的大脑里。文件里只有纯粹的数据和数据分隔符。CSV文本文件的记录之间使用换行符分割,列之间使用制表符或者逗号等符号进行分隔。

数据表的行记录等价于CSV文本文件的一行数据。数据表一行的列数据可以使用名称指代,但是CSV行的列数据只能用位置索引,表达能力上相比要差一截。

在测试阶段,我们使用少量行的数据进行测试,这个时候可以使用head指令只吐出CSV文本文件的前N行数据,它相当于SQL的limit条件。同样也可以使用tail指令吐出文件的倒数前N行数据。使用cat指令吐出所有。

# 看前5行
bash> head -n 5 groups.txt
205;"真要瘦不瘦不罢休";"2012-11-23 13:42:38+08"
28;"健康朝九晚五";"2010-10-20 16:20:43+08"
280;"核谐家园";"2013-04-17 17:11:49.545351+08"
38;"创意科技";"2010-10-20 16:20:44+08"
39;"死理性派";"2010-10-20 16:20:44+08"

# 看倒数5行
bash> tail -n 5 groups.txt
69;"吃货研究所";"2010-11-10 14:35:34+08"
27;"DIY";"2010-10-20 16:20:43+08"
33;"心事鉴定组";"2010-10-20 16:20:44+08"
275;"盗梦空间";"2013-03-21 23:35:39.249583+08"
197;"万有青年养成计划";"2012-11-14 11:39:50+08"

# 显示所有
bash> cat groups.txt
...

数据过滤等价于查询条件where

数据过滤一般会使用grep或者awk指令。grep用来将整个行作为文本来进行搜索,保留满足指定文本条件的行,或者是保留不满足匹配条件的行。awk可以用来对指定列内容进行文本匹配或者是数字匹配。

# 显示包含‘技术’单词的行
bash> cat groups.txt | grep 技术
73;"美丽也是技术活";"2010-11-10 15:08:59+08"
279;"灰机与航空技术";"2013-04-12 13:30:31.617491+08"
243;"科学技术史";"2013-01-24 12:48:44.06041+08"

# 显示即包含单词‘技术’又包含‘灰机’的行
bash> cat groups.txt | grep 技术 | grep 灰机
279;"灰机与航空技术";"2013-04-12 13:30:31.617491+08"

# 显示小组ID小于30的行 -F限定分隔符 后面是一个awk脚本
# awk一门简单的编程语言,它处理的对象是以行为单位
# $0表示整行内容 $1代表第一列内容
# awk分4段,选择端|起始段|处理段|结束段
# filter BEGIN{} {} END{}
# 选择端起到过滤行的作用,选择成功的行进入处理段
# 起始端在第一个行处理之前进行,结束段在最后一个行处理完成之后进行,只进行依次
# 处理段就是对选择成功的行依次处理,依次处理一行
# 这些段都是可选的
# 参考awk简明教程 https://coolshell.cn/articles/9070.html
bash> cat groups.txt | awk -F';' '$1<30  {print $0}'
28;"健康朝九晚五";"2010-10-20 16:20:43+08"
29;"爱宠";"2010-10-20 16:20:44+08"
27;"DIY";"2010-10-20 16:20:43+08"

限定字段输出

我们经常使用列名称来限定SQL的输出对象。

SQL> select id, user from group

同样对于文本文件,我们可以使用cut指令或者awk来完成。

# 只显示前3行的第一列和第二列,保留分隔符 -d指明分隔符
bash> cat groups.txt | head -n 3 | cut -d';' -f1 -f2
205;"真要瘦不瘦不罢休"
28;"健康朝九晚五"
280;"核谐家园"
# 只显示前3行的第一列和第二列,用空格作为分隔符
bash> cat groups.txt | head -n 3 | awk -F';' '{print $1" "$2}'
205 "真要瘦不瘦不罢休"
28 "健康朝九晚五"
280 "核谐家园"

组合命令的效率

一个复杂的单行命令可以有非常多的单条指令组成,每个指令都会对应着一个进程。进程和进程之间使用管道将输入输出串接起来,形如人体蜈蚣。

640?wx_fmt=jpeg

第一个进程处理了一行数据后从输出吐了出来,成了第二个进程的输入,在第二个进程对第一行数据进行处理的过程中,第一个进程又可以继续处理后面的行。

如此就形成了一个流水线结构,每个进程都在并行的进行数据处理。整个组合命令的效率将取决于所有命令中最慢的一条。

排序操作又不同于其它操作,它需要等待所有的数据都接受完成才能决定第一个输出。所以排序是一个即占用内存又耗费时间的操作,它会导致后续进程的饥饿感。

聚合

数据聚合也是shell里经常使用到的命令,最常用的可能就是用wl来统计行数,其实也可以使用awk来完成更加复杂的统计功能。

# 总共多少行
bash> cat groups.txt | wc -l
216
# 用awk实现,遇到一行对变量l加1,最后输出l变量的值,也即行数
bash> cat groups.txt | awk '{l+=1} END{print l}'

awk还可以完成类似于group by的功能,这个脚本就要复杂一点

# 因为命令太长,下面用了shell命令续行符"\"
# 统计每行的名称长度[去掉前后两个引号],将相同长度的进行聚合统计数量
# awk不识别unicode,所以长度都是按字节算的,可以使用gawk工具来取代
# awk支持字典数据结构和循环控制语句,所以可以干聚合的事
bash> cat groups.txt | awk -F';' '{print length($2)-2}' | \
    > awk '{g[$1]+=1} END{for (l in g) print l,"=",g[l]}'
22 = 1
3 = 2
4 = 1
24 = 9
6 = 6
...

排序和去重

排序命令是一种消耗内存的运算,它需要将全部的内容放置到内存的数组里,然后使用排序算法进行内容排序后输出。shell的排序就是sort命令,sort可以按字符排序也可以按数字排序。

# 以分号作为分隔符,排序第一列小组的ID
# 默认按字符进行排序
bash> cat groups.txt | sort -t';' -k1 | head -n 5
102;"说文解字";"2012-03-19 18:10:47+08"
103;"广告研发局";"2012-03-21 17:50:02+08"
104;"掀起你的内幕来";"2012-03-26 17:23:11+08"
105;"一分钟学堂";"2012-03-28 17:06:37+08"
106;"泥瓦匠";"2012-04-11 21:30:34+08"

# 加上-n选项按数字进行排序
bash> cat groups.txt | sort -t';' -n -k1 | head -n 5
27;"DIY";"2010-10-20 16:20:43+08"
28;"健康朝九晚五";"2010-10-20 16:20:43+08"
29;"爱宠";"2010-10-20 16:20:44+08"
30;"性 情";"2010-10-20 16:20:44+08"
31;"谋杀 现场 法医";"2010-10-20 16:20:44+08"

# 加上-r选项倒排
bash> cat groups.txt | sort -t';' -n -r -k1 | head -n 5
303;"怎么玩小组";"2013-06-05 13:18:06.079734+08"
302;"**精选";"2013-06-05 13:15:52.187787+08"
301;"土木建筑之家";"2013-06-05 13:14:58.968257+08"
300;"NBA那些事儿";"2013-06-03 15:50:14.415515+08"
299;"数据江湖";"2013-05-30 17:27:10.514241+08"

去重的命令时uniq,但是跟SQL的distinct不一样,uniq一般和sort配合使用,它要求去重的对象必须是排过序的,否则就不能起到去重的效果。distinct一般是在内存里记录一个Set放入所有的值,然后查询新值是否在Set中。uniq只记录一个值,就是上一行的值,然后看新行的值是否和上一行的值一样。

# 打印第二列小组名称的长度的所有可能的值的个数
# awk打印长度,sort -n按长度数字排序, uniq去重,wc -l统计个数
bash> cat groups.txt | awk -F';' '{print length($2)-2}' | sort -n | uniq | wc -l
21

# 我们再看看,如果不排序会怎样
bash> cat groups.txt | awk -F';' '{print length($2)-2}' | uniq | wc -l
166
# 很明显这个值不是我们期望的

进程替换操作符 <()

有很多指令可以接受一个文件名作为参数,然后对这个文件进行文本处理。如果输入不是文件而是由一串命令生成的动态文件怎么办呢?也许你会想到先将这一串命令输出到临时文件中再将这个临时文件名作为指令的输入,处理完毕后再删除这个临时文件。

# 首先创建临时文件
bash> mktemp
/var/folders/w3/4z1zbpdn6png5y3bl0pztph40000gn/T/tmp.LoWLFvJp

# 输出到临时文件
bash> cat groups.txt | grep 技术 > /var/folders/w3/4z1zbpdn6png5y3bl0pztph40000gn/T/tmp.LoWLFvJp

# 处理临时文件,统计临时文件的行数
bash> cat /var/folders/w3/4z1zbpdn6png5y3bl0pztph40000gn/T/tmp.LoWLFvJp | wc -l
3

# 删除临时文件
bash> rm /var/folders/w3/4z1zbpdn6png5y3bl0pztph40000gn/T/tmp.LoWLFvJp

但是本文的主题是单行shell命令。你很难使用单行命令来实现上面提到的临时文件法。这时我们就需要借助于一个高级语法:进程替换。

# 等价于上面的临时文件法,进程替换符号<()
bash> cat <(cat groups.txt | grep 技术) | wc -l
3

进程替换的原理也是临时文件法,只是这里的文件路径是/dev/fd/<n>。

连表Join操作

当两个数据表有关联时,可以使用join操作进行连表查询。同样shell也有特殊的方法可以关联两个文件的内容进行查询,这个命令在shell里面也是join。考虑到性能,join指令要求两个输入文件的join字段必须是排序的。

# rank_items表里面的行为类型字段有个值为hot_group,它表示小组因为活跃而上了热门小组
# 然后系统给这个小组累积了一个score,比如
# hot_group后面跟的是小组ID,最后的值1表示score积分
bash> cat rank_items.txt | grep hot_group | head -n 5
"5aa19d6a-3482-4a92-ae20-f26218d8debd";"hot_group";"96";"2013-06-03 21:43:58.62761+08";1
"6ae0f144-33af-432b-a9af-db51938e8faf";"hot_group";"48";"2013-06-03 21:44:05.050322+08";1
"55dcb43e-e2c0-43d2-8ed7-dbec6771e7b4";"hot_group";"185";"2013-06-05 18:14:08.406047+08";1
"98a54f24-fdef-4029-ad79-90055423f5c3";"hot_group";"31";"2013-06-03 21:47:28.476056+08";1
"4284d4d5-41b9-4dfd-ada9-537332c5cbd6";"hot_group";"63";"2013-06-01 10:07:18.58019+08";1

# 现在我们来聚合一下所有小组的各自积分,然后排序取前5名
# 用grep过滤只保留包含hot_group的行
# 筛选字段,只保留小组ID和积分字段,因为小组ID前后有引号,所以得用substr去掉引号
# 用awk的聚合功能累积各小组的积分
# sort -n -r按积分数字倒排,再head -n 5取前5名展示出来
bash> cat rank_items.txt| grep hot_group | \
awk -F';' '{print substr($3, 2, length($3)-2)";"$5}' | \
awk -F';' '{scores[$1]+=$2} END{for(id in scores) print id";"scores[id]}' | \
sort -t';' -n -r -k2 | head -n 5
63;5806
30;4692
69;4605
73;3177
27;2801

# 接下来我们将上面的结果和groups.txt文件join起来,以显示小组ID对应的名称
# -t指定分隔符,两个输入分隔符必须一致
# -1 1 -2 1表示取第一个输入文件的第一个字段和第二个输入文件的第一个字段来join
# -o1.1,1.2,2.2表示输出第一个输入文件的第一第二字段和第二个输入文件的第二字段
bash> join -t';' -1 1 -2 1 -o1.1,1.2,2.2 \
<(sort -t';' -k1 groups.txt) \
<(cat rank_items.txt| grep hot_group | \
awk -F';' '{print substr($3, 2, length($3)-2)";"$5}' | \
awk -F';' '{scores[$1]+=$2} END{for(id in scores) print id";"scores[id]}' | \
sort -t';' -n -r -k2 | head -n 5)
63;"Geek笑点低";5806
69;"吃货研究所";4605
73;"美丽也是技术活";3177
# 我们看到结果只有3条,原因是有30和27两个ID在groups.txt里面找不到。

推荐资源

《Unix Shell编程》
《The AWK programming language》
《Sed & Awk 101 Hacks》
 GNU Parallel http://www.gnu.org/software/parallel/

640?wx_fmt=jpeg

阅读相关文章,请关注公众号【码洞】

Cesium圆形波纹/雷达扩散效果扩展类CircleWaveMaterialProperty 本文是基于原创内容进行部分修改,原文出处:https://blog.youkuaiyun.com/chudage11/article/details/101632482 SuperMapCesium支持该类似扩展类,以下是原生Cesium调用扩展类CircleWaveMaterialProperty说明 1.扩展类CircleWaveMaterialProperty.js import*asCesiumfrom'cesium' varCircleWaveMaterial={ Circl... 阅读详情

相关推荐

信捷CODESYS平台伺服电机转矩控制模式应用与切换

信捷CODESYS二次开发软件:XS Studio 在运动控制中的转矩控制案例

weixin_64614866的博客 1万+

Linux:多行shell命令转成单行命令形式的方法

多行shell命令转成单行命令形式的方法

netyeaxi的专栏 2212

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路

本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。

weixin_29220405的博客 268

【Shell】shell 处理文本/日志(一行一行读文本-特别注意for)

shell 获取结果中的第n列,第n行 ls -l | awk '{print $5}' | sed -n '2p' awk 是很实用的文本处理命令,print 到后带的是你要获取第几列,sed -n 是指定第几行。 AWK输出某几列 有这样一个文本,需要截取前5行 [root@SH]# cat test.txt 2 3651415576 9407......

我的笔记本 4715

从钕铁硼到电机磁钢:用COMSOL玩转新能源永磁体磁场仿真(含3D模型导入技巧)

本文详细介绍了如何利用COMSOL Multiphysics进行新能源永磁体磁场仿真,从基础的单块钕铁硼磁钢建模到复杂的3D电机磁钢组件分析。重点讲解了3D模型导入技巧、辐射环等特殊结构的充磁定义,以及如何通过仿真结果优化磁路设计、评估气隙磁密和退磁风险,为工程师提供了一套高效、精准的有限元仿真解决方案。

2y3u4i5o6p的博客 1040

PD3.0详解 协议的时序timer和counter计数

前面介绍了关于PD协议的交互,还有协议层数据各个字段的含义,但是一直没有系统的说关于协议的时序,还有部分counter,就是协议允许发送的次数,或者一些其他计数。 大师匈今天说一下关于这方面的东西,这些东西都是非常关键的东西,但是相对来说PD标准内对时序的要求还是比较宽泛,非常容易能够实现这样的要求。 Timer 1、CRCReceiveTimer 0.9~1.1ms 表示每次通信收到goodcrc的时间,必须在这个时间内收到goodcrc, 我们要注意不是在0.9~1.1ms内,而是第三方可以在这个范

大师匈的博客 5007

一行代码实现shell if else逻辑

前言 前几天学习 shell 脚本,发现这种好用的写法,简单记录一下。 if else 一行实现 shell if [ 1=1 ] ;then echo "条件成立";else echo "条件不成立"; fi 关键点就在在代码块分支逻辑间位置加上;就可以实现逻辑写到一行 || && 实现if else逻辑 ```shell wenshuo.wang@LG-H2-SD-114-36:~$ function test { echo 1 } wenshuo.wang@LG-H2-SD-

Hello_wshuo 3336

使用AI预测彩票的架构思路

彩票是随机的数字游戏,不要过度依赖AI,本文仅供娱乐研究

淘淘小窝 9413

shell脚本执行

标题shell脚本执行顺序 shell脚本运行时会先查找系统环境变量ENV,该变量制定了环境文件(加载顺序通常是/etc/profile、/.bash_profile、/.bashrc、/etc/bashrc等),在加载上述环境变量文件后,shell就开始执行shell脚本中的内容。 shell脚本的执行有以下几种方式: bash script-name或sh script-name path/script-name或./script-name source script-name或. script-na

z15216677201的博客 587

手把手教你学SOC芯片架构--NoC(片上网络,Network on Chip)全方位解析

​、​。

MHD0815的博客 872

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习

本文介绍了工业缺陷检测的完整流程,从传统图像处理到深度学习方法。首先定义了缺陷检测任务的目标和应用场景,然后详细讲解了传统图像处理方法(边缘检测、阈值分割等)和深度学习方法(分类、检测、分割模型)。文章最后总结了核心要点,提出了思考题和实践建议,建议从简单方法开始逐步优化。下一篇将介绍工业视觉基础技术——相机标定与角点检测。

yonggeit的博客 2890

在一行上使用多条shell命令

在一行上使用多条shell命令 [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令。 [root@localhost etc]# lld ; echo “ok” ; lok -bash: lld: command not found ok -bash: lok: command not found [ && ] 如果命...

Megahertz66的博客 3787

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mount namespace 与 pivot_root:彻底理解容器根目录切换原理

Linux 命名空间是容器隔离技术的基石,其中 mount namespace 负责隔离进程的挂载点视图,而根文件系统的切换则是容器启动的关键环节。很多开发者容易混淆 chroot 与真正意义上的根目录切换,导致在调试容器运行时或自定义 rootfs 时遇到挂载视图残留、设备节点混乱等问题。本文从挂载点隔离的基本概念出发,解释挂载传播标志对命名空间的影响,并深入比较 chroot 与 pivot_root 的本质差异。通过可运行的实验脚本,演示如何绑定挂载新根、进入隔离环境、调用 pivot_root 并卸

weixin_34320159的博客 355

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

shell脚本编程诀窍:适用于linux,bash等 pdf,Shell脚本编程诀窍——适用于Linux、Bash等 中文pdf扫描版...

内容介绍热点排行相关文章下载地址↓《shell脚本编程诀窍——适用于linux、bash等》主要内容:shell是与unix和linux系统通信的主要方法,并通过使简单到中间任务的自动化,提供了一种直接的编程手段。在《shell脚本编程诀窍——适用于linux、bash等》中,精通unix、linux与shell脚本编程的专家steve parker分享了一组shell实用脚本编程诀窍。这些实用脚...

weixin_35888365的博客 204

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

UNIX 新手指南: 一些很好的 Shell 诀窍

转:http://www.ibm.com/developerworks/cn/education/aix/au-unixtips4/section2.html Shell 命令执行 学习 Shell 脚本的最佳方法是通过示例。对于您要在脚本中执行的任何命令都可以在命令行上立即尝试,这也是本教程通篇提供大量实践示例的原因所在。例如,echo 命令将一行文本写入到标准输出。(许多 Shell 以...

wujay 307

Shell 脚本编程诀窍 第三章 变量

while read message do       done read message 命令替换 var=`command` var=$(command) 位置参数: 返回码: $? 3.2 预定义变量和标准变量 BASH_SOURCE,FUNCNAME 变量函数调用栈  LINENO,BASH_LINE 变量多少行 $RANDOM 随机数

小留家心的爱心之窝 ^_^ 570

UNIX 新手指南,第4部分: 一些很好的 Shell 诀窍

当编写 Shell 程序时,您通常会遇到一些特殊的情况,希望采用自动方式处理。本教程包括一些关于此类情况的 Bourne Shell 脚本示例。这些情况包括字符串的进制转换(十进制到十六进制、十六进制到十进制、十进制到八进制,等等)、在管道循环中读取键盘、Subshell 执行、内联输入、为目录中的每个文件执行一次命令,以及使用多种方法构造连续循环。本系列文章的第 4 部分总结了一批执行有用功能的...

Another Space 146

Shell 脚本编程诀窍 第4章 通配符扩展

4.1 文件名扩展 globbing {} [] #开头的!或^ 表示相反的意思 [a-z] 等价于 [[:alpha:]] [0-9] 等价于 [[:digit:]] z-a,A-Z,0-0 [[:alnum]] set -n noglob(set -f) #可以关闭文件名扩展功能 需要转义的字符 ; & !(表示上一条命令)

小留家心的爱心之窝 ^_^ 569

shell配置--《shell脚本编程诀窍》

shell配置文件: 个人配置主要集中在~/.profile($HOME/.profile)文件中。 打开新的交互式shell时,配置文件的执行顺序是/etc/profile、/etc/bash.bashrc(bash shell)、~/.profile,最后是 ~/.bashrc. 所有的shell都会读取~/.profile,因此最好将通用配置写入其中,然后将与bash相关的配置

nobody 1419

shell脚本编程诀窍——适用于linux,bash等,Shell Scripting: Expert Recipes for Linux, Bash and moreShell脚本编程诀窍:适用于L...

简介:A compendium of shell scripting recipes that can immediately be used, adjusted, and appliedThe shell is the primary way of communicating with the Unix and Linux systems, providing a direct way to p...

weixin_35000379的博客 166

(025) Linux之编写第一个shell脚本

十年运维系列之基础篇 - Linux 作者:曾林 联系:1494445739@qq.com 网站:www.jplatformx.com 版权:文章未经同意请勿转载 一、引言 在之前的章节中,我们已经学习了一系列的命令行工具。虽然这些工具可以解决很多问题,但是我们在使用它们时只能在命令行中一个一个手动输入。如果可以让shell完成更多工作,岂不是更好?当然可以,通过自行...

weixin_30389003的博客 267

shell学习之条件测试(参考shell脚本编程诀窍)

1关于test测试,查看man文档知表达式的判断( EXPRESSION ) #EXPRESSION is true! EXPRESSION #EXPRESSION is falseEXPRESSION1 -a EXPRESSION2 #both are true,-o means ...

weixin_34378045的博客 152

《Linux命令行大全》读书笔记三:编写shell脚本

第二十四章:编写第一个shell脚本 shell脚本是一个包含一系列的命令的文件,shell读取这个文件,然后执行这些命令。三个步骤: - 编写脚本 - 使脚本可执行 - 将脚本放置于shell能够发现的地方 脚本的格式,最简单的一个脚本: #!/bin/bash # This is our first script echo 'Hello World!' 将上述脚本保存为hel...

yhcuac 395

学好linux的诀窍

在学习的过程中还要注意养成一个做记录的习惯,当你发现错误信息的时候,找到解决方案的时候,你就要把他记录下来,然后时不时温习一下,这样当你以后再次遇到相同的错误信息的时候,你就会知道如何去处理了,可别小看这一个习惯,当你持续几年后,说不定你就能成为别人眼中的大神了,因为Linux从入门到精通,其实经验占据了很大一部分,包括你做Linux运维工作的时候,经验多,往往会让你得到更高的薪资。最后,希望大家在学习Linux的时候能够一直坚持下去,坚持就是胜利,只要坚持学习,你就能有巨大的收获。...

u014389734的博客 90
上一篇: 天下无难试之HTTP协议面试刁难大全
下一篇: 机器学习sklearn线性回归
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值