忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
1234下一页
最近访问板块 发新帖
查看: 36327 | 回复: 31

[学习共享] 【大话IT】总结篇:你遇到过哪些shell陷阱? [复制链接]

论坛徽章:
51
CU十四周年纪念徽章
日期:2017-07-31 15:08:46CU十四周年纪念徽章
日期:2015-11-25 15:35:40白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:532015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之大阪钢巴
日期:2015-06-25 17:30:04黄金圣斗士
日期:2015-12-02 11:44:35程序设计版块每日发帖之星
日期:2015-12-22 06:20:00
发表于 2017-03-30 11:10 |显示全部楼层
获奖公布:
精彩回复:本友会机友会摄友会   o枫叶o飘零   Forgaoqiang   Fl_wolf   799029078
请以上获奖人员在5月25日前将姓名、电话、邮箱、公司、职务、快递地址站短给hyukhae079408,以便尽快给大家发放礼品。


话题背景:   
不管哪种编程语言, 总会有某些写法会被人认为这是编程语言本身的陷阱, 或者说是个坑,因为它貌似不符合人们的常规认知, 或者说我们想当然的认为应该是这么做的.
   

今天我们就Linux shell脚本语言来探讨下其所谓的”陷阱”.
   

我们先来看一张动图, 我们遍历一个目录下的mp3文件,然而结果跟我们想象中的却不一样!

bashPitfalls1.gif

    看到这个图, 你有想过, 单纯的这样写

for i in $(ls *.mp3); do
    some command $i
done

是错的, 或者说是不严谨的吗?

再比如:


QQ图片20170330121300.gif
#!/bin/bash

count=0

seq 5 | while read line; do
    ((count++))
    echo "count=$count"
done

echo "End:count=$count"

为什么最后 count 的值压根没变?

更多类似的"坑", 请仔细阅读: http://mywiki.wooledge.org/BashPitfalls, 个人认为这些都是非常经典的"坑", 然后再来探讨下我们的问题.


讨论问题:

1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?
2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
4. 你还遇到过其他你认为是"坑"的坑吗?


活动时间: 3月30日-4月30日


活动奖励:
活动结束后,我们将会选取5个精彩回复,送创意镜头水杯一个。





DTCC 2017 来啦!

随着云计算和大数据时代的来临,数据正在以前所未有的速度成为各个领域价值创造的核心驱动力。

在此背景下,国内最受关注的数据库技术盛会——2017第八届中国数据库技术大会(DTCC2017)将于2017年5月11-13日如约而至。本届大会以“数据驱动•价值发现”为主题,汇集来自互联网、电子商务、金融、电信、政府、行业协会等20多个领域的120多位技术专家,共同探讨Oracle、MySQL、NoSQL、云端数据库、智能数据平台、区块链、数据可视化、深度学习等领域的前瞻性热点话题与技术。大会共设定2大主场和20个技术专场,将吸引5000多名IT人士参会,为数据库人群、大数据从业人员、广大互联网人士及行业相关人士提供最具价值的交流平台。




官网链接:http://dtcc.it168.com/
购票链接:http://dtcc.it168.com/goupiao.html

欢迎扫码关注DTCC官方微信,获取最新信息!




打赏鼓励一下!

2人打赏

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
发表于 2017-03-30 11:34 |显示全部楼层
顶,六神,

论坛徽章:
0
发表于 2017-03-30 11:55 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-04-05 16:34 编辑

1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?
答:
不懂shell,难以回答。
欢迎实验下述linux版powershell代码:
foreach ($i  in (dir /powershell/*.txt))
{
    $n++
    echo $n
    echo $i.name
}
2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
答:
特殊符号的处理,是个令人头疼的问题。尤其是传值过程中。

3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
答:
面向字符的命令行,扣字符难,必须依赖正则。请看问题:
如何找出系统中端口大于1024的程序
http://bbs.chinaunix.net/thread-4260684-1-1.html
我的解说:
netstat 是win,linux通用的工具。
cmd下命令少于linux,导致win命令行下,扣字符串比linux更难。
所以大家以前总说【win命令行就是个p,当然是linux命令行强大】
但是捏,到powershell就不一样了。powershell用【面向对象命令】【属性】
Get-NetTCPConnection |Where-Object {$_.LocalPort -ge 1024}
解决了扣字符串难的问题。
现在大家可以说【90%以上的linux命令行大坑,中坑,都可以通过powershell避免

4. 你还遇到过其他你认为是"坑"的坑吗?
答:
遇到过,我把这些坑分成,【大坑】和【中坑】两种。

shell大坑==shell癌症==避无可避。
1.1 我觉得有crlf癌症。
1.2 文本编码类型的识别,依赖LANG癌症。
1.3 正则难,学习曲线陡峭,难以让别人理解。容易出错。
1.4 扣字符难,必须依赖正则。
shell中坑==shell陷阱==很难躲避
字符冲突问题,字符转义问题。

问:如何解决,避免坑?
答:难!你还对这些坑抱有解决的希望吗?能用的话,建议用powershell。这个是救世主。
问:救世主有何招数?面向对象脚本语言比面向字符强在哪?powershell比bat强在哪?
答:
属性,方法。
属性:减少扣字符串。
方法:减少重复造轮,更严谨。
问:我想呵呵你这头  就是猪!
答:
我想跟你探讨下面2个问题。

问:shell和python谁更强大?
答:
各有所长,可以互补。但是却无法互补。下面详述。
问:为什么说(也是面向对象的)python不是救世主。
答:
1 python有的面向对象功能,linux版powershell都有。
2 python没有命令行。
2.1 python无法成为ssh默认终端,linux版powershell可以。参见章节:《两台带有sshd的linux机子?怎么用powershell连接并发送命令?》
2.2 python中使用shell命令(awk,grep等),非常麻烦。需要增加很多py语法和代码。linux版powershell运行awk这些命令和bash一样。
3 python没有管道。让n个【命令行程序】之间传值,非常麻烦。需要增加很多py语法和代码。linux版powershell有管道,运行awk这些命令和bash一样。
4 python有版本2,版本3不兼容的癌症!问题。linux版powershell没有这样的问题。
4.1 这些问题包含编码问题。
此小问题结论:
shell命令如grep等,对编码支持本就不好,不如powershell在家上上述4.1的编码问题。再加上上述2,3点。
令linux人痛不欲生,顾很少有人在py中用外部命令。【py命令库】和【shell命令】死不往来,基本无法互补。而linux版ps就不同了。

zhs.gif

长江后浪推前浪,继shell,python,perl之后,powershell脚本也来一展风骚了。

围观powershell脚本优势:
http://bbs.chinaunix.net/thread-4254360-1-1.html  #取进程名
http://bbs.chinaunix.net/thread-4254363-2-1.html  #csv转json
http://bbs.chinaunix.net/thread-4253179-1-1.html  #取文件名
http://bbs.chinaunix.net/thread-4260237-1-1.html  #数据库客户端模块。
http://bbs.chinaunix.net/thread-4260747-1-1.html  #数值格式化



论坛徽章:
51
CU十四周年纪念徽章
日期:2017-07-31 15:08:46CU十四周年纪念徽章
日期:2015-11-25 15:35:40白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:532015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之大阪钢巴
日期:2015-06-25 17:30:04黄金圣斗士
日期:2015-12-02 11:44:35程序设计版块每日发帖之星
日期:2015-12-22 06:20:00
发表于 2017-03-30 14:04 |显示全部楼层
回复 3# 本友会机友会摄友会

你这都回复的啥呀这是..

论坛徽章:
26
未羊
日期:2014-10-24 10:34:09IT运维版块每日发帖之星
日期:2016-01-20 06:20:002016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之吉林
日期:2016-02-22 10:38:48wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之深圳
日期:2016-10-22 10:02:5215-16赛季CBA联赛之辽宁
日期:2016-11-09 14:04:45黑曼巴
日期:2016-11-23 11:16:52极客徽章
日期:2016-12-07 14:03:402017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之新疆
日期:2017-03-24 16:36:19
发表于 2017-03-30 14:06 |显示全部楼层
本帖最后由 o枫叶o飘零 于 2017-04-17 16:00 编辑

先占坑  

1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?
对于大部分人来说算是"陷阱",因为一般我们一般写shell就直接拿来就写,或者从网上剽窃shell代码。
其实说到底,我们还是没有对这门语言深入的了解,并没有去通读手册。总觉得这门语言是很简单,拿来就能用。

2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
在一开始没有注意细节,到后面发现,shell比其它语言的细节要变态得多。(例如单双引号、空格、选项顺序、文件自身编码问题等等....)

3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
学到了不少,比如文本编码等等
最主要的是学到了现在虚拟机上测试,并且还进一步增加了排错的exp

4. 你还遇到过其他你认为是"坑"的坑吗?
遇到过几点:
1.在windows下编写shell脚本,然后传到linux无法运行,后来知道用cat -A 查看了有windows的字符才明白了其中的问题
2.shell中的通配符和正则容易混淆
3.空格问题,这有点忧桑.  你说shell空格严格呢,有时确实很严格,说不严格呢,有时又不严格。例如在代码缩进这一块,shell是不用遵循严格的缩进的。而语法就必须严格把控空格(例如定义变量a='xxx' (等号2边不能有空格),又例如expr 1 + 1  (符号和数字中间有空格)))。

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49子鼠
日期:2014-09-28 14:11:06巳蛇
日期:2014-10-11 12:52:08双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
发表于 2017-03-30 14:07 |显示全部楼层
顶你个肺!威武,支持!

论坛徽章:
3
15-16赛季CBA联赛之北控
日期:2016-06-06 21:01:08程序设计版块每日发帖之星
日期:2016-06-19 06:20:00程序设计版块每日发帖之星
日期:2016-07-17 06:20:00
发表于 2017-03-30 14:12 |显示全部楼层
顶你个肺,前排先占个坑,后面列队摆好姿势!

论坛徽章:
1
辰龙
日期:2014-12-17 15:54:35
发表于 2017-03-30 14:16 |显示全部楼层

顶你个肺!威武,支持!

论坛徽章:
0
发表于 2017-03-30 14:30 |显示全部楼层
支持一下。我觉得基本都让某楼说了不少。
然后,每个语言都有所谓的缺陷,因为没有最好,只有最合适,所以才有那么多种语言。
然后,对于新手来说,很多小问题都是所谓的陷阱,其实还是不懂或不严谨而已,自己写东西的习惯严谨了,就不会有那么多坑。

论坛徽章:
5
CU十四周年纪念徽章
日期:2016-06-30 00:03:1415-16赛季CBA联赛之天津
日期:2016-12-27 16:24:1415-16赛季CBA联赛之辽宁
日期:2017-03-14 15:38:3515-16赛季CBA联赛之江苏
日期:2017-03-14 17:09:4815-16赛季CBA联赛之青岛
日期:2017-04-04 16:15:48
发表于 2017-03-30 14:40 |显示全部楼层

顶你!威武,支持!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票7.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP