免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: reyleon
打印 上一主题 下一主题

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

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
11 [报告]
发表于 2017-03-30 15:04 |只看该作者
细节,细节,细节……

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期: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:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
12 [报告]
发表于 2017-03-30 15:19 |只看该作者

【大话IT】总结篇:你遇到过哪些shell陷阱?

seesea2517 发表于 2017-03-30 15:04
细节,细节,细节……

赞同的不能再赞同

论坛徽章:
18
卯兔
日期:2013-09-27 17:41:0615-16赛季CBA联赛之佛山
日期:2016-07-09 17:34:45操作系统版块每周发帖之星
日期:2015-12-02 15:01:04IT运维版块每日发帖之星
日期:2015-12-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-07 06:20:00IT运维版块每日发帖之星
日期:2015-10-03 06:20:00IT运维版块每日发帖之星
日期:2015-10-01 06:20:00羊年新春福章
日期:2015-04-01 17:56:06拜羊年徽章
日期:2015-04-01 17:56:062015年迎新春徽章
日期:2015-03-04 09:49:452015年辞旧岁徽章
日期:2015-03-03 16:54:15天秤座
日期:2015-01-14 06:39:28
13 [报告]
发表于 2017-03-31 06:53 |只看该作者
占座更新...............

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
14 [报告]
发表于 2017-03-31 09:58 |只看该作者
没啥大坑。因为我更多的是用BAT。刚才试了一下,第一个脚本似乎运行正常。我把*.mp改为了*.sh,达到了我想要的效果。

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-25 06:20:002017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:2115-16赛季CBA联赛之新疆
日期:2018-04-23 13:55:2315-16赛季CBA联赛之辽宁
日期:2018-07-23 08:59:12
15 [报告]
发表于 2017-03-31 11:15 |只看该作者


1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?
明显就是对语言的了解不够
2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
有的  shell 引号有  'fk'   "fk"   ""fk""   """fkk""" 效果不一样,理解了用多了就习惯了。
3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
没有什么知识点可言,就是知道使用方式,下次能更快的得出自己想要的结果就好了。
4. 你还遇到过其他你认为是"坑"的坑吗?
以前 shell 用 ``  变量执行  ,规范其实是  $(cmd)

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-25 06:20:002017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:2115-16赛季CBA联赛之新疆
日期:2018-04-23 13:55:2315-16赛季CBA联赛之辽宁
日期:2018-07-23 08:59:12
16 [报告]
发表于 2017-03-31 11:17 |只看该作者


1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?
明显就是对语言的了解不够
2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
有的  shell 引号有  'fk'   "fk"   ""fk""   """fkk""" 效果不一样,理解了用多了就习惯了。
3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
没有什么知识点可言,就是知道使用方式,下次能更快的得出自己想要的结果就好了。
4. 你还遇到过其他你认为是"坑"的坑吗?
以前 shell 用 ``  变量执行  ,规范其实是  $(cmd)

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-25 06:20:002017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:2115-16赛季CBA联赛之新疆
日期:2018-04-23 13:55:2315-16赛季CBA联赛之辽宁
日期:2018-07-23 08:59:12
17 [报告]
发表于 2017-03-31 11:18 |只看该作者


1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?
明显就是对语言的了解不够
2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
有的  shell 引号有  'fk'   "fk"   ""fk""   """fkk""" 效果不一样,理解了用多了就习惯了。
3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
没有什么知识点可言,就是知道使用方式,下次能更快的得出自己想要的结果就好了。
4. 你还遇到过其他你认为是"坑"的坑吗?
以前 shell 用 ``  变量执行  ,规范其实是  $(cmd)

论坛徽章:
40
水瓶座
日期:2013-08-15 11:26:422015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之乌兹别克斯坦
日期:2015-03-27 14:01:172015年亚洲杯之约旦
日期:2015-03-31 15:06:442015亚冠之首尔
日期:2015-06-16 23:24:37IT运维版块每日发帖之星
日期:2015-07-01 22:20:002015亚冠之德黑兰石油
日期:2015-07-08 09:32:07IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00IT运维版块每日发帖之星
日期:2015-10-11 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
18 [报告]
发表于 2017-04-01 14:47 |只看该作者
本帖最后由 forgaoqiang 于 2017-04-26 21:07 编辑

专业写Shell多年,分享下经验,先占坑,绝对干货~~~另外可以参考《UNIX憎恨者手册》
  
①双引号的坑
在shell中双引号绝对是神器,使用肯定没问题,如果不使用问题可能就会来了,比如判断

if [ "$name" == "root" ];then

如果$name变量未声明,就会有错误出现,如果加上就没有问题

另外就是比如 file=$(cat /proc/passwd) 想要读取用户文件进行处理,如果读取完成后下面的输出
  1. echo $file | grep "root"
复制代码

会怎么样呢,哈哈 你得到的是这个文件,而不是命中的那一行,总之双引号加上肯定没错,来个变态用法,比如拼接变量和字符串

  1. name="test"
复制代码



②空格和空行的问题

shell中正常语句不能有空格是相当变态的要求,其他的语言没有这问题,比如赋值
  1. name = "myname"
复制代码
上面直接语法错误,但是这样的表达式又是对的
  1. a=1
复制代码
还有就是使用heredoc语法的时候,第二行起都得顶着左边写,挺烦人

还有重定向,其实下面两种方式是等价的,不知道第一种多少人知道呢

  1. &>output.file  和  >output.file 2>&1
复制代码

顺便说下crontab的每分钟运行,其实下面的写法都对
  1. * * * * * your shell
复制代码


shell中也存在eval把字符串当作命令执行的功能
  1. eval "cat /tmp/dhcp.lease
复制代码


shell中使用 [[ ]] 的目的
比如下面的计算,采用双[[ ]] 的目的是一旦 $num 为空会导致内部出错,程序无法继续执行,但是 [] 本身表示假,可以让程序继续执行下去。
  1. [[ "$num" -gt 5 ]]
复制代码

不使用的话会报错,比如
  1. -bash: [: : integer expression expected
复制代码







论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
19 [报告]
发表于 2017-04-02 12:42 |只看该作者
shell 确实有很多奇怪的地方。有些当时遇到百思不得其解。久了久了也就忘记了。有一本 《UNIX 憎恨者手册》 的书里面讲了很多 shell 奇怪的行为。
因为 shell 是由很多命令组成的。每一个命令可能自己写解析参数的函数,也可能直接调用 getopt 这样的库函数。导致命令和命令的使用有着很大的区别。
从最简单的来说,不同命令的 -r 或者 -R 定义就不一样。尽管可以通过 manual page 查的到,但也常常被误用。例如 scp 只能用 -r。grep 就可以用 -R。
再复杂一点来说,有些命令参数就比较奇怪了。例如 dd ,if of 这些都要加一个 =。而大部分的命令都是通过参数加对象。例如 cscope -i cscople.file.这样也引来了一些不一致性。

再从语言本身来看,单引号,双引号,空格,总有把人搞疯的时候。尤其是命令组合的比较多级的时候。我觉得 shell 不是一个好语言,但是方便,而且也没有其他更好的了。凑合用吧。

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-25 06:20:002017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:2115-16赛季CBA联赛之新疆
日期:2018-04-23 13:55:2315-16赛季CBA联赛之辽宁
日期:2018-07-23 08:59:12
20 [报告]
发表于 2017-04-05 15:10 |只看该作者
1. 你认为这些真的是shell语言的"陷阱"吗?还是说这只是我们对语言了解的不够深入?个人感觉这些只是编码的规范问题而已,比如那个根据空格分割的,在这里可能用起来会有问题,但是 在其他程序用起来可能是方便的。
只是语言使用没有习惯以及对其了解不够深入。
2. 在编码的过程中, 你是否注意编码的相关细节(比如引号), 以及考虑过代码的兼容性,严谨性以及健壮性?
何为细节,在所有语言的编码过程中都要注意细节,不然会有多的你想吐的报错
不同的符号又不同的意思,比如shell中的  “”  “”“”   ”“”“”“  用法大体一样,但是也有不一样的  

  1. echo "fk
  2.          shit"


  3. echo  """fk  
  4.               shit"""
复制代码

输出分别是
  1. fk  shit




  2. fk
  3. shit
复制代码
还有
  1. a=`echo "fk"`



  2. a=$(echo "fk")
复制代码
输出结果是一样的,但是如果在输出内还有可变的变量,第一条是不能输出的,输出的是变量名。第二条能正常输出的。

格式是不一样的。代码兼容性这个应该不是这么说的吧,应该叫扩展性吧。可能理解不一样,比如其他脚本可以调用该脚本这样,做好函数和传递变量就OK了
3. 最重要的一点, 你从这些所谓的"陷阱"中学到了哪些知识点?
知识点是什么,只是对这个语音更了解,方便下次使用而已。
4. 你还遇到过其他你认为是"坑"的坑吗?

不太觉得有什么坑,都是使用习惯和使用的次数问题,用多了自然就不觉得那是坑了。
说是坑的都是使用的不够多的人认为而已。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP