shell 学习笔记

标签: 技术 UNIX | 发表时间:2011-03-14 14:55 | 作者:Fox tiger
出处:http://www.yulefox.com
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 代码

docutilsrst2html 可将 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

相关 [shell 学习 笔记] 推荐:

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

「学习笔记-Linux」学习Shell Script

- - CSDN博客系统运维推荐文章
学习Shell Script. 1 什么是Shell Scipt. 2.2 例2 按日期建立相似名字的文件. 3.2.4 整数,字符串,多重条件判断. 4 Shell Script 参数. 5.2 if else 结构. 8 shell script的追踪与Debug. 1 什么是Shell Scipt.

[转]Bash Shell 快捷键的学习使用

- SotongDJ - OwnLinux.cn
大量在时候在使用 bash shell 的时候,熟悉快捷键是多么爽的一件事. 刚刚无意在 Fenng 哥的博客上看到了一篇关于 bash shell 快捷键的文章,总结得相当好.

OAuth学习笔记

- 宋大妈 - FeedzShare
来自: 标点符 - FeedzShare  . 发布时间:2011年08月29日,  已有 2 人推荐. OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.

Vim学习笔记

- 临池学书 - C++博客-首页原创精华区
最近在学习Vimtutor中的相关内容,Vim的使用博大精深,很多命令一旦不使用就会忘记,下面把其中的没有使用到的相关命令做一个简单的总结,供以后复习使用. 至于常见的保存,插入等等命令,则不予记录,在以后的使用中加深练习即可. To change until the end of a word, type  ce (ce + 修正的单词).

OAuth学习笔记

- jiaosq - 标点符
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据. 每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).

HTML学习笔记

- - CSDN博客推荐文章
超文本标记语言( 英文:HyperText Markup Language,HTML)是为“ 网页创建和其它可在 网页浏览器中看到的信息”设计的一种 标记语言. HTML被用来结构化信息——例如标题、段落和列表等等  点击打开链接. w3schools  点击打开链接 {语法大全,超赞.

jQuery学习笔记

- - ITeye博客
什么是jQuery,它能为我们做什么. jQuery是一个javascript类库或称之为javascript框架. 无需刷新页面从服务器获取信息. 简化常见的javascript任务. 为什么会如此流行或说得到大量用户群的支持:. 多重操作集于一行(避免使用临时变量或不必要的重复代码). jQuery利用了CSS选择符的能力,在DOM中快捷而轻松地获取元素或元素集合.

JdbcTemplate学习笔记

- - SQL - 编程语言 - ITeye博客
1、使用JdbcTemplate的execute()方法执行SQL语句. 2、如果是UPDATE或INSERT,用update()方法.    JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等. spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现.

Disruptor 学习笔记

- - 开源软件 - ITeye博客
Disruptor 是一个高性能异步处理框架,也可以认为是一个消息框架,它实现了观察者模式. Disruptor 比传统的基于锁的消息框架的优势在于:它是无锁的、CPU友好;它不会清除缓存中的数据,只会覆盖,降低了垃圾回收机制启动的频率. Disruptor 为什么快. 通过内存屏障和原子性的CAS操作替换锁.