小记一次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. 网站转为https协议,苹果商店应用转为https协议总结

    log_format www.44755.com '$remote_addr - $remote_user [$time_local] "$request" ' '$status ...

  2. lock free queues

    无锁队列,下面链接是源码,包含4种队列:单生产者单消费者/多生产者多消费者,队列定长/不定长.元素建议为简单数据类型,复杂类型都采用指针形式. queues-master.zip 源码来源:https ...

  3. eval 是执行一段完整的js字符串代码,并将结果返回

    var strArray="[{"message1":{ "id": "-1","content": &quo ...

  4. ubuntu14.04 64 位 vmware tools 问题2

    当提示说open-vm-tools版本太低时可以这样解决 0.使用最新版本12.5的vmware player. 1.sudo apt-get autoremove open-vm-dkms open ...

  5. Boost线程详解

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  6. vs2017编译并配置libcurl入门教程

    libcurl可以用来发送http请求,是c/c++发送http请求常用的库 下载libcurl源码包: libcurl下载地址:https://curl.haxx.se/download.html ...

  7. Greeplum 系列(三) 基本用法

    Greeplum 系列(三) 基本用法 <PostgreSQL 教程>:https://www.yiibai.com/postgresql 一.Greeplum 登陆与创建 1.1 登陆 ...

  8. itunes win10应用商店安装 升级固件路径

    win + r 在运行中输入: %localappdata%\Packages\AppleInc.iTunes_nzyj5cx40ttqa\LocalCache\Roaming\Apple Compu ...

  9. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

  10. Type Hierarchy

    Window - Preferences - General - Keys Name:         Open Type Hierarchy Description: Open a type hie ...