歡迎您光臨本站 註冊首頁

shell 編程 (轉)

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

Shell 編程基礎
作者: haixiao ouyang

Shell: 是一個獨立於 OS 的應用程序,是一個具有交互性的命令行解釋器。

1、Shell 的作用: 解釋鍵入的命令以及執行的一些特定的功能,並傳到內核執行。

2、Shell 的功能:
- 命令的搜索與執行
- 變數的值的替換
- 命令的替換
- 文件名的補齊
- 控制 I/O 重定向和 Pipe
- 提供解釋性的編程介面(包括測試、分支和循環)

3、常用的 Shell:
- Bourne Shell(/usr/bin/sh)
- C Shell(/usr/bin/csh)
- Korn Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- Restricted Bourne Shell(/usr/bin/rsh)
- Restricted Korn Shell(/usr/bin/rksh)

[注]
(1)、某些系統有自帶的 Shell,比如 SCO UNIX 系統有 SCO Shell(/usr/bin/scosh)。
(2)、使用限制版 Shell 的用戶不能進行的操作:
- 修改目錄
- 重設 PATH 環境變數
- 在路徑中使用 /
- 重定向輸出

--> 別名化:主要用於方便地輸入長路徑名。

$ alias [name [=string]] # Aliasing
其中: name -- 命令的別名, string -- 原命令(如果有空格,用 『 』 括起來)。

$ alias # 顯示當前定義的所有別名

$ alias name # 列出某特定別名的值

$ unalias name # 關閉別名

[例]別名的使用:

$ alias go = 'cd '
$ alias there = /home/cheyenne/programs/shell/pgs_en_c/server.c
$ go there ; pwd

--> 命令歷史:

1、最早由 C Shell(BSD UNIX)提出。

2、Korn Shell 下的 history 命令:
- 預設顯示最近輸入的16個命令
- 每行用命令號開頭
CODE
$ history -n # 顯示最後 n 個命令
$ history a z # 顯示從第 a 條命令到第 z 條命令


3、
HISTSIZE 參數:定義可以訪問歷史命令的數據(預設:128)。
HISTFILE 參數:指定存儲已輸入命令的文本文件(預設: .sh_history)。

4、重新輸入命令:
$ r n # n 是命令號或一個命令的首字母(執行以該字母開頭的最近的命令)

--> 用戶環境:

1、環境描述的是會話過程:
- 主目錄的路徑名
- 存放 e-mail 的目錄
- 工作的時區
- 登錄的身份
- Shell 搜索命令時的路徑
- 終端類型
- 應用程序所依賴的其它東西

2、常見的環境變數:
- TERM, COLUMNS 和 LINES 描述終端
- HOME 用戶主目錄
- PATH 搜索命令的地點列表
- LOGNAME 登錄用戶名
- env 和 HISTFILE 專用的 POSIX Shell 變數
- DISPLAY 專用的 X Window 變數

3、設定 Shell 變數:
$ name=value
[規定]變數名以字母開頭,可以包含字母、數字和下劃線。

4、PATH 變數:和 DOS 里的 PATH 變數是一樣的,代表 Shell 搜索命令的一系列目錄。

5、TERM 變數:描述使用的終端。
$ TERM=70092
$ tset # 將 TERM 值設置終端
[注]可以查看 /usr/lib/terminfo 下的子目錄

6、常見的變數及其值:
- EDITOR=/usr/bin/vi # 用 vi 作為行編輯命令
- ENV=$HOME/.shrc # 在啟動 Shell 時執行 $HOME/.shrc
- HOME=/home/cheyenne # 用戶主目錄
- FCEDIT=/usr/bin/vi # 對歷史命令行啟用 vi 編輯進程
- ~ # 在 Korn Shell 和 POSIX Shell 中代表用戶主目錄
- HISTFILE=$HOME/.sh_history
- LOGNAME=cheyenne
- MAIL=/var/mail/cheyenne # 系統信箱
- OLDPWD=/home # 前一個目錄的位置
- PATH=……
- PS1='[!]$' # 設置提示符
- PWD=/home/cheyenne/programs/shell # 顯示當前工作目錄(相當於 DOS 中的 CD 命令)
- SHELL=/usr/bin/sh
- TERM=2392a # 用命令 eval `test -s -Q -h` 在啟動時,系統讀取 /etc/ttytype 文件,用裡面的信息正確設置終端。
- TMOUT=300 # 在指定的時間(秒)內沒有鍵入命令,Shell 會終止或超時。
- TZ=EST5EDT # 工作時區
--> 登錄:
1、顯示文件 /etc/issue 的內容
2、發出 login 提示符
3、運行 login
4、核對帳號和密碼
5、將用戶置於主目錄
6、運行用戶的 Shell
7、運行 /etc/profile(Bourne Shell 和 Korn Shell)或 /etc/csh.login(C Shell)
8、運行用戶主目錄中的 .profile 或 .login
9、執行主目錄中的 .kshrc 文件
10、顯示 Shell 提示符

[注] /etc/profile 文件搭建起系統每個用戶的基本環境
運行 Shell --> 從 /etc/profile 系統命令文件中讀出命令 --> 讀取 $HOME/.profile 文件(細化環境以適應用戶的要求)


--> 用 CDE 登錄:

CDE 通常不使用 /etc/profile、$HOME/.profile 和 $HOME/.login 這幾個登錄腳本。

但可以強迫執行 $HOME/.profile(sh 或 ksh)或 $HOME/.login(csh)。
方法是在 .dtprofile 中設置: DTSOURCEPROFILE=true
--> Shell 啟動文件:

- Bourne Shell(/usr/bin/sh): $HOME/.profile
- Korn Shell(/usr/bin/ksh): $HOME/.profile,$HOME/.kshrc
- C Shell(/usr/bin/csh): $HOME/.login,$HOME/.cshrc

1、普通用戶沒有 /etc/profile 文件的寫許可權。

2、Korn Shell 有一個可選的配置文件 .kshrc,它不僅在啟動時被讀取,在每次啟動一個新的 Shell 時都被讀取。要使用這個文件,在 .profile 文件里加入:
ENV=~/.kshrc
export ENV

3、可以在 .profile 中加入 exec 命令: exec app,作用是啟動用戶的應用程序,但是無法看到 Shell 提示符,應用程序執行完畢后,退出系統。

4、以 C Shell 登錄時,在起始目錄查找 .login 文件。如果找到,出現提示符前執行這個文件裡面的命令。如果用戶還定義了 .cshrc 文件,出現提示符前也執行這個文件里的命令。



--------------------
--> Shell 的高級特性:

1、在 Shell 中,有三種替換功能,可以加快對命令行的輸入和執行:
- 變數替換
- 命令替換
- 波浪號替換

2、Shell 變數存儲機制:

(1)、在 Shell 中,有兩塊內存存儲 Shell 變數:本地數據區和用戶環境區。
- 定義新變數:從本地數據區分配內存存儲該變數。在這個區域的變數歸當前 Shell 所有。任何後來啟動的子進程都不能訪問這些本地變數。
- 在登錄進程中系統定義一些特殊的 Shell 變數,其中的很多被存儲在用戶環境區。
- 從本地數據區移動到用戶環境區的變數可以被子進程訪問。

(2)、$ env # 顯示當前環境的所有變數

3、給變數賦值: $ name=value
- 用戶定義一個新變數:被存儲在本地數據區中。
- 將一個新值分配給一個已經存在的環境變數:新值取代舊值。

4、變數替換: $ name # Directs the shell to perform variable substitution.

(1)、每個被定義的變數有一個值與其相關,變數名前加 $ 符號時,Shell 用值來替換這個參數。這個過程稱為變數替換。這個過程在 Shell 運行命令行命令之前執行。

(2)、Shell 將命令行中所有需要替換的變數做替換之後才執行該命令。

(3)、變數可以代表命令、命令的參數或整行命令行。

(4)、$ echo $name # 顯示變數的當前值
[例]$ PATH=$PATH:$HOME
$ echo $PATH
$ file_name=$HOME/programs/pgs_en_c/server.cpp
$ more $file_name

(5)、有兩個變數:
$ file1=this
$ file2=that
$ echo $file1and$file2 # Shell 會認為是查找變數 file1and 和變數 file2
sh: file1and: parameter not set
$ echo ${file1}and$file2 # 解決方案:用大括弧界定變數名與其周圍的文本
thisandthat

(6)、用絕對路徑名定義一個變數的值,通過使用該變數,可以在文件系統的任何位置訪問目標文件或目錄。

(7)、引號的作用:
$ cheyenne=2
$ echo cheyenne # 在屏幕上顯示 cheyenne
$ echo $cheyenne # 在屏幕上顯示 2
$ echo 「$cheyenne」 # 在屏幕上顯示 2
$ echo '$cheyenne' # 在屏幕上顯示 $cheyenne

5、命令替換:同一個命令行中用一個命令的輸出結果替換該命令。
$ `command`
常用於將一個命令的輸出結果分配給一個變數,然後引用或控制該變數。
[例]$ banner data
$ banner `data`

6、波浪號替換:
- 若一個詞以 ~ 開頭,這個詞會擴展這個波浪號。
- 只能擴展位於單詞開頭的波浪號(/~home/cheyenne 不能擴展其中的波浪號)。
- 單獨的一個 ~ 或在 / 之前的 ~ : 用 $HOME 取代~。
- ~+ : 用 $PWD 取代 ~(cd 命令將重設 PWD 的值)。
- ~- : 用 $OLDPWD 取代 ~(cd 命令將重設 OLDPWD 的值)。
- 若 ~ 後面緊跟幾個字元,然後接一個 /,Shell 會核對這幾個字元是否與某系統用戶名匹配,若匹配,就用該用戶名取代~。

7、顯示變數的值:
$ env # 顯示在用戶環境中定義的所有的變數的值
$ set # 顯示在本地數據區和用戶環境中當前定義的所有變數的值
$ unset # 刪除指定變數的當前值(該變數的值將被指定為 NULL,此值有效)

8、將本地變數轉移到用戶環境中:
$ export variable
$ export varibale=value # 給變數賦值並轉移
$ export # 顯示所有被輸出變數的名字及其值

9、嚮應用程序傳遞變數:
(1)、登錄后,Shell 程序被載入內核執行。當在提示符下輸入一個應用程序(或命令)的名字后,會創建一個子進程,並執行以下程序:
- fork 程序:複製 Shell 進程(包括程序代碼、環境數據區和本地數據區)。
- exec 程序:將子進程的代碼及本地數據區替換為請求執行的應用程序的代碼及本地數據區。
- 執行請求的應用程序后,exec 命令結束。

(2)、執行子進程時,Shell(父進程)會轉入睡眠狀態,等候子進程結束。一旦子進程結束,它將釋放佔用的內存,喚醒父進程,這個父進程時刻準備接受另一個命令執行請求。

(3)、本地變數與環境變數:
- 定義新變數:此變數會被存儲在與定義該變數的進程有關的本地數據區中。
- 若要使任何一個子進程都能訪問這個變數,必須用 export 命令將其導出到用戶環境中。
- 一旦此變數處於用戶環境中,後來運行的所有子進程都可以訪問此變數(用戶環境的內容向每一個子進程廣播)。
- 父 Shell 的環境變數不會被子進程修改。

10、監控進程:
$ ps [-f] # 顯示當前運行(或處於睡眠狀態)進程的信息
包括 PID 及 PPID(PID:進程號,PPID:父進程號)。


--> 關於文件名:

1、文件名生成的字符集:
? 匹配任意單個字元(除用點開頭的文件外)
[] 從將被匹配的字元里分類(除用點開頭的文件外)
* 匹配零字元或更多的字符集(除用點開頭的文件外)

2、點文件:
以點開頭的文件在文件生成字符集里通常是隱藏的,文件名生成字符集永遠也不會生成以點開頭的文件名稱。

3、三個通配符:
CODE
[例] $ ls -a
. .. .zz 1G 2G 7G 15G Ant Cat Dog abc abcdef ba cyz
$ echo [abc]?? # echo abc cyz
$ echo [1-9][A-Z] # echo 1G 2G 7G
$ echo [!A-Z]?? # echo 15G abc cyzSample Text

[火星人 ] shell 編程 (轉)已經有432次圍觀

http://coctec.com/docs/linux/show-post-138679.html