小记一次shellscript的麻烦

一、起因:

之前写过篇文章 文本分析实例 ,大致的内容就是对 “nginx的web服务器进行日志分析,删除不被访问的截图”

点我打开哔哩哔哩 点我下载脚本文件

二、规范:

1、脚本应该有完整的状态判断

set -b 一旦出现问题立刻回报执行状态。

exit 同于退出shell,并返回给定值。

2、[ ]( ) 内容前后空格比较好,不容易出错。(多扯点)

一般 [ ] 是shell中 if、while 标准写法,(( )) 是 shell 中的 for 标准写法。然而 php if for while、javascipt if for while、java 等却使用 if( ) for() 这样的表达方法,Python 干脆不用。

另外{} 似乎在所有语言中都有“快”的意思,{} 内可以写更多的赋值、运算、显示等 “动作”。( 注意 '()' 一般内部是判定 )。Linux shell 中对 "${}" 还有好玩的地方:防止参数被扩展。

3、为了寻求可扩展和更改特性,一般要求给重复使用的命令或字符串赋值变量。

三、麻烦:

1、find 命令

log_filename=access.log-*.gz
log_lsfilename=`find $log_path -name "$log_filename" | wc -l` # 可以看到我给 $log_filename 加上了双引号

之前报错:find: paths must precede expression

翻译过来:目录必须优先于表达式

报错原因:因为没有把 * 加上双引号,此时的 find 命令 -name 后的 $log_filename(即 access.log-*.gz ) **被扩展具有多个文件名 **。

解决方案:-name 的匹配字符串一定要用单引号或双引号包住,防止发生扩展。

注意地方: 如果在 shell 中希望该命令执行完成以后赋值给变量需要使用 `` (它是你键盘符号 ~ 下面那个) 更多参考点我

2、 if 条件语句

if [ $log_lsfilename -le 0 ];then # 看到我使用的是 [] 之前是 [[    ]]

之前报错:command not found

报错原因:使用不正确的判断隔断符号

  • 正确的是使用 [ ] ,好处是和 shell 大多数流程控制统一,弊端是必须使用英文的判断(包括但不仅限于:-lt 小于 -le 小于等于 -gt 大于 -ge 大于等于 -eq 等于 -ne 不等于)
  • 还可以是使用(( )),好处是可以使用数学的大于小于等于,弊端是记忆不方便有冲突很怪。

3、gunzip 命令

gunzip -f ${log_path}/$log_filename && printf "\n\ndone.\n"  # gunzip 加上了 -f 参数

报错无法重现,但这里提供 --help 帮助信息内容: force overwrite of output file and compress links

翻译内容:强制重写输出文件并压缩链接

报错原因:在终端需要使用 -f 参数已防止文件出现等待

注意地方:和gunzip无关。是${}这个是防止命令扩展,上文已经讲解过了。我想说的是多个变量加上字符串都可以直接打,千万不要加引号,系统会直接输出。

四、畅想与说几句:

其实还是蛮伤心的,原来不是这么写的。原本的思路是先判断是否存在日志的目录,再判断find有没有结果最后再执行。这样就会有个问题就是需要像python一样给前面的if语句pass指令,后面有位大神提醒我说 ";" 就像 python 中的 “pass” 一样。(当然其实在终端是一样的,但放到脚本里就会系统不认...btw:print 脚本也不认需要 printf)

反正把,写这种判断还是要有写思路的别把自己写傻了另外思路要广别写的太啰嗦,产生很多冗余代码。这样对阅读和重构都是不利的,最后送一句话:傻子都能写出机器能理解的代码,但写出人能理解的代码却不容易。

小记一次shellscript的麻烦的更多相关文章

  1. 编剧小记 — Contour

    前言 Contour 是一款比较优秀的编剧辅助软件,按理说这篇文章应该归类到mac小记中,但其操作非常简单,基本上以写作提示为主.只怪所有提示都是英语,而且很多,每次使用打开 Contour 个别单词 ...

  2. 【转】实习小记-python中可哈希对象是个啥?what is hashable object in python?

    [转]实习小记-python中可哈希对象是个啥?what is hashable object in python? 废话不多说直接祭上python3.3x的文档:(原文链接) object.__ha ...

  3. NodeJS+Express+MySQL开发小记(2):服务器部署

    http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...

  4. 从Windows到linux小记

    从Windows到linux小记 年后疯狂加班,趁着喘息的时间,更新一下安装linux的艰辛路程. 周四晚上,公司举办活动,好不容易从加班的节奏暂时脱离出来,我这人就是不能闲,只要一闲下来就会做die ...

  5. Java JPA小记

    什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...

  6. OpenGL/GLSL数据传递小记(3.x)(转)

    OpenGL/GLSL规范在不断演进着,我们渐渐走进可编程管道的时代的同时,崭新的功能接口也让我们有点缭乱的感觉.本文再次从OpenGL和GLSL之间数据的传递这一点,记录和介绍基于OpenGL3.x ...

  7. Python之Mac Scrapy爬虫小记

    最近在尝试用Python爬虫,在装Scrapy的过程中遇到了一些麻烦. 上网搜索资料也未能解决command not found scrapy的报错. 最后我删除scrapy,用pip3.6 inst ...

  8. 【vim小小记】vim的复制粘贴(包括系统剪贴板)

    1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只 ...

  9. Codeforces VP/补题小记 (持续填坑)

    Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ​ 考虑括号序列维护树的路径信息和,是将左括号看做 ...

随机推荐

  1. 【UVA11212 算法竞赛入门经典】 Editing a Book 【IDA*】

    题意 你有一篇由n(2<=n<=9)个自然段组成的文章,希望将它们排列成1,2,···,n.可以用剪切和粘贴来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注意剪贴板只有一个 ...

  2. crontab学习笔记

    一.crond与crontab简介 在Linux系统中,循环运行的例行性计划任务,是由 cron (crond) 这个系统服务来控制的,而crontab命令则被用来提交和管理用户的需要周期性执行的任务 ...

  3. 2015年2月编程语言排行榜:JavaScript排名达到历史最高

    JavaScript在赢得2014年最后一个月的TIOBE编程语言奖后,并且还在不断走强.在二月份JavaScript就超过了PHP,并 且达到它有史以来最高的位置,排行到TOP 6.另一方面,Obj ...

  4. LoadRunner11学习记录四 -- 集合点

    LoadRunner集合点的设置: 我们来想象一个场景,10名运动员参加长跑比赛,出发点同时起跑,他们是并排奔跑的:跑了N圈之后,因为有体能更强的,有体能稍弱的,他们的队形并排变成了前后.几乎一个跑道 ...

  5. tp5循环+判断

  6. [Training Video - 3] [Groovy in Detail] Non-static and Static variables, objects and object referances

    log.info "starting" // we use class to create objects of a class Planet p1 = new Planet() ...

  7. 使用 ServiceStack 构建跨平台 Web 服务(转)

    出处:http://www.cnblogs.com/shanyou/p/3348347.html 本文主要来自MSDN杂志<Building Cross-Platform Web Service ...

  8. kcp结构体字段含义

    conv 会话IDmtu 最大传输单元mss 最大分片大小state 连接状态(0xFFFFFFFF表示断开连接)snd_una 第一个未确认的包snd_nxt 下一个待分配的包的序号rcv_nxt ...

  9. SurfaceView实时绘图,视频流

  10. 编写高质量代码改善C#程序的157个建议——建议129:泛型类型参数要以T作为前缀

    建议129:泛型类型参数要以T作为前缀 作为一种约定,泛型类型的参数要以T作为前缀.如委托声明: Action<T1,T2> 其中,泛型类型参数名不应该处理成: Action<Arg ...