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 來執行。

沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!