我在《Javascript include guard》這篇有提到在 Javascript 裡怎麼寫 include guard,今天再來介紹一下 Bourne Shell 的版本。
一般而言,include guard 的關鍵在設立變數,以及檢驗變數存不存在。在 javascript 裡我們靠的是 typeof() 檢查變數是否存在,但對於 Bourne Shell 而言,卻無法如此套用。因為不存在的變數,在 Bourne Shell 裡會被解譯成空字串。不過還好,空字串也夠用了。這回我們用的是 test 指令的 -n 參數:
SHELL> man test
...
-n string True if the length of string is nonzero.
...
靠著 -n 指令,我們可以判斷給定的變數,解譯後是否是長度為零的空字串。如果變數不存在,便會被解譯成空字串,也可以偵測的出來。所以, Bourne Shell 版的 include guard 就可以寫成這樣:
if [ [...]
Arlo 問我有沒有辦法讓 Editplus 2 預設使用 UTF-8 encoding?很可惜地,雖然 Editplus 2 可以預設檔案的行尾要用 PC (CR-LF)、UNIX (LF) 還是 Mac (CR) 格式,但卻沒有辦法預設新檔案要使用的 encoding,一律使用 ANSI codepage。
Arlo 問這個問題,想必是因為常常忘了把原始碼檔案的 encoding 設成 UTF-8,導致程式執行時出錯。我以前也有碰過這樣的困擾,於是從某 trac 資料庫裡把下面這段挖出來:
Here's a command to check which file has incorrect utf8 encoding:
SHELL> find . -type f -name '*.php' -or -name '*.html' -or -name '*.htm' \
| [...]
因為 Subversion 目前沒有 multiple repository 的功能,無法跨 repositories 作 copy/move/switch/diff/merge 等動作,在跨 project 整合時,會有些麻煩。因此,我寫了一個叫 svn-sync-external.sh 的 shell script,希望能去除這些麻煩。
這些是什麼麻煩呢?舉我現在碰到的需求為例,我現在要將 Lady BBS 從古老的 SOB 改成用 pttbbs。剛好 pttbbs 有利用 Subversion 提供 Ptt Source,按照 SVNBook 的說法,利用 vendor branches 理論上可以讓我隨時更新到最新版的 pttbbs。
然而,事情其實並不是這麼簡單地。最大的癥結點,在於我也會改動到 BBS 的 source,即使是使用了 vendor branches 技法,因為是使用 import 將 Ptt Source 拉回來,所以實際上是已經與 Ptt Source 拖勾了,仍然是必須要進行許多手動的操作,以便把 Ptt Source 版本之間的差異,施行到我自己的 source tree [...]
之前碰到一個問題就是,我們有一堆 UTF-8 的 XML 檔案,但實際上這些檔案應該都只包含中文字,也就是可以用 BIG5 呈現的字。然而,因為是 UTF-8 是 Unicode 的關係,所以實際上可能存在有無法轉換成 BIG5 的字,因而違反程式的期待,造成程式的問題。為了避免這樣子的問題,我們必須要檢查這堆 UTF-8 的 XML 檔案,確認每個檔案裡用到的每個 UTF-8 字元,都可以被轉換成 BIG5。這個問題,在考慮到其實 BIG5 也有很多變種的情況下,越是複雜。
不過還好,想通了話其實就很簡單:用 iconv 試轉不就得了:
SHELL> find . -type f -name '*.xml' \
| xargs -n 1 -t -x iconv -f UTF-8 -t CP950 \
[...]
既然有上一篇個技巧,當然就可以包成網頁,平常當成一個 utility 來用,這樣若是要轉文章到 bbs 上的話,就可以叫這個網頁出來排版,畫面就可以排得漂漂亮亮啦。:-)
呈現出來的效果如:http://www.jeffhung.idv.tw/html2text.php (目前無法使用)。
<?php
// Author: Chien-Chou Hung
// License: BSDL
?><html>
<head>
<title>html2text</title>
</head>
<body>
<form name="f" method="POST">
<b>Convert:</b> <input type="text" name="url" value="<?php
echo (empty($url) ? "http://" : $url);
?>" size="50" maxlength="255">
<input type="submit"><br>
Text browser:
<input type="radio" name="browser" value="links" checked>
[...]
簡單的小 script,能夠抓任意網頁,然後以文字模式的方式排版輸出,用到 lynx 跟 awk。用的時候把 $url 代換成要抓的網址就可以了。
lynx -dump $url | awk ' /process$/ { print; exit } { print } '
簡單的 script,簡化日常跑程式順便要做 log 的步驟。目前是 FreeBSD only,除了各個 utility program,如 date、script 等路徑的關係之外,最重要的是 FreeBSD 上的 script 的 behavior 跟一般的 script 有些不一樣,允許直接把 command 放在 ${__out_file} 後面。另外,TCSH 的 time 也較精確,取得的資訊也較多,甚至可以在 .(t)cshrc 裡設定最後輸出格式 [1],所以下面就改成用 tcsh 做 time 了。
#!/bin/sh
# ----------------------------------------------------------------------------
# Amarganth Development Environment
# Copyright (C) 2004, Jeff Hung
# All rights reserved.
# ----------------------------------------------------------------------------
# $Date: 2006-09-12 12:37:52 +0800 (Tue, 12 Sep 2006) $
# $Rev: [...]