shell笔记

背景

在工作中,难免会使用shell处理一些繁杂的事情,比如图片的筛选分类等,但是在书写脚本时一不小心就会出问题,下面,记录一下容易出问题的地方。


内容

1 路径带空格

比如说一个文件夹里面都是图片,你要把图片删除掉,不知道是谁脑残的在命名图片的时候加上了空格,比如我们其中一张图片的名字叫小花的 照片.PNG,而你的代码是这样的,

#!/bin/bash
for p in ./*;do
    rm $p
done

那么你在写如下代码遍历文件夹时,一定会遇到下面的错误

rm: ./小花的: No such file or directory
rm: 照片.PNG: No such file or directory

怎么会出现这样的错误呢,我想你一定猜到了,对,是空格,空格把这个图片的名字分成了两部分,shell在读取字符串的时候,会以这样的形式去读取:

rm 小花的 照片.PNG

其实相当于rm 小花的rm 照片.PNG,那怎么办呢,我们必须让shell 指令读取整个字符串,而不是把后面的参数认为是多个文件名,最简单的方法是用双引号把我们的变量引起来。这里我们延伸一下,在shell字符串中,有两种方式表示字符串:

1 单引号引起来:
a、 单引号的任何字符都会原样输出,单引号里面的变量无效
b 、单引号里面不能出现单个单引号(必须成对出现)
2 双引号引起来
a 、双引号里面可以有变量
b、双引号里面可以出现转义符

通过上面的解释,我们知道了,首先$p是变量,如果你用单引号括起来,那么我们的$p就会变成了$p字符串,已经再在是代表着小花的 照片.PNG的变量,用双引号就不会出现问题。至于说更复杂的做法这里不推荐,毕竟脚本就是为了简化。那么更改后的脚本时这样的:

#!/bin/bash
for p in ./*;do
    rm "$p"
done

2 比较浮点数的大小

在工作种虽然遇到的不多,但是遇到了才发现自己还是有很多东西需要掌握的啊。比如,在工作中要从一个日志文件中筛选出得分在0.9以上的图片,那么我们就要比较得分和0.9的关系了,于是我自信的写下了以下代码:

#!/bin/bash
6 logFile="/Users/lilei/Desktop/logtxt"
7  while read line;do
8    score=$($line##*==)
9    if [ $score >0.9 ];then
10      echo $line
11    fi
12 done<$logFile

但是,却报这样的错误……

calculate.sh: line 9: 0.9: No such file or directory

也就是说if判断这句除了问题,
那么,我们如何进行浮点数判断呢,查资料后发现原来虽然bash内置了对四则运算的支持,但是并不支持浮点运算,mygod,强大的bash竟然不支持浮点数运算,那么我该怎么办???
经过一番google发现大概有两种方法:

2.1 利用bc神器

bc其实是linux下计算语言,其完整的名称是An arbitrary precision calculator language,能够帮助我们进行各种精度的数据运算,当然对于浮点数的计算也不在话下,其正确使用方式如下:

#!/bin/bash

6 logFile="/Users/lilei/Desktop/logtxt"
7  while read line;do
8    score=$($line##*==)
9    if [ `expr $score >0.9|bc` =1 ];then
10      echo $line
11    fi
12 done<$logFile

我们可以很清楚的看到上述表达其实是对括号内的表达式进行了一个运算,然后判断是否为真。

2.2 利用awk

对于awk的用法,自己可以百度脑补,下面我们来看看如何用它来判断浮点数的大小

#!/bin/bash

 logFile="/Users/lilei/Desktop/logtxt"
  while read line;do
    score=$($line##*==)
    result=$(echo | awk -v x=$score '{if(x>0.9){print 1}else{print 0}}')
    if [ $result -eq 1 ];then
      echo $line
    fi
 done<$logFile

当然上述awk的写法不止一种,以上只是其中一种……

3 坑爹的if判断

如果你第一次接触shell,你肯定会对if要和[[[之间留空格,[[[要和表达式之间留空格而想摔杯子,我也是,真觉得这种设计实在太变态,它会让我们经常因忘记加空格而出错,还有,如果你接触过shell,那么你知道[][[]]的区别吗?那么,我们接下来就来说说。
如果我们要判断一个路径是不是一个真实存在的路径,那么我们用[]会这样写:

if [ -d "$dir" ];then
    echo $dir
fi

为什么要加上双引号呢,前面第一条说过,那么要是用[[]]怎么写呢,看如下:

if [[ -d $dir ]];then
    echo $dir
fi

看到了吗," "去掉了。在stackoverflow上给出的答案是[[ ]]语法是对[ ]语法的改进,前者有许多后者不具有的特性,如上面所展示的,[[ ]]能够自动处理带空格的字符串,不用你去添加告诉它在什么范围内是字符串,当然,如果你要是硬要加双引号,那么也可以。
另外,[[ ]]可以让你像c语言一样进行&&||等多条件判断,还可以用<>进行字符串或数字比较,例如:

if [[ $a > 3 || $a < 10 ]];then
  echo $a
fi

但是[ ]却不行。
另外,[[ ]]还提供了一种模式匹配的写法,通用语法if [[ $a = *patternStr* ]],例子如下:

path="/Users/guoran/Desktop/"
if [[ $path = *guoran* ]];then
  echo $path
fi

这里需要说明一点,上面等号后面的匹配字符不能加双引号,如果加了就会报语法错误(这个暂时还不知道是为什么?希望大神指教),等号可以写成===都可以,这基本是我最近写脚本时遇到的坑,记录一下。


思考

发现总是赖得记东西,总是以浪费时间,工作忙为借口来宽慰自己,但是发现不记东西,反而看过或写过的东西过了一段时间就又忘记了,从现在起,要强迫自己开始记录一下自己工作过程中遇到的问题,成长要从点滴做起,记住哈,少年!!!


参考资料:
https://stackoverflow.com/questions/3427872/whats-the-difference-between-and-in-bash
https://unix.stackexchange.com/questions/306111/what-is-the-difference-between-the-bash-operators-vs-vs-vs/306115

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 1.认识php php是服务端嵌入到HTML中的脚本语言。php的功能包括但不限于: 收集表单数据 生成动态网页 ...
    楠哥哥_0b86阅读 831评论 3 1
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,148评论 1 44
  • 关于 Swift 重要这个文档所包含的准备信息, 是关于开发的 API 和技术的。这个信息可能会改变, 根据这个文...
    无沣阅读 4,271评论 1 27