KSH 學習

ysjxjf發表於2012-01-17
ksh[@more@]
  1. Korn Shell

  2. 1.語法

  3. 特殊的檔案

  4. /etc/profile 在登入時首先自動執行。

  5. $HOME/.profile 在登入時第二個自動執行。

  6. $ENV 在建立一個新的KShell時指定要讀的一個檔案。

  7. 檔名元字元

  8. * 匹配有零或零個以上字元的字串

  9. ? 匹配任何單個字元

  10. [abc…] 匹配括號內任何一個字元,也可用連字元指定一個範圍(例如,a-z,A-Z,0-9)

  11. [!abc…] 匹配任何不包括在括號內的字元



  12. ?(pattern) 匹配模式的零個或一個例項

  13. *(pattern) 匹配指定模式的零個或多個例項

  14. +(pattern) 匹配指定模式的一個或多個例項

  15. @(pattern) 只匹配指定模式的一個例項

  16. !(pattern) 匹配任何不匹配模式的字串

  17. n 匹配與(…)中的第n個子模式匹配的文字。

  18. ~ 當前使用者的主目錄

  19. ~name 使用者name的主目錄



  20. 這個模式pattern可能是由分隔符“|”或“&”分隔的模式的序列,

  21. 例:pr !(*.o|core) | lp

  22. 引用

  23. ; 命令分隔符

  24. & 後臺執行

  25. ( ) 命令分組

  26. | 管道

  27. <> & 重定向符號

  28. * ? [ ] ~ + - @ ! 檔名元字元

  29. ““ 中間的字元會逐字引用,除了`` 替換命令和$ 替換變數.

  30. ‘’ 中間的所有字元都會逐字引用

  31. 在其後的字元會按其原來的意義逐字採用.如在””中使用 ”,`,$

  32. a 警告,b退格,f 換頁,n 換行,r 回車, 製表符,v 垂直製表符,

  33. nnn 八進位制值,xnn 十六進位制值,’ 單引號,” 雙引號, 反斜線,

  34. `` 命令的替換

  35. $ 變數的替換

  36. 命令形式

  37. Cmd & 在後臺執行

  38. Cmd1;cmd2 命令序列,依次執行

  39. {cmd1;cmd2;} 將命令做為一組來執行

  40. (cmd1;cmd2) 在子shell中,將命令做為一組執行

  41. Cmd1|cmd2 管道;將cmd1的輸出作為cmd2的輸入

  42. Cmd1 `cmd2` 命令替換;用cmd2的輸出作為cmd1的引數

  43. Cmd1$(cmd2) 命令替換,可以巢狀

  44. Cmd$((expression)) 運算替換。用表示式結果作為引數

  45. Cmd1&&cmd2 邏輯與。如果cmd1成功才執行cmd2

  46. Cmd1||cmd2 邏輯或。如果cmd1成功則不會執行cmd2

  47. 重定向形式

  48. 檔案描述符:

  49. 0 標準輸入 stdin 預設為鍵盤

  50. 1 標準輸出 stdout

  51. 2 標準錯誤 stderr



  52. Cmd > file 將cmd的結果輸出到file(覆蓋)

  53. Cmd >> file 將cmd的結果輸出到file(追加)

  54. Cmd < file 從file中獲取cmd 的輸入

  55. Cmd << text 將shell指令碼的內容(直到遇見一個和text一樣的標記為止)作為cmd的輸入

  56. Cmd <> file 在標準輸入上開啟檔案以便讀寫



  57. Cmd >&n 將輸出傳送到檔案描述符n。ll >&1

  58. Cmd m>&n 將本來輸出的m中的內容轉發到n中。Ll 3>&2

  59. Cmd >&- 關閉標準輸出

  60. Cmd

  61. Cmd m

  62. Cmd

  63. 在檔案描述符和一個重定向符號間不允許有空格。



  64. Cmd 2>file 將標準錯誤發到file中

  65. Cmd > file 2>&1 將標準錯誤和標準輸出都發到file

  66. Cmd > f1 2>f2 將標準輸出發到f1,標準錯誤發到f2

  67. Cmd | tee files 將輸出傳送到標準輸出和files中

  68. Cmd 2>&1 | tee files 將輸出和錯誤同時發到標準輸出和files中

  69. 2.變數

  70. 變數替換

  71. 下列表示式中不允許使用空格。冒號是可選的,如果用冒號那麼變數必須是非空的並設定了初始值。

  72. Var=value… 將變數var 設為value

  73. ${var} 使用變數var的值;如果變數和其後面的文字是分開的則可以不加大括號。

  74. ${var:-value} 如果變數var已設定則使用它,否則使用值value

  75. ${var:=value} 如果變數var已設定則使用它,否則使用值value並將value賦給變數var

  76. ${var:+value} 如果變數var已設定則使用value,否則什麼也不使用



  77. 例:echo ${u-$d};echo ${tmp-`date`}如果沒設tmp,則執行date;

  78. 內建變數

  79. $# 命令列引數的個數

  80. $? 上一條命令執行後返回的值

  81. $ 當前程式的程式號(PID), 通常用於在shell指令碼中建立臨時檔案的名稱

  82. $0 第一個引數即命令名

  83. $n 命令列上的第n個引數

  84. $* 將命令列上所有引數作為一個字串

  85. $@ 命令列上所有引數,但每個引數都被引號引起來



  86. LINENO 指令碼或函式內正在執行的命令的行號

  87. OLDPWD 前一個工作目錄(由CD設定)

  88. PPID  當前SHELL的父程式的程式號

  89. PWD   當前工作目錄(由CD設定)

  90. RANDOM[=n] 每次引用時產生一個隨機數,如果給定n則以整數n開始

  91. SECONDS 這個整型變數的值是指從這個shell會話啟動算起所過去的秒數。但它更有用的是用指令碼中的計時。

  92. 例:start=$SECONDS

  93. read answer

  94. finish=$SECONDS

  95. TMOUT 如果設定了該變數,則在沒有輸入的情況下經過TMOUT變數所指定的秒數後,shell退出。值為0時無效。

  96. CDPATH

  97. 允許使用者使用簡單檔名作為CD的引數,從而快速改變目錄。設定方法與PATH類似,通常在啟動檔案中設定。如果CD的引數是一個絕對路徑,則不會查詢CDPATH.

  98. 例:CDPATH=:/u1/nr:/u1/progs:

  99. export CDPATH

  100. cd nr

  101. 就會進到nr中去。

  102. 注意:變數必須大寫,定義後必須匯出.

  103. 陣列

  104. Kshell支援一維陣列,最多支援1024個元素。第一個元素為0。

  105. Set –A name value0 value1 …

  106. 宣告陣列,指定的值就成為name的元素。



  107. ${name[i]} i為0至1023的值,可以是表示式。返回陣列元素i

  108. ${name} 返回陣列元素0

  109. ${name[*]},${name[@]} 返回所有元素

  110. 下標[*]和[@]都可以提取整個陣列的內容。但當它們在引號中使用時其行為是不同的。使用@可生成一個陣列,這個陣列是原始陣列的副本,而使用*,則生成的僅僅是具有單一元素的陣列(或者是一個普通變數)。

  111. 例:set -A a "${names[*]}"

  112. set -A b "${names[@]}"

  113. set|head -5

  114. a[0]='alex helen jenny scott'

  115. b[0]=alex

  116. b[1]=helen

  117. b[2]=jenny

  118. b[3]=scott

  119. ${#name[*]} 返回陣列元素個數

  120. 運算子

  121. Kshell使用C語言中的運算子。

  122. + 加;- 減;! 邏輯非;~ 按進製取反;* 乘;/ 除;% 求餘;<< 左移;>> 右移;<= 小於等於;>= 大於等於;< 小於;

  123. > 大於;== 相等;!= 不等;&& 邏輯與;|| 邏輯或;

  124. 3.內建命令

  125. # 註釋後面的一行



  126. Break [n] 從for while select until迴圈中退出或從n次迴圈中退出



  127. Case value in

  128. Pattern1) cmds1;;

  129. Pattern2) cmds2;;





  130. Esac

  131. 類似於select case.例:

  132. Case $1 in

  133. No|yea) response=1

  134. break;;

  135. -[tT]) table=TRUE;;

  136. *) echo “unknown option”;exit 1;;

  137. Esac



  138. Continue [n] 在for while select until迴圈中跳過餘下的命令,繼續下一次迴圈(或跳過n次迴圈)



  139. Eval args args是一行包含shell變數的程式碼.eval首先進行變數擴充套件,並且執行由此產生的命令。在shell變數包括了重定向符號,別名或其他變數時是有用的。

  140. 例:

  141. For option

  142. Do

  143. Case “$option” in

  144. Save) out=’ > $newfile’;;

  145. Show) out=’ | more’;;

  146. Esac

  147. Done

  148. Eval sort $file $out



  149. Exit [n] 退出指令碼,退出狀態為n.



  150. Export [name=[value]…]

  151. 定義全域性變數,讓其它shell指令碼也可以使用。無引數時輸出當前定義的全域性變數。



  152. For x [in list]

  153. Do

  154. Commands

  155. Done

  156. 使變數x(在可選的值列表中)執行commands,省略時假定為”$@”位置引數

  157. 例:

  158. For item in `cat program_list`

  159. Do

  160. Grep –c “$item.[co]” chap*

  161. Done



  162. Function name{commands;} 定義一個函式



  163. If condition1

  164. Then commands1

  165. [elif condition2

  166. Then commands2]





  167. [else commands3]

  168. Fi

  169. 條件執行語句。



  170. Let expressions 執行一個或多個表示式。表示式中的變數前不必有$.如果表示式中包含了空格或其他特殊字元,則必須引起來。

  171. 例:let “I = I + 1” 或 let i=i+1



  172. Read [var1[?string]] [var2 …] 從標準輸入讀入一行給相應的變數,並把剩餘的單詞給最後一個變數。String為相應的提示資訊.無參時只等待一次輸入。



  173. Readonly [var1[=value] var2[=value] …] 設定只讀變數,無參時顯示所有隻讀變數



  174. Return [n] 用於一個函式里面返回狀態



  175. repeat word

  176. do

  177. commands

  178. done

  179. 指定一個命令序列執行的次數。

  180. 例:

  181. repeat 3

  182. do

  183. echo "bye"

  184. done



  185. Select x [in list]

  186. Do

  187. Commands

  188. Done

  189. 顯示一列按list中順序編號的選單項。讓使用者鍵入行號選擇或按return重新顯示。

  190. 例:

  191. Ps3=”select thd item number:”

  192. Select event in format page view exit

  193. Do

  194. Case “event” in

  195. Format) nroff $file | lp;;

  196. Page) pr $file | lp;;

  197. View) more $file;;

  198. Exit) exit 0;;

  199. *) echo “invalid selection”;;

  200. Esac

  201. Done

  202. 輸出為:

  203. 1. format

  204. 2. page

  205. 3. view

  206. 4. exit

  207. select the item number:



  208. set [options arg1 arg2 …] 無參時輸出所有已知變數的值。



  209. Shift [n] 交換位置引數(如將$2變為$1).如果給出n,則向左移動n個位置。通常用於在while迴圈中迭代命令列引數。N可以是一個整數表示式。



  210. Sleep [n] 睡眠n秒鐘



  211. Test condition 或[ condition ] 判斷條件,為真返回0,否則返回非0.

  212. 檔案:

  213. -a filename 如果該檔案存在而為真

  214. -d filename 如果該檔案存在且為一個目錄,則為真

  215. -f filename 如果該檔案存在且為一個常規檔案,則為真

  216. -L filename 如果該檔案存在且為一個符號連結,為真

  217. -r filename 如果該檔案存在且使用者對其有讀取許可權,真

  218. -s filename 如果該檔案存在且包含資訊(大於0位元組),真

  219. -w filename 如果該檔案存在且對其有寫入權,真

  220. -x filename 如果該檔案存在且對其有執行權,真

  221. File1 -nt file2 如果file1存在且在file2後修改則值為真(指修改時間)

  222. File1 -ot file2 如果file1存在且在file2前修改則值為真(指修改時間)

  223. 字串:

  224. string 如果string不為空字串則值為真

  225. -n string 如果string字元長度大於0則值為真

  226. -z string 如果string字元長度等於0則值為真

  227. string1=sting2 如果string1等於string2則值為真

  228. string1!=string2 如果string1不等於string2則值為真

  229. string2可以是萬用字元模式。

  230. 整數比較:

  231. -gt 大於;-ge 大於或等於;-eq 等於;-ne 不等於; -le 小於或等於; -lt 小於

  232. 組合:

  233. ! condition 如果condition為假則為真

  234. condition1 –a condition2 如果兩個條件都為真則為真

  235. condition1 –o condition2 如果兩個條件有一個為真則為真



  236. trap [[commands] signals] 如果接收到任何的訊號signals則執行命令commands.如果完全忽略commands則會重新設定由預設行為處理指定的訊號。

  237. 例:

  238. Trap “” 2 ;忽略訊號2(中斷,通常是ctrl+c)

  239. Trap 2 ;恢復中斷2

  240. Trap “rm –f $tmp;exit” 0 1 2 15 ;當shell程式退出,使用者退出,按ctrl+c或執行kill時刪除$tmp.



  241. Typeset [options] [var [var]…]設定變數屬性

  242. -u 將變數值中所有字母全部轉換成大寫

  243. -l 將變數值中所有字母全部轉換成小寫

  244. -i 將變數值設為整數型別.-ix x為相應的進位制,表示時為x#變數值,可用於進位制轉換。

  245. 例:typeset -i2 vv vv=2 echo $vv 2#10

  246. typeset -i 相當於integer

  247. -L width 在width寬度之內左對齊

  248. -R width 在width寬度之內右對齊,前面空位用空格填充

  249. -Z width 在width寬度之內右對齊,變數如果是數字,則前面空位用零填充

  250. 如果忽略width,將使用賦給這個變數的第一個值的寬度。

  251. -x 設定一個變數全域性。typeset -x 相當於 export

  252. -r 設定一個變數具有隻讀屬性,在設定的同時或之前,要先給這些變數賦值。

  253. 例:typeset -r PATH FPATH=/usr/local/funcs

  254. typeset -r 相當於 readonly

  255. 不帶引數的typeset可以列出變數和變數的屬性。檢視指定的變數屬性可用type|grep day

  256. 使用帶有某一選項的typeset來看看哪一個變數具有特定的屬性:typeset -z



  257. Unset var 刪除一個變數,將它置為空



  258. Until condition

  259. Do

  260. Commands

  261. Done

  262. 執行命令command直到滿足條件condition.



  263. While condition

  264. Do

  265. Commands

  266. Done

  267. 如果滿足條件condition則執行commands
複製程式碼

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66634/viewspace-1057151/,如需轉載,請註明出處,否則將追究法律責任。

相關文章