IT技术博客大学习 共学习 共进步

bash shell杂记

never-online 2011-01-23 22:36:14 浏览 2,562 次
最近在给模块编写编译脚本, 大概规则是解决
  • 在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 (阅读 8,166)
  2. 在 shell 脚本里打日志 (阅读 6,044)
  3. 面向对象的Shell脚本 (阅读 5,985)
  4. Bash如何取得当前正在执行的脚本的绝对路径? (阅读 5,846)
  5. 使用Shell快捷键助你一臂之力 (阅读 5,387)
  6. Bash Shell 快捷键 (阅读 4,886)
  7. 加密你的shell (阅读 4,846)
  8. shell文件存在相关判断参数 (阅读 4,704)
  9. Unix考古记:一个“遗失”的shell (阅读 4,448)
  10. Shell的那些事儿 (阅读 4,427)