2010年1月11日 星期一

Bourne Shell 與 Korn Shell

Bourne shell 是系統內定的標準 shell,包括以下特點:


。可將輸出入重導向
。可用萬用字元指定多個檔案
。提供環境變數以供設定
。提供內建指令用於 shell 程式設計
Job 控制 由 SVR4 開始後才有 )


Korn shell 是 Bourne shell 的延伸,和 Bourne shell 相容。Korn shell 專屬的特點包
括:

。可編輯指令列 用 vi 或是 emacs)
。可取用使用過的指令
。整數運算
。提供更多不同的變數取代與搜尋樣式比對
。陣列與數學運算式
。別名


語法

本章講解的內容是 Bourne shell 與 Korn shell 獨有的一些符號運用。順序如下:

。特別檔案
。檔名中介符號
。引用符號
。指令形式
。重導向形式
。共行指令 (coprocesses,僅 Korn shell 適用 )

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

特別檔案

/etc/profile              登入時自動執行
$HOME/profile              登入時自動執行
/etc/passwd              使用 ~name 時,系統會到這檔案中讀取相對應的目錄
$ENV                            若啟動一個新的 Korn shell 時,會自動讀取這個檔案


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

檔名中介符號


*                            代表 個或更多個的任意符號
?                            代表單一個任意符號
[abc...]              尋找括號中的任一符號,可用 "-" 來指定範圍如 a-z1-9 等等。
[!abc...]              尋找不在括號中的符號

Korn shell 有更多中介符號

?(pattern)              尋找出現零次或一次的pattern
*(pattern)              尋找出現零次或多次的pattern
+(pattern)              尋找出現一次或多次的pattern
@(pattern)              尋找恰出現一次的pattern
!(pattern)              尋找任何不含pattern的字串
~                            目前使用者的主目錄 (home directory)
~name                            name 這位使用者的主目錄 (home directory)
~+                            目前工作目錄 (PWD)
~-                            前一個工作目錄 (OLDPWD)

上述的pattern,可以用 "|" 號加以分隔,表示符合其中任一皆可。這種樣式跟 egrep 與 awk 的樣式指定方式類似。

使用範例:

$ ls new*                            列出 new 與 new.1
$ cat ch?                            ch9 符合,但 ch10 不合
$ vi [D-R]*                            所有 到 開頭的檔案皆符合
$ cp !(Junk*|Temp*)*.c              僅 Korn shell 適用。除了 Junk 與 Temp 開頭的 語言案均要拷貝

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

引用符號


引用 (quote) 過的符號會失去其特殊意義,而當做一般符號直接處理。下列為 Bourne shell Korn shell 的特殊符號:

;                            指令分隔符號
&                            背景執行
( )                            指令群集功能 (command grouping)
|                            Pipe符號
> < &                            重導向符號
* ? [ ] ~ + - @ !              檔案中介符號
" ' \                            用來引用其他符號的符號
`                            指令替代
$                            變數或指令替代
newline space tab              字的分隔符號

下列符號可用來進行引用:

" " 任何在雙引號之間的符號,除了下列者皆視為一般符號。
              進行變數替代
              進行指令替代
              表示引用之結尾

' ' 除了單引號外,兩單引號之間的任何符號均視為一般符號。
緊接在此符號之後的單一符號將視為一般符號。通常用來引用自己或是換行符號或是空
白。如 \\


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

指令形式

cmd &                            將 cmd 指令放入背景執行
cmd1 ; cmd2              指令列,將兩個指令放在同一行執行

(cmd1 ; cmd2)              子 shell,將 cmd1 與 cmd2 視為同一群指令
cmd1 | cmd2              Pipe,將 cmd1 的輸出當做 cmd2 的輸入
cmd1 `cmd2`              指令替代,將 cmd2 的輸出當做 cmd1 的參數
cmd1 $(cmd2)              Korn-shell 專屬指令替代格式,可進行巢狀 ( nesting ) 替代
cmd1 && cmd2              AND,若 cmd1 順利執行,則執行 cmd2
cmd1 || cmd2              OR,若 cmd1 沒有順利執行時,則執行 cmd2
{ cmd1 ; cmd2 }              在目前的 shell 中執行指令

使用範例:

$ nroff file &                            將檔案格式化的動做放入背景執行
$ cd ; ls                             依序執行
$ (date; who; pwd) > logfile              將所有輸出重導向到 logfile
$ sort file | pr -3 | lp 將檔案排序後列在一頁中並列印
$ vi `grep -l ifdef *.c`              編輯由 grep 找到的檔案
$ egrep '(yes|no)' `cat list`              指定尋找由 list 指定的檔案
$ egrep '(yes|no)' $(cat list)              上個指令改成 Korn shell 形式
$ egrep '(yes|no)' $(                            同上指令,速度較快
$ grep XX file && lp file              若找到 XX 檔案則列印
$ grep XX file || echo "XX not found" 若找不到 XX 檔案則印出訊息

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍


重導向形式

檔案代碼               名稱                             常用簡稱               一般所使用的裝置
0                            標準輸入               stdin                            鍵盤
1                            標準輸出               stdout                            終端機
2                            標準錯誤               stderr                            終端機

常用的輸出入可用下列方法改變:

簡單重導向形式:

cmd > file              將 cmd 的輸出寫入 file ( 覆寫 )
cmd >> file              將 cmd 的輸出寫入 file ( 附於檔尾 )
cmd < file               將 file 內容當作 cmd 輸入
cmd << text              從標準輸入裝置中讀入資料,一直到遇到 text 所指定的字串為止 (text 可存在環境變數中 )。輸入通常直接從鍵盤輸入或是寫在 shell 程式中。一般使用這種格式的指令有 cat, echo, ex 和 sed。若使用 <<,在比較 text 時會忽略前面的 tab 符號。這種指令格式有時稱為 Here 檔案。


使用檔案代碼進行重導向


cmd >&n                            將輸出導向至第 號檔案代碼
cmd m>&n              同上,但平常輸出至 的現在將送往 n
cmd >&-                            關閉標準輸出
cmd <&n                            從第 號檔案代碼讀入輸入
cmd m<&n              同上,但平常從 讀入者現在從 讀入。
cmd <&-                            關閉標準輸入


多重導向


cmd 2>file              將錯誤訊息放入 file,但標準輸出不變 如螢幕 )
cmd > file 2>&1              將標準輸出與錯誤都送往 file
(cmd >f1) 2>f2              將標準輸出導向至 f1,標準錯誤導向至 f2
cmd | tee files              將 cmd 的輸出分別導向至標準輸出和 files ( 見第二章 tee 的部份 )

重導向符號和檔案代碼間不可出現分隔符號如空白。其他狀況下有時可以加上空白。



若要將標準輸出導向至標準錯誤:

$ echo "Usage errorsee administrator" 1>&2

下列指令會將輸出 找到的檔案 傳送到 filelist,並將錯誤訊息 無法存取的檔案名稱 放入 no_access 中:

$ (find / -print > filelist) 2>no_access

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

共行指令

共行指令 ( coprocesses ) 是 Korn shell 特有的使用方式。

cmd1 | cmd2 |&              共行指令,將 pipe 放入背景。shell 會建立一條雙向的 pipe,可以將標準輸出和輸入同時導向。
read -p var              將共行指令的輸出讀入 var 變數中。
print -p string              將 string 寫入共行指令
cmd <&p                            將共行指令的輸出當做 cmd 的輸入
cmd >&p               將 cmd 的輸出做為共行指令的輸入


使用範例:

ed - memo |&                            啟動 coprocess
print -p /word/              將 ed 指令送入共行指令中
read -p search                            將 ed 指令的輸出寫入 search 變數
print "$search"              將變數輸出到標準輸出上
A word to the wise


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

p4-7

變數

本章討論主題如下:

變數替代
內建變數
其他變數
陣列 僅適用於 Korn shell)

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍


變數替代

下列式子中不可出現空白。冒號可用可不用,若使用冒號,則 var 本身與設定之值不可以為 
null 值。

var=value ..              將變數 var 設定為 value 
${var}                                          取用 var 之值,若變數前後有分開,可以不用括號
${var-value}              若 var 已設定,則使用 var,否則使用 value
${var=value}              若 var 已設定,則使用 var,否則使用 value,並將 var 設定為 value
${var?value}              若 var 已設定,則使用 var,否則使用 value 並跳出。若無 value,則印出 "parameter null or not set"
${var+value}              若 var 已設定,則使用 var,否則不取用任何值。

Korn shell 的用法:

${#var}                            取用 var 的長度
${#*}                            取用指令參數 ( positional parameter ) 的個數
${#@}                            取用指令參數 ( positional parameter ) 的個數
$(var#pattern}              取用 var 之前,先將 var 中符合 pattern 之最短字串刪除
$(var##pattern)              同上,但刪除最長字串。此兩式中均從左開始刪除
$(var%pattern)  同 #pattern,但從右開始刪除。
$(var%%pattern) 同 ##pattern,但從右開始刪除

使用範例:

$ u=up d=down blank=               將三個變數予以設定 最後一個是 null)
$ echo ${u}root                            在此必須使用 {}
uproot
$ echo ${u-$d}                            顯示 或是 的值,因為 有設定過,所以顯示 u
up
$ echo ${tmp-`date`}              若未設定 tmp,則執行 date 指令
Thu Feb  4 150346 EST 1993
$ echo ${blank="no data"}              因為 blank 已設定,所以印出一行空白

$ echo ${blank="no data"}  因為 blank 雖已設定,但值為 null,所以印出字串
no data
$ echo $blank                            blank 值已由上面一個指令改變
no data

tail='${PWD##*/}'              將目前的目錄中 結尾的部份予以刪除,所以結果就是目前的目錄完整路徑的最後一部份。


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍


內建的 shell 變數

shell 會自動設定內建變數,通常用於 shell 程式中。上面講到的變數替代都可用於內建
變數中。請注意,本身並不是變數的一部份,僅在取用變數時用到。

$#              指令所使用的參數個數
$-              目前有效的選項 給 sh 或是 set 的參數 )
$?              上個結束的指令的結束傳回碼
$$              目前行程的 process ID
$!              上個背景行程的 process ID
$0              指令行的第一個字,也就是指令名稱
$n              個別的指令參數。Bourne shell 只可取用九個指令參數 (n=1-9),若使用               ${n},則 
Korn shell 可取用到 個以上的參數。
$*              所有的指令參數以 "$1$2$3..." 形式排列
"$@"              分別取用所有的指令參數,以 "$1" "$2" ... 形式取用

Korn shell 還會自動設定下列參數:

$_              暫時變數。設定為指令或是 shell script 啟動的路徑名稱。接著會放入上個指令的最後一個參數。檢查信件時,也會存入符合的 MAIL 檔案名稱。
ERRNO              上一個失敗的系統呼叫錯誤碼
LINENO              目前一行在整個函式或是 script 的行號
OLDPWD              前一個工作目錄 由 cd 指令設定 )
OPTARG              上一個由 getopts 處理的選項名稱
OPTIND              OPTARG 的編號
PPID              目前 shell 的上一層行程 (parent process) 的號碼
PWD              目前工作目錄 由 cd 指令設定 )
RANDOM[=n]              每次呼叫都產生一個亂數,若指定 n,則亂數由 開始。
REPLY              select 與 read 所使用的預設回答
SECONDS[=n]              記錄從 shell script 開始到現在的秒數,若有指定 n,則為開始秒數 +n



﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

P4-9

其他變數


下列變數並不會由 shell 自動設定。大部份會在使用者的 .profile 中使用,可用來設定
使用環境或是特殊用途。設定變數之指令為:

變數 

下表也包括了每個變數所需設定的值,Korn shell 專用者加上 (K)

CDPATH=dirs              僅打 cd 指令時所搜尋的目錄,可當做切換目錄之捷徑。預設值為無。
COLUMNS=n              (K) 螢幕的列數,用於行編輯模式和 select 列表。
EDITOR=file              (K) 行編輯模式的路徑名,可以 vi 或是 emacs 做結尾。若 VISUAL 未設定才使用。
ENV=file              (K) 啟動時所執行的 script 名,可在其中指定別名和函式定義以方便使用。如 ENV=$HOME/kshrc ( 和 C shell 的 .cshrc 類似 )
FCEDIT=file              (K)fd 指令所用的編輯器,預設為 ed
FPATH=dirs              (K) 搜尋函式定義的路徑名稱,未定義的函式可用 typeset -fu 來設定。第一次呼叫這些函式時,會到 FPATH 中尋找定義。
HISTFILE=files              (K) 記錄使用過指令的檔案,須在 ksh 啟動前指定。預設為$HOME/.sh_history
HISTSIZE=n              (K) 記錄使用過指令的個數,需在 ksh 啟動前指定。預設為 128
HOME=dir              使用者目錄,由 login 指令設定 根據 passwd 檔案內容設定 )
IFS='chars'              內部的分隔字元,預設為換行,tab 和空白
LANG=dir              指定使用一些語言相關程式時的目錄。
LINES=n                            (K) 螢幕的行數,用於 select 列表
MAIL=file              預設的信件檔,由 login 設定。
MAILCHECK=n              每次檢查信件的間隔時間,預設為 10 分鐘。
MAILPATH=files              指定收信件的檔案,檔名之間用冒號隔開。每個檔案都會列出。Korn shell 用 作為提示符號,標準的新信件訊息是 You have mail in $_Bourne shell 用 作為提示符號,新信件訊息是 You have mail
PATH=dir              列出所有搜尋執行命令之路徑。路徑間用:分開。預設為 /usr/bin
PS1=string              主要的提示字串,預設為 $
PS2=string              次要提示字串,用於多行指令。預設為 >
PS3=string              (K)select 迴圈中所使用的提示字串,預設為 #?
PS4=string              (K) 進行 trace 時的提示符號 (ksh -x 或是 set -x)。預設為 +
SHACCT=file              "shell account",記錄所執行的 shell script 用。Korn shell 無此設定。
SHELL=file              shell 的路徑,如 /bin/sh
TERM=string              終端機形式
TMOUT=n                            (K) 若 秒後沒有輸入任何指令,則自動結束。
VISUAL=path              (K) 與 EDITOR 相同,但 VISUAL 優先。


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍


陣列

Korn shell 可建立最多 1024 元素的一維陣列。第一個元素的編號為 0,若要設定陣列,可用下面方式:

set -A name value0 value1 ...

上面所指定的 valuen 之值則為 name 的元素。陣列在使用前不需先加以宣告。只要任何合法存取帶足碼的變數 ( subscripted variable ) 即可建立陣列。

取用陣列時,可用 ${....} 形式。若在 (( )) 中取用陣列 則不需如此。請注意,[] 並無特殊意義。

${name[i]}              取用 name 陣列的第 i-1 個元素。可用 let 來設定任何合法的數學運算式給 i。運算結果必須介於 到 1023 之間。
${name[*])              取用 name 陣列的所有元素
${name}                            取用 name 陣列的第一個元素
${#name[*]}              取用 name 陣列的元素個數
${#name[@]}              同上



數學算式

Korn shell 的 let 指令可以進行整數運算。也可以將運算式用做變數替代,同時也可以換
成不同的進位法。

$(( expr ))              取用 expr 的運算結果
B#n                            將 以 進位表示法顯示。如 8#100 為 64,是 100 的八進位表示法。


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

p4-11

運算子


Korn shell 採用的是 語言的運算子,下列為遞減優先順序:

-              單元減號
! ~              邏輯 NOT 與 的補數
* / %              乘,除,餘數
+ -              加,減
<< >>              逐位元向左移,右移
<= >=              小於等於,大於等於
< >              小於,大於
== !=              等於,不等於
&              逐位元 AND
^              逐位元 XOR
|              逐位元 OR
&&              邏輯 AND
||              邏輯 OR
*= /= %=              指定值
= += -=
<<= >>=
&= ^= |=

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

使用範例:

若要更詳細的說明,請見 let 指令

let "count=0" "i = i + 1"              指定 count 與 之值
let "num % 2"                                          檢查是否偶數
(( percent >=0 && percent <= 100 ))              檢查變數範圍


使用過的指令

Korn shell 可以讓使用者瀏覽或編輯使用過的指令。與 C shell 的功能類似。可用 fc 
是行編輯模式來編輯使用過的指令。

﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

行編輯模式

行編輯模式可以模擬不少 vi 或是 emacs 的功能。用過的指令記錄可當做一個檔案。啟動編輯器後,可以用按鍵移到想執行的指令行去,也可以在執行前加以修改,確認後按 ENTER 即可執行。

行編輯模式可以用很多不同的方式啟動,如以下三種方式是一樣的:

$ VISUAL=vi
$ EDITOR=vi
$ set -o vi              此指令可以略過 VISUAL 或 EDITOR 的設定

注意,vi 開始時處於輸入模式,要使用 vi 指令,請按 ESCAPE

常用的按鍵

vi              emacs                            動作
﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍
k              CTRL-p                            取得前一個 (previous ) 指令
j   CTRL-n                            取得下一個 ( next ) 指令
/string                            CTRL-r string              取得前一個包括string的指令
h              CTRL-b                            倒退 ( back )  一個字元
l              CTRL-f                            前進 ( forward ) 一個字元
b              ESC-b                            倒退 ( back ) 一個字 (word)
w              ESC-f                            前進 ( forward ) 一個字
X              DEL                             消去前一個字元
X              CTRL-d                            消去一個字元
dw              ESC-d                            消去後一個字
db              ESC-h                            消去前一個字
xp              CTRL-t                            兩字元交換


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

fc 指令

fc -l 可列出使用過的指令,用 fc -e 來編輯。詳見 內建指令 一節

使用範例:
$ history                            列出最後 16 個用過的指令
$ fc -l 20 30                            列出第 20 到第 30 個指令
$ fc -l -5                            列出最後五個指令
$ fc -l cat                             列出最後一個 cat 開頭的指令
$ fc -ln 5 > doit                            將第五個指令儲存到檔案doit
$ fc -e vi 5 20                             用 vi 編輯第 到第 20 個指令
$ fc -e emacs                            用 emacs 編輯前一個指令
$ r                            重覆執行上一個指令
$ r cat                            重覆執行上一個 cat 指令
$ r doc=Doc                            將部份內容替代後執行上一個指令
$ r chap=doc c                            替代部份內容後,執行上一個 開頭的指令



內建指令 (Bourne shell 與 Korn shell)


開頭的使用範例表示需在指令列下使用,其他則只能在 script 中使用。為了方便起見,保留字也予以說明。

--------------------------------------

#

號之後同行的任何內容都予以忽略。其實這並不是個 指令 ",而是註解符號。若將此符號用於 Bourne shell script 時請小心,第一行的第一個字元若是 時,常代表這是 C shell script 而非 Bourne shell script )


--------------------------------------

#!shell

放置於 shell script 的第一行,將由 shell 所指定的 shell 來啟動此 script。可以加上使用參數。例如:

#!/bin/sh -v


--------------------------------------

Null 指令。程式的傳回值為 0。有時放在第一行第一個字元,來代表這個 script 是 Bourne shell script。 請見下例與 case 之說明。Korn shell 中,若將變數前加上 :,則可將變數展開成對應的值。

例如:

檢查某人是否正在線上:

              if who | grep $` > /dev/null
              then                                           若找到該使用者,則什麼也不做
              else echo "User $` is not logged in"
              fi


--------------------------------------
.file[arguments]

讀取該檔並予以執行。該檔可以不是可執行檔,但必須在 PATH 下指定的路徑內。Korn shell 支援儲存在指令列參數 ( positional parameter ) arguments

--------------------------------------

[[expression]]

僅可用於 Korn shell。同 test expression 或是 [expression],但可加入一些運算子。
雙括號內不分字,不展開檔名。

額外的運算子
  &&  邏輯 AND
  ||  邏輯 OR
  >   若第一個字串在字母排列上優先
  <   若第二個字串在字母排列上優先


--------------------------------------

name(){commands;}

定義一個名為 name 的函式,定義可以全寫在同一行,也可以分在不同行中。因為 Bourne 
shell 中沒有別名的功能,可以用一些簡單的函式來代替別名。Korn shell 中提供了一個
叫做 function 的指令,其作用相同。

範例:
  $ count () {
  > ls | wc -l
  > }

指令列執行時, count 會顯示目前目錄中的檔案數目。


--------------------------------------

alias[options][name[='cmd']]


僅可用於 Korn shell。將 name 做為取代 cmd 的別名。若沒有 cmd 參數,則列出目前 name 所代表的指令。若無 name 與 cmd 參數,就列出現有的所有別名;見 unalias 之說明。下列的別名是 Korn shell 內建的。有些用的是現有的 Bourne shell 或 C shell 的指令 所以事實上各種 shell 是相當相近的 )



Options

-t                            為 name 建立一個追縱別名 (tracked alias)Korn shell 可以將指令的完整路徑加以記錄,以便可以在別的目錄一樣可以執行該指令。若不加上 name 參數,則列出目前所有的追蹤別名。追蹤別名和 Bourne shell 中的 hash 指令相同。

-x                            讓這個別名可在別的 shell script 或是其它子 shell 中使用。若無 name 參數, 則列出目前所有可用於外部shell script 或子 shell 的別名。

範例:

alias dir='basename `pwd`'


--------------------------------------
autoload[functions]


只有當第一次使用函式時才會加以定義 載入 )Korn shell 中為 typeset -fu  的別名。

--------------------------------------

bg[jobIDs]

將目前的 job 或是 jobIDs 放入背景執行。詳見 job 控制功能。


--------------------------------------

break[n]

從最內層的 forwhile 或是 until 迴圈中跳出,若加入 n,則從內算起第 層跳出。也可用於跳出 select 列表。


--------------------------------------

case value in
  pattern1) cmds1;;
  pattern2) cmds2;;
  .
  .
  .
esac

若 value 和 pattern1 相符,則執行 cmds1,若符合 pattern2 則執行 cmds2,依此類推。注意,每組指令的最後一個必須以 ;; 結尾。value 代表一個變數,cmds 可以是 UNIX 指令,shell指令或是設定變數。Pattern 可以使用中介符號。若用 將一些不同的 pattern 分開時,若 value 符合其中任一個 pattern,則執行後面的 cmds。使用例見下列以及 eval 的說明。注意,Korn shell 中,可以在 pattern 之前加上左括號,變成 (pattern),要檢查 $() 內括號數目是否正確時十分好用 )

範例:
  讀入第一個指令列參數並做出相應的動作:

              case $1 in              檢查第一個參數
                            no|yes) response=1;;
                            -[tT])              table=TRUE;;
                            *)              echo "unknown option"; exit 1;;
    esac

  將使用者輸入的資料讀入,直到使用者跳出為止:


cd [dir]
cd [-]
cd [ old new ]

若無參數,則切換為使用者本身的目錄,否則切換至 dir。若 dir 僅為相對的路徑,則開始搜尋 CDPATH 中的目錄,看是否有 dir 在其中。後兩種形式僅可用於 Korn shell"-" 表示前一個工作過的目錄。第三種形式中,cd 指令將 old 字串用 new 代替,並切換至新的目錄。

範例:
              $ pwd
              /usr/spool/cron
              $ cd cron uucp              #cd 會顯示新的目錄
              /usr/spool/uucp


--------------------------------------
continue[n]

跳過 forwhile 或是 until 迴圈中接下來的指令,直接跳到下一次迴圈中,或是跳過 n
次迴圈。


--------------------------------------
do

forwhileuntil 或是 select 之前所加之保留字


--------------------------------------
done

forwhileuntil 或是 select 結尾時所使用的保留字


--------------------------------------
echo[-n][string]

將 string 顯示在標準輸出上 若加上 -n 參數,輸出不加上換行字元。若無 string,則顯示一行空白。Korn shell 中,echo 是 print - 的別名 見第二章有關 echo 的部份 )echo中可以使用特殊的 escape 字元,若不要 shell 處理,則必須加以引用,或加上 符號:

\b              倒退鍵
\c              和 -n 相同,不輸出換行
\f              跳頁
\n              換行
\r              將游標跳回本行第一個字元
\t              tab 字元
\\              倒斜線
\0nnn              八進位的 ASCII 字元,以nnn 來代表,nnn 可以是 12,或 位數,前面不足者補 0

範例:
  $ echo "testing printer" | lp
  $ echo "Warningringing bell \007"


--------------------------------------
esac

放在 case 敘述結尾的保留字。不小心常會遺漏。

--------------------------------------
eval args

一般情況下均於 shell script 中使用 eval 指令,args 則為一行指令,其中含有 shell 變數。eval 會先強迫進行變數替代,然後執行展開後的指令。當 shell 變數含有輸出入重導向或是別名,或是有其它 shell 變數時,這種先展開後執行的方式很好用。比如說,通常重導向符號的優先順序高於展開變數,所以含有重導向符號的變數就必須先用 eval 加以展開,不然重導向符號會變成沒有意義 )。請見第五章 C shell 的 eval 範例。

範例:

這個 shell script 是於 Bourne shell 下執行,說明如何用 eval 來建立正確的指令解譯法:

-

exec[command]

將 command 代替目前的行程繼續執行下去。開關或是拷貝檔案代碼時 exec 也十分好用。

範例:
   trap 'exec 2>&-' 0              當 shell script 結束跳出時,將標準錯誤關閉。(signal 0)
   $ exec /bin/csh              把 Bourne shell 用 C shell 代替
   $ exec < infile              將標準輸入用 infile 代替


--------------------------------------
exit[n]

結束 script 時傳回值 n如 exit 1)可以是 0 ( 正常結束,表執行成功 或是非 的值 不正常結束,表執行失敗或有錯誤 )。若不指定 值,則使用最後一個結束指令的傳回值。exit 用於指令列時,可用來關閉視窗 (log out,登出 )

  if [ $# -eq 0 ]; then
              echo "Usage: $0 [-c] [-d] file(s)"
              exit 1                            錯誤狀態碼
  fi


--------------------------------------
export[variables]
export[name=[value]] ...

將一個或多個 shell variables " 輸出 " (export ) ,亦即讓其他不同的 script 或是指令使用。也可將 name 給予一個全域 (global) 的值。例如,若某個 script 中所呼叫會使用到原 shell中某個變數的值,則必須 輸出 該變數。若不加上 variables 參數,則列出目前的 shell所有 輸出 的變數名稱。第二種形式用於 Korn shell,類似第一種型式,並且可於輸出之前將變數name的值value

範例:

  Bourne shell 中使用法:

              TERM=vt100
              export TERM

  Korn shell 也可用下列方式:

              export TERM=vt100


--------------------------------------
false

Korn shell 中,此為 let 0 的別名。


--------------------------------------
fc [options] [first[last]]
fc -e -[old=new][command]

僅適用於 Korn shell。用於列出使用過的指令,或加以編輯。-l 與 -e 參數不可併用。fc C shell 中的 history 和 功能類似。first 和 last 是用來指定顯示的指令範圍,其值可以是數字或是字串。若無 last 參數,則 fc 僅作用於單一指令,即由 first 指定的指令。若 first 與 last 皆無,則 -e 時,fc 編輯上一個指令,-l 時列出前 16 個指令。

第二種形式從使用過的指令中拿出 command,將其中的 old 字串用 new 字串替代後予以執行。若無 oldnew 等,則只是再將 command 執行一次。若無 command 參數,則再執行一次上一個指令。command 可以是數字或是字串,與 first 形式相同。見 使用過的指令 一章的範例。

Options

-e [editor]              用 editor 來編輯所指定的指令,預設為 FCEDIT 這個 shell 變數所指定的編輯器。
-e -              重新執行某個指令,見上列第二種形式的說明。
-l              列出某個指令或是某些指定範圍的指令,或是前 16 個指令。
-n              列出指令時不加上編號
-r              以相反的排列順序列出指令


--------------------------------------
fg[jobIDs]

將目前的 job 或是 jobIDs 拿到前景執行。詳見 "job 控制功能 "


--------------------------------------
fi

if 敘述的結尾保留字,千萬記得要加上。


--------------------------------------
for x [in list]
do
  commands
done

是變數名稱,對每個在 list 中的 變數,執行相應的 commands。若無 list,則假設為指令列參數 $@



function name{ commands; }

Korn shell 中,此為 typeset -f 的別名。請見前面有關 name 的說明。


--------------------------------------

getopts string name [args]

用來處理指令列參數;用於迴圈中,可用來檢查 shell script 的指令列參數是否有正確使用標準語法。標準語法中,參數皆需以 或是 開頭。多個選項可共用同一個 號,比如 -abcde。選項結尾加上 -- 號。string 是執行此 shell script 時,getopts 所需認可的選項字母。合法的選項就依序處理並儲存於 name 變數中。若選項後緊接著冒號,則之後必須接著至少一個該選項的參數。getopts 使用兩個 shell 變數,OPTARG 與 OPTIND。若使用者使用的 shell非 Bourne shell,也可使用 /usr/bin/getopts 來代替這個指令。


--------------------------------------
hash

Korn shell 中,此為 alias -t 的別名。與 Bourne shell 的 hash 相同。


--------------------------------------
hash [-r] [commands]

適用於 Bourne shell 的形式。搜尋 commands 所在並記錄其完整的路徑。進行 hash 之前,程式只能在其所在的目錄中執行。hash 之後,則可在任一目錄中執行該程式,就像是將該程式加入 shell 的 已知指令集 一般。若改變了 PATH 變數,也一樣要對指令進行 hash 的動作。號會將指定的指令從 hash 表中除去,若不加上 command 參數,則將所有的指令均除去 hash。若無任何參數,hash 指令會列出所有在記錄中的指令。hits 一欄表示該指令被呼叫的次數。costs 一欄表示要尋找到該指令所花費的工夫。


--------------------------------------
history

列出前 16 個指令,Korn shell 中為 fc -l 之別名。


--------------------------------------
if condition1
then commands1
[elif condition2
  then commands2]
.
.
.
[else commands3]
fi

若 condition1 條件成立,則執行 commands1; 否則若 condition2 條件成立則執行 commands2。若兩者皆不合,則執行 commands3。通常條件式均由 test 指令構成。見 與 exit下之使用範例。


integer

定義整數變數,Korn shell 中為 typeset -i 的別名


--------------------------------------
jobs [options] [jobIDs]

列出所有正在執行或是待機中的 jobs,或是列出由 jobIDs 指定的 job。比如,為了要看看某個正在編譯的行程或是正在格式化的文件檔是否還在執行。登出前也可用來檢查是否有遺漏未處理的 job。見 Job 控制功能。

Options

-l              列出 job 的 ID 與行程群組的 ID
-n              列出自上次列表後改變過的 job。僅適用於 Korn shell
-p              僅列出行程群組的 ID
-x cmd              將所找到的 cmd jobs 的 jobID 改為相應的行程 ID,並執行 cmd


--------------------------------------
kill [options] IDs

將所指定的行程 ID 或是 job ID 予以終止。必需是特權使用者或是擁有該行程才可以使用此指令。此內建指令和 /bin/kill 類似,見第二章的說明與 job 控制功能之說明。

Options
  -l              列出所有的 signal ( 訊號 名稱
  -signal              用 ps -f 可找到 signal 的號碼,用 kill -l 找出 signal 的名稱。              若用 號做為 signal 號碼,則是直接停掉該行程或是 job


Signals

signal 定義在 /usr/include/sys/signal中。此處列出者不含前面的 SIG 字首。

HUP                            1              hangup( 掛斷連線 )
INT                            2              interrupt( 中斷 )
QUIT              3              quit( 退出 )
ILL                            4              非法指令
TRAP    5               trace trap
IOT                            6              IOT 指令
EMT                            7              EMT 指令
FPE                            8              浮點運算所產生的例外狀況
KILL              9              kill
BUS                            10              bus error
SEGV              11              segmentation violation( 節區錯誤 )
SYS                            12              系統呼叫參數錯誤
PIPE              13              寫入的 pipe 沒有行程讀取
ALRM              14              鬧鐘
TERM              15  軟體終止,標準 signal
USR1              16              使用者自訂 signal 一號 
USR2              17              使用者自訂 signal 二號
CLD                            18  子 process 終止 
PWR                            19  斷電後重新開機 


--------------------------------------
let expressions 或 ((expressions))

僅適用於 Korn shell。算出 expression 所指定的運算結果。expression 為一數學運算式,其中可包括數字,運算子和 shell 變數 不需要加 $)。若內含特殊符號,則須加上引用符號。(()) 已包含引用功能。使用範例請參考本章前 數學算式 一節。也請參考第二章 expr




--------------------------------------
newgrp [group]

將自己的群組 ID 改成 group 或是改回預設的群組。


--------------------------------------
nohup
登出後也不將此指令結束。nohup 是個 Korn shell 的別名:

nohup='nohup '

後面的空格可以讓 nohup 將後面接著的指令當做別名看待。


--------------------------------------
print [options] [string]

僅適用於 Korn shell。將 string 顯示在標準輸出上 預設值 )print 包括了 echo 的功能,在大部份的 UNIX 上都可以代用。

Options

-              略過後面的選項
--              同上
-n              輸出時不加上換行
-p              將 string 送到由 |& 建立的行程,而不是送到標準輸出。
-r              忽略 echo 所使用的 escape 字串
-R              除了同 -r 外,並忽略後面除了 -n 以外的選項
-s              將 string 送入 history 檔案
-u[n]              將 string 送往檔案代碼 n( 預設為 1)


--------------------------------------
pwd

將目前工作目錄名稱顯示在標準輸出上。Korn shell 中這個指令其實是 print -r - $PWD的別名。


--------------------------------------
r

再執行一次上一個指令,Korn shell 中是 fc -e - 的別名。


--------------------------------------

read variable1 [variable1 ...]

讀入一行輸入並將每個字分別指定到相應的變數 variable 中。若字數大於變數之數目,則多出來的字將全部設定給最後一個變數。若僅有一變數,則整行都設定給該變數。見下例與 case 之例。除非讀取到 EOF,否則傳回值均為 0

範例:




--------------------------------------

read [options] [variable1?string] [ variable2 ...]

僅適用於 Korn shell。和 Bourne shell 相同,除了有下列的選項外,還可以用 號來提示輸入。若 variable 後接著 ?string,則 string 會變成顯示的提示字串。若沒有給變數,則輸入全部存入 REPLY 變數中。

Options

-p              從 |& 的共行行程中讀取輸出
-r              原始模式 將不把 視為續行符號
-s              將輸入存於使用過的指令記錄中
-u[n]              從檔案代瑪 中讀取輸入

範例:

提示自己要輸入兩個溫度

$read n1?"High low: " n2
High low: 65 33

--------------------------------------

readonly [variable1 variable2 ...]

將指定的變數設定為唯讀,不可予以更改。Korn shell 中用 variable=value 可以設定變
數的新值並設為唯讀。


--------------------------------------
return [n]

用於函式定義。結束時傳回 n,或是傳回前一個指令的傳回值。

--------------------------------------

select x [in list]
do 
  commands
done

僅適用於 Korn shell。在標準錯誤上依照 list 的順序列出一張選單。若無 list,則列出的項目為指令列參數 #@。選單後是由 PS3 所指定的提示字串。在此提示符號下,打入項目的行號可以選擇該項目,按 ENTER 則重新顯示一次選單。使用者的輸入儲存在 REPLY 變數中。選擇該項目後,則執行對應的commands


--------------------------------------

set [options arg1 arg2 ... ]

不給任何參數時,set 列出目前 shell 內所有的變數。啟動選項用 -option,關閉該選項用 +option。也可由 ksh 或 sh 在啟動 shell 時就啟動一些選項。見本章最後有關呼叫 shell 一節 )。參數依序為 $1 $2 等等。

Options

+A name              僅 Korn shell 適用。將其後的參數均指定為 name 陣列之元素。
-A name              僅 Korn shell 適用。同上,但設定前先清除 name 陣列。
-a              此行之後所有的變數均自動 輸出 " (export)
-e              若指令不正常結束,則跳出 shell scriptKorn shell 中,會在指令結束前先發出 ERR trap
-f              忽略檔名中介符號
-h              定義指令的同時搜尋其位置。Korn shell 會建立追蹤別名,而 Bourne shell 則進行指令 hash
-k              不論變數指定 (var=value) 出現在指令行的何處都可以,預設為指令之後才可接變數指定。
-m              啟動 job 控制功能 背景執行的 job 會歸類於不同的 process 群組中。通常 shell 啟動時會自動開啟 -m 選項。僅用於 Korn shell
-n              讀取指令但不予執行,除錯時常用。
-o[m]              列出 Korn shell 的模式,或是啟動第 個模式。許多模式可由其他選項啟動。下列為模式:
              
    allexport              與 -a 相同
              bgnice                            將背景 job 以較低的優先順序執行
              emacs                            將指令行編輯器設定為 emacs
              errexit                            與 -e 相同
              ignoreeof              不理會 EOF signal。要結束 shell 則必需打 exit
              keyword                            同 -k
              markdirs              將目錄名稱前加上 /
              monitor                            與 -m 相同
              noclobber              防止 時覆寫檔案。用 >| 才可覆寫。
              noexec                            同 -n
              noglob                            同 -f
              nolog                            history 檔中不要加入函式定義
              nounset                            同 -u
              privileged              同 -p
              trackall              同 -h
              verbose                            同 -v
              vi                            將指令行編輯器設定為 vi
              viraw                            同 vi,但每打一個字元就加以處理
              xtrace                            同 -x

-p               啟動時為特權使用者 不處理 $HOME/profile)
-s              僅 Korn shell,將指令行參數排序
-t              執行完一個指令就結束
-u              變數替代時,若有未設定的變數則視為錯誤。
-v              每讀入一行指令即顯示出來
-x              每執行一行指令,即顯示為 "+ 指令 參數 ",此選項可進行一步一步除錯之用。和 -o xtrace 相同 )
-              將 -v -x 關掉。也關掉選項處理。Korn shell 中也支援 為了與較老舊的 Bourne shell 相容 )
--              當做選項的結尾,將選項處理關閉,如此以 開頭之參數便不會被誤以為是選項了。比如可以將 $1 設定為 -1) 若 -- 之後並無參數,則將所有指令列參數重設。

範例:

set -- "$num" -20 -30               將 $1 設定為 $num$2 為 -20$3 為 -30
set -vx                            將每個指令讀入並顯示,執行完再顯示一次 包括參數 )
set +x                                          關閉 trace 功能
set -o noclobber              防止檔案覆寫
set +o noclobber              允許檔案覆寫


--------------------------------------
shift[n]

將指令行參數移位 比如 $2 變成 $1)。若指定 n,則向左移 位。while 迴圈中用來循序處理指令行參數用。Korn shell 中 可以是整數運算式。


--------------------------------------
stop [jobIDs]

將 jobIDs 指定的背景 job 暫停 與 suspend 和 Ctrl-Z 可互換使用。Korn shell 中無法使用。見 "Job 控制功能 "


--------------------------------------
suspend
和 Ctrl-Z 相同。常用來停止 su 指令。Korn shell 中無法使用。


--------------------------------------
test condition 
or
[condition]

測試 condition 是否條件成立,若是,則傳回 0,否則傳回非 的值。也可用 [] 來代替 test 指令。Korn shell 中還可使用 [[]]。下列為條件式,Korn shell 專屬者加上 (K) 記號。

檔案條件式

-a file              file 存在 (K)
-b file              file 存在且為區塊特別檔
-c file              file 存在且為字元特別檔
-d file              file 存在且為目錄
-f file              file 存在且為普通檔案
-G file              file 存在且群組為有效群組 ID (K)
-g file              file 存在且 set-group-id bit 已設定
-k file               file 存在且 sticky bit 已設定
-L file               file 存在且為符號連結 (symbolic link)(K)
-O file               file 存在且擁有者為有效使用者 ID
-o c                            選項開啟 (K)
-p file               file 存在且為 named pipe(FIFO)
-r file               file 存在且可讀
-S file               file 存在且為 socket(K)
-s file               file 存在且大小大於 0
-t[n]                            檔案代碼 代表著某個終端裝置,預設 為 1
-u file               file 存在且 set-user-id bit 已設定
-w file               file 存在且可寫入
-x file               file 存在且可執行
f1 -ef f2              f1 與 f2 兩個檔案有連結關係 指向同一個檔案 )(K)
f1 -nt f2              f1 比 f2 新。(K)
f1 -ot f2              f1 比 f2 舊。(K)

字串條件式

-n s1              s1 長度不為 0
-z s1              s1 長度為 0
s1=s2              兩字串相同,Korn shell 中,s2 可以是常規表示式 ( regular expression ) 
s1!=s2              兩字串不同,Korn shell 中,s2 可以是常規表示式
s1的 ASCII 值比 s2 的小,僅可在 [[]] 內使用。(K)
s1>s2  s1 的 ASCII 值比 s2 的大,僅可在 [[]] 內使用。(K)
string              string 非 null 

整數比較式

n1 -eq n2              n1 等於 n2
n1 -ge n2              n1 大於等於 n2
n1 -gt n2              n1 大於 n2
n1 -le n2              n1 小於等於 n2
n1 -lt n2              n1 小於 n2
n1 -ne n2              n1 不等於 n2

條件式之間的結合

(condition)              若 condition 條件成立則為真。() 之前需加上 \
!condition              若 condition 條件不成立則為真。
condition1 -a condition2
                            兩者皆成立則為真
condition1 && condition2
                            兩者皆成立則為真,僅可用於 [[]] 中。(K)
condition1 -o condition2
                            兩者只要其一成立則為真。
condition1 || condition2
                            兩者只要其一成立則為真,僅可用於 [[]] 中。(K)

範例:

下列僅列出條件式的部份:

while test $# -gt 0              當參數個數不為 ...
while [ -n "$1" ]              當參數本身長度大於 0...
if [ $count -lt 10 ]              若 $count 小於 10...
if [ -d RCS ]                            若 RCS 目錄存在...
if [ "$answer" != "y" ]               若 $answer 不是 ...
if [ ! -r "$1" -o ! -f "$1" ]              若第一個參數不是可讀檔或是一般檔...


--------------------------------------
time command

執行 command,並顯示此指令所使用的累計時間,使用者時間和系統時間,單位為秒。和第二章的 time 指令相同,但內建的 time 指令除了可以計算一般 UNIX 指令的時間外,也可計算其他內建指令以及在 pipeline 中所有指令的時間。


--------------------------------------
times

顯示使用者和系統的累計 process 時間。


--------------------------------------
trap [ [commands] signals]

若收到 signals 則執行 commands。一般的 signal 包括 01和 15。若要執行多個指令,需加上 () 並且用 分開。若 commands 是 null 字串 (trap "" signals),則 shell 會忽略這些 signal。若完全不給 commands 參數,則重設收到 signal 的動作。若僅用 trap 指令,則列出現有的 signal 與 command 的設定。見下列例子與 exec

signals

  下列 signal 後為其發生原因

              0              shell 結束 通常是 shell script 結束時 )
              1              登出,也稱為掛斷 Hangup
              2              中斷 通常是 Ctrl-C)
              3              quit
              4   非法指令
              5              trace trap
              6              IOT 指令
              7              EMT 指令
              8   浮點運算所產生的例外狀況
              10              bus error ( 匯流排錯誤 )
13               寫入的 pipe 沒有行程 ( process ) 讀取
              14              Alarm timeout ( 鬧鐘逾時 )
              15              軟體終止
              ERR                非 傳回值,僅 Korn shell 
              DEBUG              執行任何指令,僅 Korn shell 

範例:

trap "" 2              忽略 signal 2
trap 2                            重設 signal 2 的動作

--------------------------------------
trap

若 shell 程式結束或是使用者登出,按 Ctrl-C 或是用 kill 時,將 $tmp 檔刪除。

trap "rm -f $tmp; exit" 0 1 2 15

若 shell 程式收到 1或 15 號 signal 時,顯示 "clean up"

trap 'echo Interrupt!    Cleaning up ...' 1 2 15

--------------------------------------

type commands

顯示該 commands 是否為 UNIX 指令或是 shell 指令或是 shell 的函式。Korn shell 中,這是 whence-v 的別名。




--------------------------------------

typeset [options] [variable[=value ...]]

僅適用於 Korn shell。將 variable 設定成某種 type,並設定其 value。若無 variable 參數,則列出目前所有屬於某種 type 的參數 由 options 指定 )。指定變數後,在 option前加 是關掉該選項,加 是打開該選項。若無變數參數,則 僅列出所有該選項的變數, 則列出變數的名稱與設定的值。

Options

-f[c]              
此選項表是該變數是一個函式名稱。不可在此進行定義。若無 variable 參數,則列出目前所有的函式。可以是 t或是 x會將 tracing 功能打開,和 set -x 一樣 )會將此函式標明為 未定義 ",在下一次使用到該函式時,會去 FPATH 中搜尋並加以定義。會 輸出 該函式。請參考 autoload 與  funcion

-H                            在非 UNIX 系統上,這個選項可以將 UNIX 檔名對應到該系統的檔名。
-i[n]              定義變數為 進位整數。interger 即 typeset -i 之別名。
-L[n]              將字串定義為向左對齊,長度為 n,多截少補 0。原字串前的空白會略過,若有加上 -Z 的話,也會將開頭的 略過。若不加上 n,則長度為此變數的初始值。
-l              將大寫改成小寫
-R[n]  將字串定義為向右對齊,長度為 n,多截少補 0。原字串後的空白會略過,若不加上 n,則長度為此變數的初始值。
-r              將變數設定成唯讀,見 readonly
-t              將變數設定為使用者自訂
-u              將小寫改成大寫
-x              將變數設定為自動 輸出 "(export)
-Z[n]              與 -L 合用時,會略過開頭的 0。獨立使用時,和 -R 相同,只是對於數字變數補 0,對於字串變數補空白字元。

範例:

typeset                            列出所有變數的名稱,值和 type
typeset -x                            列出 輸出 變數的名稱與值
typeset +r PWD                            將目前目錄的唯讀屬性取消
typeset -R5 zipcode              將 zipcode 設定為向右對齊,長度為 n


--------------------------------------
ulimit [options] [n]

列出資源限制的值。若指定 n,則將某資源上限設定為 n。資源限制可以是強制 (hard-H)或是彈性 (soft-S)。預設情況下,ulimit 會設定這兩種限制上限,但顯示時僅顯示彈性限制。選項用來指定作用的資源。

Options

-H              強制限制。任何人都可以降低其上限,但只有特權使用者可以增加。
-S              彈性限制,必須比強制限制值低。
-a              列出所有的限制值
-c              core 檔案的區塊大小上限
-d              資料節區或是 heap 區的大小上限 (kbytes)
-f              檔案的區塊大小上限 這是預設的選項 )
-n              檔案代碼上限 +1
-s  stack 節區大小上限 (Kbytes)
-t              CPU 秒數上限
-v              虛擬記憶體上限 (Kbytes)


--------------------------------------

umask[nnn]

顯示新檔案的 mask 或是將 mask 設定為八進位的 nnn 值。這個 mask 會決定那些 bit 會關閉,比如 umask 002 會產生 rw-rw-r-- 這樣的檔案存取屬性。umask 也是 UNIX 的指令,見第二章。


--------------------------------------

unalias names

僅可用於 Korn shell。將 names 從別名中移除。見 alias


--------------------------------------
unset [-f] names

將 names 的定義 可以是函式或是變數 予以移除。Korn shell 中,若要移除函式,則必須使用 -f 選項。


--------------------------------------
until conditon 
do 
              commands
done

condition 條件成立之前,重覆執行 commandsconditon 的條件式通常用 test 來建立。


--------------------------------------
wait [ID]

先停止執行,直到背景的行程結束才繼續。或是等 ID 結束後才繼蓄 (ID 可以是 job ID 或是行程 ID)$! 這個變數是前一個在背景中執行的行程 ID。若無 job 控制功能,則 ID 僅能使用行程 ID。見 job 控制功能。

範例

wait $!              等待上一個背景行程結束


--------------------------------------
whence [options] commands

僅可用於 Korn shell。顯示 commands 是否為 UNIX 指令或是 shell 內建指令或是定義的函式或是別名。

Options

-p              尋找 commands 的路徑
-v              詳細顯示,同 type


--------------------------------------
while conditon
do 
              commands
done

只要 condition 條件成立時,重覆執行 commands。條件式通常由 test 建立。見 case 與 test 的使用範例。


---------------------------------------------

filename

從 filename 指定的檔案中讀取內容並予以執行,此檔必須是可執行檔。


--------------------------------------


p4-33

Job 控制功能

加上 job 控制功能後,就可以將程式從前景放入背景或是從背景放入前景執行,也可以將
程式暫停。下列指令均可啟動 job 控制功能:

jsh -i                            Bourne shell
ksh -m -i              Korn shell( 下兩行相同 )
set -m
set -o monitor

許多 job 的指令都需用 jobIDs 當做參數。這些參數可以下列代號表示:

%n              job 號碼 n
%s              以 字串開頭的 job ( 指指令列以 字串開頭 )
%?s              job 指令行中含有 字串者
%%              目前的 job
%+              同上
%-              前一個 job

Bourne shell 與 Korn shell 提供下列 job 控制指令。詳見前面有關 內建指令 的用法。

bg              將 job 放入背景
fg              將 job 放入前景
jobs              列出 jobs
kill              結束 job
stop              將背景的 job 暫停
stty tostop              若背景程式要輸出到終端機,則予以暫停
suspend              和 Ctrl-Z 相同
wait              等待背景 job 完成
CTRL-Z              將背景程式暫停。然後用 fg 或是 bg( 有些終端機的暫停字元不同 )






呼叫 Shell

shell 可以於指令列啟動,指令如下:

sh [options] [arguments]              # Bourne shell
ksh [options] [arguments]              # Korn shell

ksh 和 sh 可以加上 -i 選項,可從終端機執行指令。若第一個參數是檔案名稱時,則執行該檔案。若不加任何選項或是用 -s 選項時,則用從標準輸入執行。

參數 (Arguments)

參數依序指定給變數 $1 $2 等等。若使用 -A 或 +A 來定義陣列,則指定給陣列的元素。若第一個參數是 shell script,則 shell 會執行該 script,並把其它的參數依序指定給 $1 $2 等等。

Options

  -c str              從 str 字串讀入指令
  -i                            建立互動 shell,用提示符號來提示輸入
  -p                            不處理 $HOME/profile,直接以特權使用者啟動 shell
  -r                            啟動加上限制的 shell,同 rsh 或是 rksh
  -s                            從標準輸入讀指令,所有內建指令的輸出均輸出往檔案代碼 1; 其他 shell 輸出則送往檔案代碼 2

其它的選項列在 set 指令說明中。







加上的限制 shell

下列指令均可啟動加上限制的 shell

rksh                            Korn shell
ksh -r
set -r

rsh                            Bourne shell
set -r

若在 /etc/passwd 中設定有相關的欄位,也可啟動加上限制的 shell。或是使用 SHELL 變數加以指定。

除了下列限制,和一般的 shell 並無不同:

。不可使用 cd 等切換目錄的指令
。不可設定 PATH 變數 (rksh 也不准設定 ENV 與 SHELL)
。不可將 當做路徑開頭或是指令名稱
。不可用重導向輸出入

不過還是可以執行 shell script,因為這時是呼叫新的 ksh 或是 sh 來執行。

UNIX Shell: 概說

對初學者來說,本章講解的是 shell 的基本概念。對進階使用者來說,本章列舉了一些 C shellKorne shell 和 Borne shell 間的基本差異。若需要這些 shell 的詳細說明,請參考第四第五兩章。

下列為本章要點:

* Shell 簡介
如何正確使用 shell
不同的 shell
共通的特點
特有的功能



Shell 簡介


我們先把 UNIX 想像成一輛車。開車的時候,我們用不同的方式對車子下 命令 ",比如轉方向盤,踩煞車,踩油門等等。可是這些動作怎樣才變成車子真正的動作呢? 轉向加速減速等等 這就是透過車子的傳動裝置,也可看做是車子的使用介面。車子有可能是前輪傳動,後輪傳動,或是四輪傳動,甚至是三種的組合。


對 UNIX 來說,Shell 就像是車子的使用介面,種類也相當多樣化。有些系統只提供一種 shell,有些則提供不少選擇。每種 shell 的特點不同,但相同的是,這些 shell 都會影響指令解譯的結果,並提供不同的工具來建立 UNIX 操作環境。

Shell 只是一個讓系統了解指令的程式 所以常稱為指令解譯器 )。對大部份的使用者來說,shell 幾乎是隱形的。使用者在意的只是系統是否按照指令動作,而不是怎麼動作。以車子的例子來說,踩煞車就是要車子停下來,不管用的是鼓煞還是碟煞系統。


Shell 的目地


使用 shell 的目地有三個 :

互動地使用系統
自訂 UNIX 使用環境
程式設計


互動地使用系統


當我們稱系統在互動環境 "下時,意思是說,系統會用個提示符號等待你輸入指令。指令可以包括特殊符號,可以不必打出完整檔名,或是將輸出入重導向。


.自定 UNIX 使用環境


UNIX shell 下有一些變數可以用來控制系統。比如有些變數可以告訴系統你的目錄在哪,或是信件該放在哪個目錄中。有些變數是系統內定的,其他的可以從啟使檔中定義,在登入時就會自動設定。啟始檔案也可以包括 UNIX 指令或是 shell 命令,每次登入時都會自動執行。



程式設計


UNIX shell 提供了一些特殊的指令,可以用來寫 shell script。不少 shell 內建的指令可以當做一般的 UNIX 指令在互動環境下使用,也有不少 shell script 中包含大量的 UNIX 指令。shell script 最有用的地方,就在於可以依序執行一系列的指令,跟 MS-DOS 的批次檔類似。script 也和許多高階語言一樣,提供迴圈,可以重複執行指令。


不同的 shell


UNIX 有許多不同的 shell。本書討論最常見的三種:

* Bourne shell( 或稱為標準 shell),這是最小最簡單的 shell
* Korn shell,比 Bourne shell 更進步些,可以編輯指令行
* C shell,語法和 相同,使用上相當方便


大部份的系統都有許多種 shell,通常使用者會用 Bourne shell 寫 shell script,但互動環境使用另一種 shell


/etc/passwd 檔可決定在互動的UNIX環境下,哪一個 shell 會發生作用。在登入時,系統會去檢查 /etc/passwd 檔的內容,每一行 ( entry ) 最後一個欄位就是互動環境下的 shell 程式名,例如 :


程式名稱              所使用的 shell
﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍
/bin/sh                            Bourne shell
/bin/rsh              限制下的 Bourne shell
/bin/jsh              加上 job 管理的 Bourne shell
/bin/ksh              Korn shell
/bin/rksh              限制下的 Korn shell
/bin/csh              C shell



你可以隨時打入不同的 shell 程式名稱以變換 shell。如果想要換成 C shell,只要打入 :

$ exec csh

就可以了。



共通的特點


下表是 BourneKorn 和 C shell 一些共通的特點。值得注意的是,Korn shell 是 Bourne 
shell 的延伸,所以包含所有 Bourne shell 的特點,加上自己獨有的特點。Bgfgjobs
stop 和 suspend 只有在支援 job 控制的系統上才有用。


符號 指令               意義 動作

>                            將輸出重導向
>>                            附於檔尾
<                            將輸入重導向
<<                            立即輸入 (Here 檔案 )
|                            pipe 輸出
&                            將該 process 放入背景執行
;                            同行不同指令的分隔符號
*                            萬用字元 不限字數 )
?                            單一萬用字元
[ ]                            找出符合括號中的字串的檔名
( )                            開子 shell 執行該指令
` `                            替代引號中指令的輸出
" "                            部份引用 可以進行變數與指令的展開 )
' '                            全部引用 不可展開 )
\                            引用後面的單一字元
$var                            取得變數的值
$$                            process ID ( 行程編號 )
$0                            指令名稱
$n                            第 個參數 (0<9)
$*                            將所有參數集合起來
#                            註解符號
bg                            背景執行
break                            跳出迴圈
cd                            換目錄
continue                            繼續迴圈
echo                            顯示輸出
eval                            計算參數
exec                            開一個新的 shell
fg                            前景執行
jobs                            顯示目前的 job
kill                            停止正在執行的 job
newgrp                            切換到新的群組
shift                            移動參數位置
stop                            暫停某一背景 job
suspend                            暫停某一前景 job
time                            將該指令執行時間加以計時
umask                            設定或是顯示檔案存取權限
unset                            清除變數或是函式定義
wait                            等待背景程式結束

                               


2010年1月7日 星期四

UNIX 指令簡介

UNIX 作業系統最早在 1970 年代由 AT&T(現在的 USL)所發展。因為 UNIX 可以在不同的硬體上執行,所以廠商大部分都會將 UNIX 做些修改。後來演變成為幾個主要的 UNIX 流派:USL 的 System V、加州大學柏克萊分校的 BSD(Berkeley Standard Distribution)、Linux 與 Microsoft 開發的 Xenix 等等。

萬流歸宗
時至今日,大家都想把不同流派的 UNIX 統一為單一標準。(國際上所推行的 POSIX 標準,對此影響深遠)本書所討論的是大多數人所認可「較標準」的 UNIX,也就是 SVR4 與 Solaris 2.0。

SVR4 是由 USL(AT&T 轄下的一個部門)與 Sun Microsystems 共同發展的,它結合了 SVR3 和 BSD 的特性。此舉加入了不少原 BSD 系統上的指令(加上一些新的 SVR4 指令)。除此之外,SVR4 還提供了一個「BSD 相容套件」,支援一些原本在 BSD 系統上的指令,目的在於讓使用者可以輕鬆地轉換到 SVR4。

Solaris 2.0 是 SunSoft(Sun Micosystem 的軟體部門)所發展的分散式計算環境,它包含了 SunOS 5.0 和 OpenWindows 的額外功能。簡單的說,就是整合了 SunOS 4.1 與 SVR4 的結果,所以 Solaris 2.0 雖然是根基於 SVR4 的系統,但有不少 BSD/SunOS 的特點。為了讓其他使用者(主要是 BSD 的使用者)可以很快熟悉 Solaris 2.0 環境,Solaris 2.0 提供了 BSD/SunOS 相容套件和執行檔相容套件。

附屬套件
另一個讓 UNIX 系統五味雜陳的原因,就是附屬套件的概念(Bundle)。UNIX 系統有非常多的功能,往往超出使用者的實際需求。今日的 UNIX 系統通常會將各功能製作成可個別增減的套件,供使用者選擇。結果造成某些套件是系統內定所需,有些卻要額外付費才能取得。附屬套件通常可以讓使用者選擇所需來購買。一般的附屬套件包括:

Basic System 基本系統指令和公用工具
Programming 編譯器、除錯器和函式庫
Text Processing 包含 Troff、巨集和相關工具
Networking 用來連上網路的工具,包括 rlogin、rcp 等等。
Windowing 圖形操作介面,如 OPEN LOOK 和 Motif。

如何搭配這些附屬套件全看廠商決定。比如說,Solaris2.0 出貨時就包括了 OpenWindows,這是一個以 OPEN LOOK 為基礎的視窗環境;不需要另外購買。但對其他廠商來說,圖形介面可能要另外付費。同樣的,某些廠商會隨貨附贈文字處理軟體,有些廠商就要另外收費。

速查手冊內容
本書主要講解的是 SVR4 的通用功能,與 Solaris 2.0 相容套件的功能。另外還有 emacs 和 RCS 的解說章節。雖然這並非標準 SVR4 的一部份,但許多 UNIX 系統上還是會安裝這些軟體,因為實在非常好用。

請注意,若您的系統上未安裝這些套件,手冊中某些指令就無法在您的系統上使用。

本書最主要的是第二章的 UNIX 指令解說。主要是針對使用者和程式設計師所使用的指令,系統管理方面的指令予以忽略。第二章的解說內容如下:

* SVR3 的指令
* SVR4 新增的指令和選項
* 一些 Solaris 2.0 相容套件中的指令

SVR3 使用者請注意,在第二章中出現的部份指令, SVR3 中並沒有提供。這些指令如下:

// p1-3 code

新手導覽
若你是 UNIX 新手,這麼多的指令可是相當嚇人的。下面是一些常用指令的分類表:

通訊指令
cu 連到 UNIX 系統上
ftp 檔案傳輸協定
login 登入到 UNIX 系統
mailx 收發電子郵件
rlogin 登入遠端的 UNIX 系統
talk 送訊息到其他終端機上
telnet 連線到另一個系統上
vacation 自動回覆信件
write 送簡短訊息到其它終端機上

比較指令
cmp 比較兩個檔案
comm 比較檔案中的項目
diff 比較兩個檔案
diff3 比較三個檔案
dircmp 比較目錄
sdiff 比較兩個檔案時,將兩個檔案同時顯示出來

檔案管理
cat 合併或顯示檔案
cd 切換目錄
chmod 改變檔案存取權限
cp 複製檔案
csplit 將檔案在特定位置斷開
file 檢查檔案類型
head 顯示檔案開頭幾行
install 設定系統檔案
ln 建立檔案別名
ls 列出檔案或目錄
mkdir 建立目錄
more 分頁顯示檔案
mv 移動或對檔案重新命名
pwd 顯示工作目錄
rcp 將檔案複製到遠端系統上
rm 刪除檔案
rmdir 刪除目錄
split 將檔案對半斷開
tail 顯示檔案的最後幾行
wc 計算行數、字詞數與字元數

雜項指令
banner 建立橫標
bc 計算機
cal 顯示日曆
calendar 備忘錄
clear 清除螢幕
kill 終結執行中的程式
man 取得指令說明
nice 降低程式優先權
nohup 登出後不將程式結束
passwd 設定密碼
script 將登入過程寫成 script
spell 檢查拼字
su 切換成超級使用者 ( superuser )

列印指令
cancel 取消列印
lp 文件送至印表機
lpstat 檢查印表機狀態
pr 將文件格式化及分頁

程式設計
cb C 原始碼的「美容」程式(自動縮排、括弧對稱 ...)
cc C 的編譯器
cflow C 函式流程圖
ctags C 函式參考
ctrace C 除錯器
cxref C 交互參考 ( cross-reference )
lint C 除錯器
ld 連結編輯器
lex 語法分析器
make 以特定順序執行指令
od 將輸入以多種格式顯示
sdb 符號式(symbolic)除錯器
strip 從 object 檔中除去一些資料
truss 追蹤 signal 和系統呼叫
yacc lex 用的編譯器

搜尋指令
egrep grep 指令的加強版
fgrep 在檔案中尋找字串
find 在系統中依檔名尋找檔案
grep 在檔案中尋找文件樣式(text pattern)
string 在二元檔中尋找文件樣式(text pattern)

Shell 程式設計
echo 將輸入的文字放在輸出上
expr 進行數學運算和比較
line 讀入一行輸入
sleep 處理時暫停
test 檢查條件是否成立

儲存媒介
compress 把檔案壓縮成為 .Z 檔以節省空間
cpio 複製備份檔
pack 把檔案包裝壓縮成為 .z 檔以節省空間
pcat 列出 .z 檔的內容
tar 將數個檔案合併成一個 .tar 檔,以便存入磁帶機
uncompress 解開 .Z 的檔案
unpack 解開 .z 的檔案
zcat 顯示壓縮檔的內容


系統狀態
at 在指定的時間執行指定的命令
chgrp 改變檔案的群組
chown 改變檔案擁有者
crontab 自動化指令
date 顯示或設定日期時間
df 顯示可用磁碟空間
du 顯示磁碟使用狀況
env 顯示環境變數
finger 顯示關於使用者的資訊
ps 顯示行程 (process)
ruptime 顯示系統的負載
shutdown 切換為單人模式
stty 設定或顯示終端機設定
who 顯示有目前登入系統的使用者

文書處理
cut 設定顯示的欄位
ex vi 的行編輯器
fmt 格式化文字行,儘可能把每一文字行的長度調整到相同(大致相同)
fold 把每一文字行的長度調整到相同
join 將不同的欄位資料併入資料庫中
nawk 新版的 awk,它是資料庫檔案所使用的樣式比對(Pattern-matching)語言
paste 將欄位位置互換或合併
sed 非互動式文字的編輯器
sort 排序或是合併檔案
tr 字元轉譯(或重新定義)
uniq 找出檔案中獨一無二或是重複的行
vi 全螢幕式編輯程式
xargs 處理參數

Troff
除了 deroff 之外,其餘都是相容套件中的一部份
deroff 移除 troff 碼
eqn 方程式前置處理器
nroff 終端機顯示用的排版工具
pic 繪圖用的前置處理器
tbl 表格前置處理器
troff 製版用排版程式

2010年1月5日 星期二

All about HTML tags 9 Regular Expressions to strip HTML tags

這是我目前找到跟html有關而且最好用的正規式參考範例了
轉自
http://www.pagecolumn.com/tool/all_about_html_tags.htm


All about HTML tags

9 Regular Expressions to strip HTML tags



Quick syntax reference

flags
  • g - global match
  • i - ignore case
  • m - match over multiple lines
Escaping
  • \ - special characters to literal and literal characters to special
Quantifiers

  • ? - matches zero or one times
  • * - matches zero or more times
  • + - matches one or more times
  • {n} - matches n times
  • {n, m} - matches at least n times, but not more than m times
Anchors
  • ^ - matches at the start of the line
  • $ - matches at the end of the line
  • \b - matches at the beginning or the end of a word
delimiter
  • (?:x) - matches x not remember the match
  • x(?=y) - matches x only if x is followed by y
  • x(?!y) - matches x only if x is not followed by y
Character Escapes
  • \s - matches whitespace
  • \S - matches anything but a whitespace
  • \f - matches a form-feed
  • \n - matches a linefeed
  • \r - matches a carriage return
  • \t - matches a horizontal tab
  • \v - matches vertical tab
  • \w - matches any alphanumeric character including the underscore. Equivalent to [A-Za-z0-9_]
  • \W - matches any non-word character. Equivalent to [^A-Za-z0-9_]
Others
  • . - matches any character except a newline


It's not an easy job to parse HTML tags of the whole page using regular expressions.
But if you are dealing with a part of HTML tags and handle it as a string, the following regular expressions may be of your help.


1
matches specific tag pairs and content between them

RegEx Expression:
/<\s*h4[^>]*>(.*?)<\s*/\s*h4>/g

Method:
exec, match
Testing String

<h4 class="sds">And more ...</h4>


Live Test



2
matches all HTML tags pairs including attributes in the tags

RegEx Expression:
/<(.|\n)*?>/g
Method:
match
Testing String

<div class="tab0">CSS code formatter</div><div class="tab2">CSS code compressor</div>


Live Test


3
match all start tags including attributes in the tags

RegEx Expression:
/<\s*\w.*?>/g
Method:
match
Testing String
<div class="box">5 px radius of round corner</div><div class="box">7 px radius of round
corner</div><div style="color:#6699cc">color</div>

Live Test


4
matches all close tag

RegEx Expression:
/<\s*\/\s*\w\s*.*?>|<\s*br\s*>/g
Method:
match
Testing String

<div class="sds">not sure where it can be used</div></br>


Live Test


5
matches start tag of specific tag including attibutes

RegEx Expression:
/<\s*div.*?>/g
Method:
match
Testing String

<div class="tab1">tabs generator</div>


Live Test


6
matches close part of specific tag pair

RegEx Expression:
/<\s*\/\s*div\s*.*?>/g
Method:
match
Testing String

<div class="sds">javascript + CSS ...</div>


Live Test


7
matches specific HTML tag pair including attributes in the tags.

RegEx Expression:
/<\s*\/?\s*span\s*.*?>/g
Method:
match
Testing String

<span class="csc">Regex examples</span>


Live Test

8
matches start tag with specific attribute

RegEx Expression:
/<\s*\w*\s*style.*?>/g
Method:
match
Testing String

<div style="color:#6699cc">round corner</div>


Live Test

9
matches start tag with specific attribute

RegEx Expression:
/<\s*\w*\s*href\s*=\s*"?\s*([\w\s%#\/\.;:_-]*)\s*"?.*?>/g
Method:
exec, match
Testing String
<span ><a href="http://www.pagecolumn.com/">

3 Column Layout Generator </a></span> <span >
<a href="http://www.pagecolumn.com/2_col_generator.htm">2 Column Layout Generator</a></span>

Live Test

Social Bookmark if the tool is useful.


2010年1月4日 星期一

透過代理伺服器做網頁內容分析?

http://bbs.orzkoo.com/viewthread.php?tid=22008

提供部落格與相簿服務的Pixnet,希望透過代理伺服器檢測封包的能力,和後端分析軟體合作,過濾使用者分享的內容。



Pixnet 是一個擁有90萬會員的相簿與部落格服務供應商,但是一直有一個問題困擾著他們,那就是使用者放在這些共享空間的內容,如果違法或是擁有一些敏感的關鍵 字,目前仍然難以控管。Pixnet創辦人暨技術長曾黃霖說:「每個月都必須收到很多來自法院和警方的使用者調閱需求,其實也是一種人力成本。」

半年前導入代理伺服器提升效能,進一步希望做到內容過濾
半年前,Pixnet導入了BlueCoat的ProxySG產品做為代理伺服器,以提升使用者在瀏覽網頁上的效能,結果十分良好,原本維護網頁效能的人力,也減少至1人。但這兩件看起來毫無關聯的事件,卻讓曾皇霖有了一個想法,是否能夠透過代理伺服器的功能,達到內容過濾的效果?

原 本Pixnet希望能夠直接在代理伺服器上達到這樣的功能,BlueCoat大中華區技術總監曾良駿表示,由於代理伺服器是使用者連上Pixnet前的網 路流量分流與快取設備,本身就具備有部分分析封包內容的能力,理論上,這是可行的。「但是代理伺服器的設計,並不針對使用者分享的內容做分析,所以這一點 我們必須找其他廠商合作,才能做到。」曾良駿說。

曾皇霖指出,Pixnet的需求是必須透過黑名單的方式,找出使用者分享內容中違法的關鍵字,如援交訊息等,從而自動將其阻擋或發出警告訊息。

曾良駿表示,現在正在和一家國內廠商合作,開發這樣的功能,但因為仍在開發中,暫時無法透漏廠商的姓名。未來的架構很有可能將會是把代理伺服器取得的封包資料,導向到提供內容分析軟體的伺服器上,由這家合作廠商的軟體做到內容分析的能力。

能否成功還未定,架構為代理伺服器撐效能、後端設備分析
過 去有此類需求的網頁服務供應商,往往必須透過類似Web應用防火牆(Web Application Firewall)中內容分析的能力做到,但因為內容分析相當耗費硬體資源,往往會使得網頁開啟的效能降低。而Pixnet目前正在開發的這個架構,則將 分為兩段,流量先透過Proxy過濾分析,找出新增的使用者分享內容,之後再將這些封包轉送給後端內容分析的伺服器,這樣一來就不需要處理全部的流量。

這個架構還有一個優點,就是整體建置的費用應該會遠比單純使用Web應用防火牆來得便宜。不過最重要的分析演算正在開發中,也使得Pixnet是否能夠成功部署這樣的架構,還是未定之天。如果成功,將能有效阻擋使用者的不當內容。

曾 皇霖指出,這樣的需求在Web 2.0的時代將會越來越高,當網頁的內容不易受到控制,提供服務的廠商將會面臨很多問題。「我們不求全面滴水不漏的抓到所有違法內容,但是只要這樣的架構 能夠成功阻擋多數的內容,就將會替我們省下很多檢視內容的人力。」曾皇霖說。文☉劉哲銘

內容因素對SEO的影響分析

內容因素對SEO的影響分析

本文轉載自王通的部落格-http://www.ufoer.com/post/333.html

在我最初接觸網絡營銷的時候,我的朋友阿奇說過一句非常經典的話:網絡營銷,內容為王!這一句話一直影響著我,今天來和大家分析一下影響搜索引擎排名(SEO)的內容因素:

原則之一:內容越豐富,對SEO越有利!

為什麼有這樣一個原則呢? 我們就要學會分析搜索引擎的算法,如何分析呢? 要從人性化方面分析,因為搜索引擎所有的算法都在模倣人的思考方式來分析:什麼樣的網頁更專業?

原因一:內容越豐富,搜索引擎就會認為你越專業!

舉一個例子就可以說明這個問題,例如你和我都想把「電子商務」這個詞排在搜索引擎前面。並且都使用的是獨立域名針對這個關鍵詞做的一個網站。你的網站只有一個網頁,而我的網站有10個欄目1萬個網頁。那麼,是你的網站專業呢?還是我的網站專業? 肯定是內容豐富的專業!

原因二:內容越豐富,覆蓋的關鍵詞就越多,流量就越高!

過 去幾年,我給很多大型門戶網站做了SEO,做之前,這些網站每天通過搜索引擎自然排名帶來的流量只有幾萬IP,但是SEO了一年之後,他們每天通過搜索引 擎自然排名帶來的流量都超過了50萬IP。他們為什麼能夠通過SEO搞到如此大的流量呢? 最基本的前提就是:有著非常豐富的內容!

當 然,有成功,也有失敗的案例。我曾經給一個小行業門戶網站做SEO,我想,這樣一個小行業門戶網站,看起來內容這麼多,每天最少更新300篇內容吧,誰知 道他們每天只更新兩三篇。結果是,我把他們這個行業內最熱門的8個像「心理學」這樣的熱門關鍵詞都排到了Google的第一頁,他們竟然僅增加了幾百個流 量。我讓他們加大力度豐富內容,但是他們沒辦法執行。甚至內容沒有增加,反而在減少。如果這個網站內容從1萬個網頁用3個月提升到了10萬個網頁,在 SEO工作的配合下,流量增加10倍都不難。如果不增加內容,SEO做的再好,流量不可能有飛躍。

原則之二:原創內容越多,對SEO越有利!

近 幾年,CN域名一元一個,造成了垃圾網站的煩惱,對於很多個人站長或者團隊而言,網站不是「做」出來的,是生產出來的,因為做網站提案簡單了。傳一套 CMS係統上去,然後設置一下採集,一天就可以做好一個幾十萬網頁內容的網站。因為垃圾網站的氾濫,所以搜索引擎越來越重視原創內容。

搜索引擎如何來判斷是否是你的原創呢?

1、 被收錄的時間是一個因素

2、 文章中包含的鏈接是一個因素

特別是鏈接因為,因為PR值的算法最早都是借用傳統的論文專業判斷方式:在傳統的學術領域,一片論文被引用的越多,就說明這篇文章越專業!

網頁呢? 道理是一樣的,如果你的文章中把你自己的首發網址添加進入,然後到處轉摘,搜索引擎就可以判斷可能是你的原創。同時,這也是增加反向鏈接方法中的技巧一種。

一個網站不可能全部都是原創,但是能夠有一少部分原創就會比全部是採集的網站在排名上有優勢。如果你不會寫原創也沒關係,天下文章一大抄,你能夠很合理的編排現在的一些文章,也可以實現這個效果。

如何根據SEO的需求,在內容上下功夫呢?

1、 豐富網站的內容

說 起來簡單,做起來難,特別是對於很多非資訊類的電子商務網站,例如酒店機票預訂累網站。目前此類網站都是查詢的,但是查詢結果類網頁很難被收錄。如果採用 合理的SEO策略,通過不同的組合。例如:城市名到城市名+打折機票,這類組合詞,就可以搞出幾十萬個關鍵詞網頁,並且是有著專業內容的網頁。

當然,不同類型的網站,豐富內容的SEO策略不同,不過這個策略不是 簡單的SEO技術,而是將:SEO、人性化、創意這三者結合到一起,才能搞出非常豐富的、很人性化、看起來SEO的很自然的內容。

2、 內容的合理編排

在這方面,新浪網做的最棒,新浪裡面的大部分內容都是別人的,但是他們圍繞不同的主題,都有一個對應的索引編排。這樣,每個關鍵詞的主題都會看起來內容非常的豐富和專業。所以非常容易獲得好的排名。

目前博客中的tag,也是一種不錯的方式,因為每個tag都是一個關鍵詞,並且能夠合理的索引與其相關的文章。如果tag網頁能夠合理的按照SEO的角度來設計的更加專業的話,使用tag也是一種不錯的方式。

關鍵:圍繞關鍵詞,同時又看起來好像是為了用戶方便來做的。

3、 原創內容增加策略

1、自己增加內容

給自己制定計劃,例如每週一篇、或者每天一篇原創內容,隨著時間的積累,網站排名就會越來越好。這是一個積累的過程。

2、讓網友豐富內容

社區類網站,可以為每個網友提供一個專欄,或者定期搞有主題的徵文活動,可以讓廣大網友來為網站豐富大量的原創內容。

看到這裡,分析一下你的網站,看看你有那些工作需要加強和完善:

1、 你網站的內容豐富麼?

2、 你網站的可以更好的編排麼?

3、 你網站的原創內容在有計劃的增加麼?

2009年12月9日 星期三

可怕的詐騙集團---做功德轉貼

summertint | 8 December,2009 13:28

今天,就在剛剛,我差點被詐騙集團騙了。


打文章的現在我不禁想著,如果真的被騙了,應該是我人生最大的汙點了吧,搞不好會去投河自盡也不一定。我驚魂未定,覺得自己是「聰明反被聰明誤」...還是我只是自以為聰明呢?


想了半天,雖然覺得很丟臉,但是還是決定把這件事情寫下來,讓更多人看到,避免其他人受騙上當。


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


一開始是一位自稱宜蘭縣警察局的陳警員打給我。他說有被害人去警局報案,說我對他們進行詐騙,目前案子已經送到宜蘭地檢署偵辦了,之後會有檢察官跟我連絡進行調查。


電 話掛上沒三分鐘,自稱是宜蘭地檢署的吳書記官小姐就打來了,她把案情解釋得非常仔細,說我用在宜蘭第一銀行跟元大銀行的帳戶,申辦信用貸款,並且訛詐二十 八位被害人,金額高達近百萬。目前我是嫌疑人的身分,檢察官已經著手進行之後的調查,她現在需要我配合做一些資料的核對。


接下來她說的話有兩個重點,這兩點是我覺得詐騙集團之所以可以成功的最大原因,也是我事後想起來覺得最離譜的部分(我竟然會相信...)。第一,她說,目前案件仍在偵辦中,基於偵查不公開的原則,我不得跟任何人討論有關案情的任何部分,直到排除我涉案的可能為止。第二,到完成整個電話偵訊的過程中,為了避免串供跟洩漏案情,我都必須保持跟這位吳書記官通話狀態的暢通,他們會做全程的錄音,我不可以讓我的電話斷線、佔線或沒電,當然,因為一直保持與吳書記官通話的狀態,我自然就無法用其他的電話打給其他的人,更別提打給165反詐騙專線去確認事情的真偽。


好 了,吳書記官仔細的詢問我的資料,名下有多少個人帳戶,大約的存款各是多少,她還同時提醒我說,我有那麼多一年之內未進行任何進出的帳戶,很容易流於詐騙 集團的人頭,因為有些不肖的銀行行員、網路購物業者等等,會跟詐騙集團掛勾,買賣使用者的個人資料。我還覺得這小姐人真好,之後我一定要聽她的話,去把沒 有用的帳戶取消掉。


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


拉拉雜雜講了超久,大概有一個小時了,吳書記官說,因為下午一點鐘就要進行假扣押了,我需要把目前仍在使用中的帳戶裡的款項領出,暫時存到宜蘭地檢署的信託帳戶中,等到檢察官結束偵查之後,會把確認是經由合法來源得來的款項全數還給我。


天真的廖凱特到此時都還秉持著身為一個好公民,應該要配合檢調單位的一切偵辦,順利的把歹徒繩之以法的心態,準備好了所有的證件跟資料準備去提錢了呢。


然 後我到了銀行,依照吳書記官的說法,如果銀行小姐有問我為什麼提領這麼大筆的現款,「就跟她說你要買車子,總之絕對不可以透露你現在是詐騙案件嫌疑人的身 分」。好,銀行的小姐最後並沒有詢問我提領現金的用意(我同事說那是因為我看起來並不呆),我順利把帳戶裡的錢提領一空之後,繼續由吳書記官指示我接下來 的步驟。


她說我現在應該要把錢存到某某銀行的某某帳戶,這是檢察官針對這個偵字第XXXX號案件所特別開立的信託帳戶,案件終結前都會由宜蘭地檢署的進行保管。她一次又一次的與我核對帳戶號碼及檢察官姓名,「你用無摺存款單就可以存款,電話可以不用填沒關係」。


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


好,此時,天佑凱特,我不知道哪裡來的直覺,認為好像有點怪怪的,我想,可能是我心裡的那個守財奴突然吶喊起來,想把我叫醒吧。畢竟,錢存到別人的帳戶裡,要拿回來可不是那麼容易的事。


我 問吳書記官說:「ㄟ,不好意思喔,可是我想知道一下,我怎麼能確定你不是詐騙集團呢?」吳書記官顯然早就料到我會有此一問(她應該等非常久了...),於 是她非常流利的回答我說,我可以打電話到查號台去詢問宜蘭地檢署的電話,跟我現在手機上顯示的來電號碼應該是一致的;還是我要看看這張地檢署要對我執行假 扣押的公文,她也可以傳真給我。


我說:「喔,那我要去買一張IC電話卡打給查號台,請她幫我查宜蘭地檢署的電話,再請她直接幫我轉接吧。那請問你分機幾號?」


「啊~不行喔~~你不可以請查號台的小姐幫你轉喔。」吳書記官表示,「因為我們目前案件審查中,所有關係人的聯絡管道都必須要保密,所以你如果請查號台的小姐幫你轉的話,是轉不到我這邊來的。」


怪怪的吧,我心裡想,請查號台的小姐轉才不會有問題啊,畢竟詐騙集團現在都可以偽造來電顯示的號碼了耶。


我遲疑的時候,吳書記官說:「不然你去全家、萊爾富或是OK便利商店,請問他們的傳真號碼,我把公文傳給你看。」廖凱特於是到便利商店花了八元,買到一張吳書記官傳來的《法務部行政執行假扣押處分命令》,公文寫得非常好,格式都對,大大的官印也一點不馬虎。


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


吳書記官說,現在請我到了銀行門口,準備好要存款之前,再跟她確認一次,聽她的指示。


我花了85元計程車資,坐到她指定的銀行。在車上我還很開心跟司機先生聊天。


下車之後,我跟吳書記官回報說我已經在銀行門口了。「可是我有一個最後的問題想跟你確認看看,確定你不是詐騙集團。可以嗎?」福至心靈的廖凱特說道。


「好啊,請說。」吳書記官還是很客氣。


「吳小姐你是書記官對吧,」我問,「那你可不可以告訴我,在司法特考的時候,書記官要考哪些科目?」


「.....」吳書記官在長達兩個小時的電話通話中,第一次遲疑了。「就...考一些...法律條文啊....」


「蛤!!」廖凱特心中警鈴大作!!!(天哪終於....)


司法特考一般人是考不上的吧,就算是法律科系畢業的人,有的也是要考個兩三次才能幸運的金榜題名,那麼多年的苦讀,不至於連考些什麼科目都記不得吧。


我繼續說:「不是啦,我問的是像國文、英文之類的科目啊。」


一陣沉默之後我聽到鍵盤的喀喀聲。吳書記官在那一頭說:「因為我考很多年了,有點忘記了啦。....我想一下喔,嗯...有刑法、民法、法院組織法...」


我想吳書記官應該是請出google大神幫她做解答吧。


我決定趁勝追擊,繼續說:「那你可以再回答我,司法五等特考裡面考的兩個職務,一個是『錄事』,另一個叫什麼?」


「......」沉默非常久,吳書記官爆炸了:「廖小姐我覺得我不需要回答你這些問題耶!!!」


憤怒的吳書記官開始叨唸著我現在是涉案嫌疑人的身分,有什麼資格問她這些,她每天要做的工作很多,如果每個人都像我一樣問東問西,她哪有那麼多時間回覆我們。「我當書記官五六年了,考試的東西有些早就忘記了,這很正常吧!!!」


我一直乖乖的聽訓。然後等她唸完,她就繼續說:「那廖小姐你現在還要配合我們做信託的動作嗎?」


我誠實回答說:「不要了。因為這麼簡單的問題你都回答不出來,我覺得你好奇怪。」


「好吧,那你就等著被檢察官起訴吧你!!!」憤怒的吳書記官狠狠的掛上了電話。


至此結束了我們兩人長達兩小時又二十分鐘的通話。


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


很好笑嗎?


其實我現在想想,覺得一點也不好笑。好恐怖喔,我差點就被騙走畢生的積蓄了。


書記官考試、錄事、庭務員這些臨時想出來的問題,要不是因為我曾經一度想要報考司法特考,根本也不會知道這些是什麼鬼。如果我是沒有接觸過法律的人,是不是會就此被騙呢?


我覺得有點沮喪,不僅因為我自己是身為在私人企業法務部門的員工,竟然還被詐騙集團騙得團團轉,還有想到很多阿公阿婆,甚至是一般的中年、青年人,電視新聞都有報導,他們因為一時不察就被騙光所有的錢,真的很可憐。


而且,最糟的是,竟然有人這麼壞,耗盡心思就為了想要騙人害人。這些詐騙集團真的去死算了!


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


事情結束了,還好我只浪費了一些小零頭,總算沒有賠上我戶頭裡所有的錢。


在這邊真的要提醒每個看到這篇文章的人,千萬、千萬要小心,不要上當了。有任何人要你把帳戶的錢轉走、提領出來,甚至是說要轉給你,那都是假的,通.通.都.是.詐.騙.集.團!


來電顯示可以造假!


公文也可以造假!


嚇唬你說你立刻就要被起訴的,那絕對是假的!!



我個人因為太愛網拍,而且已經玩了六年多了,自認看得很多,今天遇到這種事情,因為一時間覺得自己的個人資料確實有太多外洩的機會,才反而被騙。


請各位一定要小心。
推到 Twitter!
推到 Plurk!
推到 Facebook!