建議:man sh 查看相關UNIX上的改進或特性
(1)shell提示符及其環境
在passwd檔案中可以看到每個使用者登陸後使用的shell,下面兩個檔案也是這個意思。
/etc/passwd檔案
提示符:$
/etc/profile $HOME/.profile
(2)shell執行選項
在建立一個shell指令碼後我們要用sh命令來運行和測試,下面是一些sh常用的參數
-n 測試shell script文法結構,唯讀取shell script但不執行
-x 進入跟蹤方式,顯示所執行的每一條命令,用於調度
-a Tag all variables for export
-c "string" 從strings中讀取命令
-e 非互動方式
-f 關閉shell檔案名稱產生功能
-h locate and remember functions as defind
-i 互動方式
-k 從環境變數中讀取命令的參數
-r 限制方式
-s 從標準輸入讀取命令
-t 執行命令後退出(shell exits)
-u 在替換中如使用未定義變數為錯誤
-v verbose,顯示shell輸入行
這些選項可以聯合使用,但有些顯然相互衝突,如-e和-i.
(3)受限制shell(Restircted Shell)
說了半天好象這個東西沒什麼用,那就不管了。
sh -r 或 /bin/rsh
不能執行如下操作:cd, 更改PATH,指定全路徑名,輸出重新導向,因此可以提供一個較
好的控制和安全機制。通常rsh用於應用型使用者及撥號使用者,這些使用者通常是看不到提
示符的。通常受限制使用者的主目錄是不可寫的。
不足:如果使用者可以調用sh,則rsh的限制將不在起作用,事實上如果使用者在vi及more
程式中調用shell,而這時rsh的限制將不再起作用。
(4)用set改變 shell選項
實際上就是設定sh的預設參數,我們在運行shell指令碼時,並不總是使用sh scriptsfile,而是用./scriptsfile來運行,這個時候就使用sh的預設參數。
使用者可以在$提示符下用set命令來設定或取消shell的選項。使用-設定選項,+取消相應
選項,大多數UNIX系統允許a,e,f,h,k,n,u,v和x的開關設定/取消。
set -xv
啟動跟蹤方式;顯示所有的命令及替換,同樣顯示輸入。
set -tu
關閉在替換時對未定義變數的檢查。
使用echo $-顯示所有已設定的shell選項。
(5)使用者開機檔案 .profile
PATH=$PATH:/usr/loacl/bin; export PATH
(6)shell環境變數
這裡是舉例說明什麼是環境變數,但還是沒說什麼是環境變數,按我的理解,環境變數類似於宏定義,或者說環境變數是一個作用於系統的全域變數或局部變數。
CDPATH 用於cd命令的尋找路徑
HOME /etc/passwd檔案中列出的使用者主目錄
IFS Internal Field Separator,預設為空白格,tab及分行符號
MAIL /var/mail/$USERNAME mail等程式使用
PATH
PS1,PS2 預設提示符($)及換行提示符(>)
TERM 終端類型,常用的有vt100,ansi,vt200,xterm等
樣本:$PS1="test:";export PS1
test: PS1="$";export PS1
$echo $MAIL
/var/mail/username
(7)保留字元及其含義
$ shell變數名的開始,如$var
| 管道,將標準輸出轉到下一個命令的標準輸入
# 注釋開始
& 在後台執行一個進程
? 匹配一個字元
* 匹配0到多個字元(與DOS不同,可在檔案名稱中間使用,並且含.)
$- 使用set及執行時傳遞給shell的標誌位
$! 最後一個子進程的進程號
$# 傳遞給shell script的參數個數
$* 傳遞給shell script的參數
$@ 所有參數,個別的用雙引號括起來
$? 上一個命令的傳回碼
當前shell的名字
$n (n:1-) 位置參數
$$ 進程標識號(Process Identifier Number, PID)
覆蓋現有檔案的資料
>file 輸出重新導向
這個沒看明白
`command` 命令替換,如 filename=`basename /usr/local/bin/tcsh`
會在現有檔案末尾追加資料
>>fiile 輸出重新導向,append
轉義符及單引號:
注意單引號,雙引號,沒引號的異同。
$echo "$HOME $PATH"
/home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:
$echo '$HOME $PATH'
$HOME $PATH
$echo $HOME $PATH
$HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbwork/bin
其他:
$dir=ls
$$dir
$alias dir ls
$dir
將ls結果輸出到檔案filelist
ls > filelist
將ls結果追加到檔案filelist最後
ls >> filelist
統計檔案filelist內容的行數
wc -l < filelist
統計字串filelist的總行數
wc -l filelist
等待5秒鐘,顯示5 seconds reaches,執行ls -l命令
sleep 5; echo 5 seconds reaches; ls -l
[在當前進程中找出所有的inetd進程]
ps ax |grep inetd
這個沒看明白,find不會用,呵呵
find / -name core -exec rm { } ; &
設定filename為日期+年月日.log
filename=`date "+%Y%m%d"`.log
作者:Stephen Bourne 在Bell實驗室開發