技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Linux --> bash shell杂记

bash shell杂记

浏览:1991次  出处信息
最近在给模块编写编译脚本, 大概规则是解决
  • 在css文件里 匹配@import url("/path/html5.css"). 将/path里的html5.css文件内容替换当前行. 即css合并
  • 将js文件里的document.write("/path/dom.js"). 将/path/dom.js文件替换当前行. 即js合并
  • 将模块打包成线上路径. 可以直接cp上线上目录. 提高上线效率,降低上线出错机率.
  • 将sprite的图片文件加上版本号
  • 将<link>标签里的css路径加上版本号
  • 将<script>标签里的js路径后加上版本号
  • css, js 代码压缩
  • 实现基本的检查, 例如不能将测试环境的一些代码发布上线上等等
  • ...
看上去实现不算困难. 于是想直接用bash shell写. 也算巩固一下这方面的知识.
bash shell在*nix里很爽的机制有管道和重定向, 非常方便. 但是也有一些需要注意的点.

管道
管道的作用是将前一个命令的输出用作后一个命令的输入.
但你想写这样的代码时:
 
 
cnt=0
cat xxx.file | while read line; do
 if [ ${line} == 'error']; then
 let cnt=$cnt+1
 exit
 fi
done
是不能修改cnt变量的值的. 这是因为通过管道,是在当前进程中fork出一个子进程, 因此变量上面不可修改父进程的变量. 这也合情合理.
那如果我想修改应该怎么办比较方便? 答案是通exit退出进程时的返回值来操作. exit能返回最后一个子进程操作的返回值.
 
 
cnt=0
cat xxx.file | while read line; do
 [ ${line} == 'error'] && exit 2
done
retval=$?
[ $retval -eq 2 ] && let cnt=$cnt+1

文本编辑的差异
如上面如说, 一行行的读总没问题吧? 事实并非如此.
之前不了解bash这些命令的原理, 于是踩了个坑. 我从svn checkout下代码后. 读取css里@import的文件发现有的能读取,有的不能读.
最后定位到不能读的文件都是一行. 或者是最后一行.
在公司群内询问之后, 有人提到可能windows的换行与*nix的是不一样. 于是将\r替换后依然不能逐行read line.
通过file命令查看之后, 发现奇怪的事.
引用
with no line terminators
如果是windows编辑出来的应该是"with CRLF line terminators", 如果是no line terminators意味着没有换行, 自然是不能read line.
用命令"od -c xxx.css"确认后果然看asc码文本最后无换行.
这应该是windows下某些编辑器的问题. 具体就没再去查.
回到这个问题, 在网上搜了一下, 没有找到一些资料可参考.
于是我当时想到的是一个山寨办法, 给每一行末我加一个回车. 然后再保存回去, 嘿嘿.
也算能解决问题吧. 也咨询了一些同事, 这个目前还没有找到太好办法.
 
 
 sed '{
 /$/ a\

 }' ${file} > ${file}.bak
 mv -f ${file}.bak ${file}

引号
单引号是能保持包含在单引号里的原值
双相号也是如此,但除了反引号"`"美元符及转义符"\"
但是确有所不同. 加上字符串变量加上引号会更保险
 
 
a='* @@'; echo $a
 
这在至少mac里会列出所有当前的文件夹下的所有文件,这是通配符"*"在作怪.
 
a='* @@'; echo "$a"

log
尽可能的多输出日志, 分清info, warning, error类型,对于真正出问题时定位很有用.
特别是你不能在本机debug时.

建议继续学习:

  1. 你可能不知道的Shell    (阅读:6917)
  2. 面向对象的Shell脚本    (阅读:5142)
  3. 在 shell 脚本里打日志    (阅读:4767)
  4. Bash如何取得当前正在执行的脚本的绝对路径?    (阅读:4773)
  5. 使用Shell快捷键助你一臂之力    (阅读:4483)
  6. Bash Shell 快捷键    (阅读:3987)
  7. shell文件存在相关判断参数    (阅读:3547)
  8. 加密你的shell    (阅读:3584)
  9. Shell的那些事儿    (阅读:3207)
  10. Unix考古记:一个“遗失”的shell    (阅读:3275)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Linux下pstack的实现
后一篇:虚拟内存的作用 >>
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1