shell 学习笔记

Author: Fox (yulefox at gmail.com)
Site: http://www.yulefox.com
Date: Mar. 14, 2011

Contents

  • INTRODUCTION
  • 好的编写习惯
  • 将脚本目录加到 PATH 中
  • 如何取得执行文件的绝对路径
  • 在 dash 中如何进行字符串替换
  • 将 rst 格式文档转换为 blog 可用的 html 代码

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

你可能感兴趣的:(unix,技术)