小记一次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. MAC命令大全

      OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 ...

  2. php static 变量声明

    <?phpfunction test($key){ static $array = array();  /* 静态变量是只存在于函数作用域中的变量,注释:执行后这种变量不会丢失(下次调用这个函数 ...

  3. Jedis连接Redis三种模式

    这里说的三种工作模式是指: 1.单机模式 2.分片模式 3.集群模式(since 3.0) 说明图详见以下: 使用单机模式连接: private String addr="192.168.1 ...

  4. [C++] Const Summary (mind map)

    Const Summary

  5. [SoapUI] 如何让某个步骤的Assertion失败之后继续执行后面的步骤

    To continue tests executing after failed test step you need disable "Abort on error" optio ...

  6. HBase列族高级配置

    转自:http://blog.sina.com.cn/s/blog_ae33b83901018euz.html ------------------ HBase有几个高级特性,在你设计表时可以使用.这 ...

  7. 在linux下使用CMake构建应用程序

    本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法. CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来.文中通过一些例 ...

  8. Java设计模式(2)——工厂方法模式

    工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ...

  9. AngularJs(v1)相关知识和经验的碎片化记录

    1.利用angular指令监听ng-repeat渲染完成后执行脚本 http://www.cnblogs.com/wangmeijian/p/5141266.html 2.$http的POST请求中请 ...

  10. 实践作业3:白盒测试----junit的难点DAY11.

    本次白盒测试 需要独立完成整个项目和工具的配置安装运行操作,并编写.运行测试脚本,并完成实验的一些小细节等等. 首先,导入Junit测试框架所需的Jar包 然后编写测试脚本,为.java运行程序,见打 ...