shell 学习笔记
Author: | Fox (yulefox at gmail.com) |
---|---|
Site: | http://www.yulefox.com |
Date: | Mar. 14, 2011 |
Contents
INTRODUCTION
shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本.
为此, 我希望用 shell 实现一些日常中琐碎的工作, 比如, 应用部署, 数据备份, 用户管理 等, 现在把这些内容放在 Google code 上.
好的编写习惯
shell 脚本总是以 #!/bin/sh 作为第一行, 以通知 shell 使用系统中的 shell 解释器. 脚本第二行注释写上脚本名称是一个好习惯.
要想了解地道的 shell 是什么写法, 最好的方式是找系统或者各种手册中现成的脚本代码.
将脚本目录加到 PATH 中
为了以后能更加有效的管理和使用脚本, 可以在 home 目录下创建一个 bin 目录以存放常用脚本 (一般以符号链接的形式出现), 并将其添加到 path 中 ($HOME/.profile). 如此一来, 就可以像使用其它系统命令一样直接使用自己的脚本, 而无需加上脚本路径.
path=$path:$HOME/bin
为了使上述改动立即生效, 需要执行下面的命令:
. $HOME/.profile
如何取得执行文件的绝对路径
由于脚本运行目录由用户指定, 有时需要获取执行脚本的绝对路径 (如访问脚本所在目录的其它文件). 由于脚本通常使用符号链接, 因此需要对文件类型加以判断:
if [ -L $0 ] ; then FILE=`readlink $0` DIR=`dirname $FILE` elif [ -f $0 ] ; then cd `dirname $0` DIR=$PWD else echo "[ERR] Unknown file type: $0" exit 1 fi
在 dash 中如何进行字符串替换
写脚本的过程中, 用到 bash 自带的 字符串替换功能, 大意是将域名中的 . 替换为 _, 运行时提示 "Bad substitution". 脚本示例如下:
OUTPUT=${$INPUT//\./_}
自 Ubuntu 6.10 开始, 默认的系统 shell sh(1) 被替换为 dash (the Debian Almquist Shell), 取代了 bash (the GNU Bourne-Again Shell).
dash 没有提供自带的字符串替换功能, 只能借助外部 echo, sed 等命令实现:
OUTPUT=`echo $INIPUT | sed 's/\./_/g'`
将 rst 格式文档转换为 blog 可用的 html 代码
docutils 的 rst2html 可将 rst 格式文档转换为 html 代码, 因为夹杂了大量的 css 等信息, 以及部分细节与我 blog 编写
习惯并不完全吻合, 每次需要再手动整理一下, 这次用 shell 处理了一下, 也算为以后将 rst 格式文档直接生成到 Trac 中做个预研, 以下为全部代码:
# Generate html file name based on rst file. FILE_RST=$1 FILE_HTML=`echo $FILE_RST | sed 's/\.rst$//g'`".html" eval rst2html $FILE_RST $FILE_HTML # Remove redundant meta, css, tag code. CUR_LN=1 TITLE_LN=`sed -n '/<title>/'= $FILE_HTML` sed -i "$CUR_LN,`expr $TITLE_LN - 1`"d $FILE_HTML CUR_LN=`expr $CUR_LN + 1` HEAD_LN=`sed -n '/<h1 class="title"/'= $FILE_HTML` sed -i "$CUR_LN, $HEAD_LN"d $FILE_HTML LAST_LN=`sed -n "$"= $FILE_HTML` sed -i "`expr $LAST_LN - 2`,$LAST_LN"d $FILE_HTML sed -i "/<\/\?div/"d $FILE_HTML # Update individual tags. sed -i 's/ class="[^"]*"//g' $FILE_HTML sed -i 's/ class="[^"]*"//g' $FILE_HTML sed -i 's/\(href="http.*"\)/\1 target="_blank"/g' $FILE_HTML sed -i 's/h4>/h5>/g' $FILE_HTML sed -i 's/h3>/h5>/g' $FILE_HTML sed -i 's/h2>/h4>/g' $FILE_HTML sed -i 's/h1>/h3>/g' $FILE_HTML sed -i 's/<pre/<pre class="brush:bash"/g' $FILE_HTML