小记一次shellscript的麻烦
小记一次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的麻烦的更多相关文章
- 编剧小记 — Contour
前言 Contour 是一款比较优秀的编剧辅助软件,按理说这篇文章应该归类到mac小记中,但其操作非常简单,基本上以写作提示为主.只怪所有提示都是英语,而且很多,每次使用打开 Contour 个别单词 ...
- 【转】实习小记-python中可哈希对象是个啥?what is hashable object in python?
[转]实习小记-python中可哈希对象是个啥?what is hashable object in python? 废话不多说直接祭上python3.3x的文档:(原文链接) object.__ha ...
- NodeJS+Express+MySQL开发小记(2):服务器部署
http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...
- 从Windows到linux小记
从Windows到linux小记 年后疯狂加班,趁着喘息的时间,更新一下安装linux的艰辛路程. 周四晚上,公司举办活动,好不容易从加班的节奏暂时脱离出来,我这人就是不能闲,只要一闲下来就会做die ...
- Java JPA小记
什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...
- OpenGL/GLSL数据传递小记(3.x)(转)
OpenGL/GLSL规范在不断演进着,我们渐渐走进可编程管道的时代的同时,崭新的功能接口也让我们有点缭乱的感觉.本文再次从OpenGL和GLSL之间数据的传递这一点,记录和介绍基于OpenGL3.x ...
- Python之Mac Scrapy爬虫小记
最近在尝试用Python爬虫,在装Scrapy的过程中遇到了一些麻烦. 上网搜索资料也未能解决command not found scrapy的报错. 最后我删除scrapy,用pip3.6 inst ...
- 【vim小小记】vim的复制粘贴(包括系统剪贴板)
1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只 ...
- Codeforces VP/补题小记 (持续填坑)
Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. 考虑括号序列维护树的路径信息和,是将左括号看做 ...
随机推荐
- Texture Format全解析
[Texture Format全解析] What internal representation is used for the texture. This is a tradeoff between ...
- jquery offset positon 获取位置不准的解决方法
问题: 本地开发时,由于使用了图片,而且使用了offset().top涉及到图片所在的div距离计算的部分,本地开发一切都没问题:但是部署到服务器上时却出现布局错乱,经过排查发现总是少了一个图片高度的 ...
- p2319 [HNOI2006]超级英雄
传送门 分析 从1道m进行匹配,找到第一个不能继续匹配的点即可 代码 #include<iostream> #include<cstdio> #include<cstri ...
- code2102 石子归并2
划分dp 注意环形,需要把原数复制成两份再进行,详见: http://www.cnblogs.com/FuTaimeng/p/5427426.html 初始条件:dp[i][i]=0 转移方程:dp[ ...
- 去除json数据的某些键值对
假如现在要处理的原始数据是字符串.形式如下: var vJson = { name: "张三", class: "软件工程一班" ,other:"无效 ...
- block functions区块函数插件的定义与使用
在插件目录plugins里新建文件 block.插件名.php文件(如 block.插件名.php) 例:block.test2.php <?php function smarty_block_ ...
- mysql-day01
Microsoft Windows [版本 10.0.17134.648](c) 2018 Microsoft Corporation.保留所有权利. C:\Users\lijun>java用法 ...
- Spring Boot利用poi导出Excel
至于poi的用法就不多说了,网上多得很,但是发现spring boot结合poi的就不多了,而且大多也有各种各样的问题. public class ExcelData implements Seria ...
- oracle11g客户端配置及使用(Instant Client)
http://www.oracle.com/technetwork/topics/winx64soft-089540.html http://www.cnblogs.com/ychellboy/a ...
- CodeForces 288A Polo the Penguin and Strings (水题)
题意:给定一个字符,让你用前 k 个字符把它排成 n 长度,相邻的字符不能相等,并且把字典序最小. 析:其实很简单么,我们只要多循环ab,就行,最后再把剩下的放上,要注意k为1的时候. 代码如下: # ...