戏说shell编程

2024-02-22 20:30
文章标签 编程 shell 戏说

本文主要是介绍戏说shell编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

shell的重要性对每个system adminstrator来说不言而喻。今天阿拉就来浅谈一下那些年shell编程的酸与爽吧。

那我们就以一个入门级的编程实例入手。顺便搭配半斤八两的阿拉的脑袋瓜子。

编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

这个题目咋一看,那就是两个变量的问题。

于是答案很快出来了。

忽略shebang和注释就是下面的样子:

echo $[`cat $file1 |grep ^$|wc -l`+`cat $file2 |grep ^$|wc -l`]

然后阿拉得意的复制了上面这串代码到命令行执行了。

        wKiom1mCy1Kwjf1PAAAXchXbIuQ128.png

        嗯?光标闪啊闪的。哦,对了,忘记跟变量值了!于是,输入。(两个文件是事先拷贝好放在自建的临时文件夹里的。)

        wKiom1mCy1PjPJBXAAAg0TiyBfw072.png

        诶?怎么还在闪?难道是,正在进行运算中?阿拉,真是没办法,毕竟那两个文件加一起也有六七百行,就等等你吧!

        于是,两分钟过去了……

        五分钟过去了……

        十分钟过去了……

        wKiom1mCy1PjPJBXAAAg0TiyBfw072.png

        阿拉再迟钝也不会认为一个程序可以执行这么久啦!看来又有什么问题了!自从学通配符开始,阿拉就知道了linux的脾气有多臭。

        阿拉只好按下Ctrl+c。这下可好,丫还给我报错了。

        wKiom1mCy1OS5XWhAAA0UcPqPA4654.png

        yhoo!语法错误。行吧,那我改。

        wKioL1mCy1SDPszPAAApUFMWOSs503.png

        不行?好吧,我再改。

        wKioL1mCy1TDMsiMAAAnUeeGTb4101.png

        得,我改就是了。

        wKiom1mCy1SzwkWBAAAmAz_Io6U685.png

        大哥我错了。我不该头脑发热,啥也不想就知道干。我,我去查笔记。        

变量赋值:name='value'
(1) 可以是直接字串varname=“root" varname='this is a variable'
(2) 变量引用varname="$USER" varname=${USER} varname=$USER
(3) 命令引用varname=`COMMAND` varname=$(COMMAND)
变量引用:${name} $name
"" 弱引用,其中的变量引用会被替换为变量值
'' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

        对了,还有算术运算的。

实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))

(4) var=$(expr arg1 arg2 arg3 ...)   乘法时要转译* ,即\*

(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc

        在测试了各种括号的引用后,阿拉终于决定用变量了。这个时候,已经是晚上了。好吧,虽然浪费了太多时间,这件事还是要做到底的。

        啊啊,明明听课效率还不错的。

        但是还没完。怎么可能就这样就搞定了?阿拉是这么聪明的家伙吗?

        但你要说阿拉智商低的话,阿拉真的跟你急哦。虽然这种事发生的时候痛苦,但是写出来也就寥寥几笔。好吧,我想没谁解决完问题只好还要费劲心力想象苦闷时的状态的,呃,反正阿拉是不会回头看的人。

        毕竟,真正的黑暗永远是在还未到达的远方。

        带着经验上路就够了,如果还要装着痛苦,那又能走多远呢?

        就算如此,阿拉也从来没觉得学运维痛苦过。真正痛苦的是自己掌握的知识量永远达不到预期值。这就像一座图书馆摆在眼前,而你只有推开门的能力。

        再加之之前的价值观使阿拉形成了贪多的知识浏览观,总之测试及查资料浪费了一整天的时间,而阿拉也终于成功的百度到了read。测试功能可用时,阿拉兴奋的都要兜不住了。

        终于晚自习快结束的时候,阿拉搞出了下面这个脚本。(注释请忽略)

#!/bin/bash

# ------------------------------------------

# Filename:sumspace.sh

# Revision: 1.1

# Date: 20170802

# Author: zhangsan

# Email: 798761864@qq.com

# Website: 

# Description: 传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行

之和

# ------------------------------------------


echo -n "enter the first file route:"

read f1

echo -n "enter the second file route:"

read f2

file1=`cat $f1 |grep ^$|wc -l`

file2=`cat $f2 |grep ^$|wc -l`

echo "第一个文件$f1中所有空白行数为:$file1"

echo "第二个文件$f2中所有空白行数为:$file2"

echo "这两个文件中所有空白行之和为:$[$file1+$file2]"

unset f1 f2 file1 file2

exit 0


        亲测可以,执行结果就不粘了。因为,还没有结束……

        阿拉是不满意这个脚本的。疑问随之越来越多,怎么可能认可这个结果。

        阿拉尝试着不去用read。然后就是file1与`cat $f1 |grep ^$|wc -l`结果匹配,在自测频繁出错后。阿拉请教了和阿拉晚上一起睡觉的家伙。总之,姑且称她为李四好了。

        ————————此处省略阿拉犯蠢及被训的丢脸历史若干————————

        总结下来大抵如下几点:

        1.变量引用混乱(这个真的不是故意的。就是自己的手误很难看出来,但却对别人的bug很敏感。除了shell调试比较麻烦外,这点的确是阿拉自己的错。喂,明明之前很严谨的。最近脑子浑的很倒是无话可说。喂,给我冷静清醒啊,ahoo!)

        2.这个比较难说。虽然是主要原因,总结起来却并不容易。比如唯一一次问老师一个网络设置的问题。那操作阿拉之前也是执行多次,只要禁用个无线网络或本地连接就可以了。阿拉再禁用本地连接和无线连接里试了不下十遍。原则上是只保留一个就能网络畅通,当时是相互之间有冲突。然而,阿拉手下,那操作一次也没有产生相应效果。嘛,也许是操作太过频繁的原因。总之阿拉那看起来年轻,实际上OCM和RHCA证书都有的老师,轻轻右键一个禁用,问题解决了。阿拉当时都傻眼了,不过想的不是这操作明明我做过,而是为什么我不能解决问题,而老师解决了。这件事无形中助长了阿拉的嚣张气焰,阿拉开始了自我探究的道路,跟自己死磕到底,果真有不死不休之势。

        而偶尔找人解决些自己觉得棘手的问题,问题没解决,就觉得还不如自己钻研搜索思考,问题解决了,想的也是这么简单自己都不会真是够蠢,然后啃那块知识到撑。

        问题在于并不能有效的衡量自己。一方面对自己抱有无上限的期望,觉得每个题目,别人会,自己就必须要会。这个也是近年来的价值观所致,也不觉得有什么不好。而另一方面,习惯自己解决问题并且懒得废话就导致了越来越弱的存在感,于是更懒得与人交流。这样唯一的麻烦是,不知道自己的定位。嘛,好在阿拉是一个不会停止前行的人。

        3.$1与$2作为位置变量,是不能用别的变量名,诸如$f1、$f2之类的替代的。0.0这个最大的收获还是在第一遍代码粘出来发现原更改未保存才发现的。而利用$f1或者$z100传值那是read该干的。linux分工还是有点意思的。

        李四大概发表了一些怎么听都是无所谓听不听都行且全部都是废话的话,但是,阿拉的脚本能够执行了。可执行的代码如下:

#!/bin/bash

# ------------------------------------------

# Filename:sumspace.sh

# Revision: 1.1

# Date: 20170802

# Author: zhangsan

# Email: 798761864@qq.com

# Website: 

# Description: 传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

# ------------------------------------------


file1=`cat $1 |grep ^$|wc -l`

file2=`cat $2 |grep ^$|wc -l`

echo "第一个文件$1中所有空白行数为:$file1"

echo "第二个文件$2中所有空白行数为:$file2"

echo "这两个文件中所有空白行之和为:$[$file1+$file2]"


unset file1 file2

        已经不能说什么服不服气的了。老师也说过的话,代码越少,维护就越简单。这个,在昨天,也就是写这个计算空白行数的脚本的第二天,被阿拉又花费了一个晚上验证了。这是后话。

        新脚本是交互性差点,但实际上这是写给自己看的,而且我们又确实没学过read这个命令,echo -n也没学过。而老师留的题目,事实上都是我们现有的知识可以解决的。

        这个少了几行的代码执行起来如下:

        wKioL1mFTbniOnXeAABJXLJNUW4124.png

        这样又涉及到了知识不在面广,而在精通。(当然不是说知识面广式就不好。像我偶像毛泽东,那读的杂书多了去了)能用简单的代码完成复杂的功能,那也是设计linux的大牛们的初衷。linux不就是单个命令实现单个功能,命令堆砌成为脚本吗?

        同一个班里出来的学生,十年后差别大了去了。手里都是一样的工具,为什么别人能够做到的比你多?

        嗨,说到这个阿拉就忍不住想吐槽:为什么大家都能做到的事情你却只能达到一瓶子不满半瓶子咣当的程度?阿拉折腾这么久脚本都折腾出来了,某些人为什么还不肯加把劲呢?嘛,这个当然还是当事人最清楚。

        然而,事情不发生在你身上,你怎么可能了解别人的痛苦。就是,我写不出脚本的痛苦,你怎么可能知道???万一我折腾了还是没捣鼓出来呢?

        咳咳,回归正题。

        刚说到脚本的简洁很重要是吧!

        你要吐槽阿拉的脚本不简洁吗?拜托请看下开头。

        在最初的时候,没谁不想简洁的。

        阿拉在这上面浪费太多时间了。Linux里表范围和引用的(){}[]``""''太怪了。刚找到了这个https://wenku.baidu.com/view/ec74107449649b6649d74790.html。嘛,用的上固然好,用不着就继续找呗。没有解决不了的问题。Torvalds也是个人嘛,阿拉才不信人还能输给机器!嘛,就是,自己造出来的东西要对他负责啊!不然,他干嘛要乖乖听你话呢!

        对了,还有些班里同学的代码阿拉也一块放上来吧!


#!/bin/bash

# ------------------------------------------

# Filename: sumspace04.sh 

# Revision: null

# Date: 2017-08-04 06:32:47

# Author: zhaodong

# Email: 1213217229@qq.com

# Website: null

# Description: new file

# ------------------------------------------

read -p "please input first filename:" first_filename

read -p "please input second filename:" second_filename

file1=`cat $first_filename|grep ^[[:space:]]*$|wc -l`

file2=`cat $second_filename|grep ^[[:space:]]*$|wc -l`

echo "sum=$[$file1+$file2]"

        这个和阿拉的read版倒是很像呐!

#!/bin/bash

# ------------------------------------------

# Filename:sumspace.sh

# Revision:

# Date:2017-8-3

# Author:lily Lee

# Email:2319761707@qq.com

# Website:

# Description:This is script

# ------------------------------------------

_space=`cat $@ | egrep "^[[:space:]]*$" |wc -l`

echo $_space

        这个脚本的作者阿拉还挺熟呢。嗯,还不错吧这家伙。我给你说这家伙就是那种你怎么看都无害,但就是随时有可能吓你一跳的类型。扮猪吃老虎?不是啦,嗯,更像是确实能吃老虎的猪吧!

        那么,这里就结束了。嘛嘛,某种意义上天刚拂晓,水雷屯,君子以经纶。正是永远有可以改进的地方,才永远可以向前走。






















本文转自阿拉杜美美51CTO博客,原文链接:http://blog.51cto.com/amelie/1953359 ,如需转载请自行联系原作者





这篇关于戏说shell编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736410

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方