戏说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 ,如需转载请自行联系原作者





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值