IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

bash shell杂记

never-online 2011-01-23 22:36:14 累计浏览 2,611 次
本机暂存
最近在给模块编写编译脚本, 大概规则是解决
  • 在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. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Git常用命令备忘 (累计阅读 54,701)
  2. Git log diff config高级进阶 (累计阅读 24,844)
  3. Bash的模式和配置文件加载 (累计阅读 24,410)
  4. Git subtree 要不要使用 –squash 参数 (累计阅读 23,398)
  5. 我的git笔记 (累计阅读 20,260)
  6. 高效Linux用户需要了解的命令行技能 (累计阅读 12,826)
  7. linux 建立两台机器的信任关系 (累计阅读 11,485)
  8. 利用脚本分析日志并利用snmp自定义OID,再通过cacti画图 (累计阅读 10,075)
  9. linux中设置alias永久生效 (累计阅读 9,607)
  10. Bash脚本15分钟进阶教程 (累计阅读 9,060)