版權(quán)信息
文章出處黃嘴企鵝論壇 javalee轉(zhuǎn)貼
文檔制作拒絕正版
源碼:
------------------------------------------------------------------------------
Bourne Shell
介紹Bourne Shell 基礎(chǔ)及其他很多有用的特性shell編程及組織
主要內(nèi)容
.shell基礎(chǔ) 基本介紹環(huán)境選項(xiàng)特殊字符
.shell變量 用戶定義變量環(huán)境變量位置變量(shell 參數(shù))
.shell script編程
條件測試循環(huán)及重復(fù)控制
.shell定制
1.shell基礎(chǔ)知識(shí)
作者Stephen Bourne 在Bell實(shí)驗(yàn)室開發(fā)
建議man sh 查看相關(guān)UNIX上的改進(jìn)或特性
(1)shell提示符及其環(huán)境
/etc/passwd文件
提示符$
/etc/profile $HOME/.profile
(2)shell執(zhí)行選項(xiàng)
-n 測試shell script語法結(jié)構(gòu)只讀取shell script但不執(zhí)行
-x 進(jìn)入跟蹤方式顯示所執(zhí)行的每一條命令用于調(diào)度
-a Tag all variables for export
-c "string" 從strings中讀取命令
-e 非交互方式
-f 關(guān)閉shell文件名產(chǎn)生功能
-h locate and remember functions as defind
-i 交互方式
-k 從環(huán)境變量中讀取命令的參數(shù)
-r 限制方式
-s 從標(biāo)準(zhǔn)輸入讀取命令
-t 執(zhí)行命令后退出(shell exits)
-u 在替換中如使用未定義變量為錯(cuò)誤
-v verbose,顯示shell輸入行
這些選項(xiàng)可以聯(lián)合使用但有些顯然相互沖突如-e和-i.
(3)受限制shell(Restircted Shell)
sh -r 或 /bin/rsh
不能執(zhí)行如下操作cd, 更改PATH,指定全路徑名輸出重定向因此
可以提供一個(gè)較
好的控制和安全機(jī)制通常rsh用于應(yīng)用型用戶及撥號(hào)用戶這些用戶
通常是看不到提
示符的通常受限制用戶的主目錄是不可寫的
不足如果用戶可以調(diào)用sh,則rsh的限制將不在起作用事實(shí)上如果
用戶在vi及more
程序中調(diào)用shell,而這時(shí)rsh的限制將不再起作用
(4)用set改變 shell選項(xiàng)
用戶可以在$提示符下用set命令來設(shè)置或取消shell的選項(xiàng)使用-設(shè)置
選項(xiàng)+取消相應(yīng)
選項(xiàng)大多數(shù)UNIX系統(tǒng)允許a,e,f,h,k,n,u,v和x的開關(guān)設(shè)置/取消
set -xv
啟動(dòng)跟蹤方式;顯示所有的命令及替換同樣顯示輸入
set -tu
關(guān)閉在替換時(shí)對(duì)未定義變量的檢查
使用echo $-顯示所有已設(shè)置的shell選項(xiàng)
(5)用戶啟動(dòng)文件 .profile
PATH=$PATH:/usr/loacl/bin; export PATH
(6)shell環(huán)境變量
CDPATH 用于cd命令的查找路徑
HOME /etc/passwd文件中列出的用戶主目錄
IFS Internal Field Separator,默認(rèn)為空格tab及換行符
MAIL /var/mail/$USERNAME mail等程序使用
PATH
PS1PS2 默認(rèn)提示符($)及換行提示符(> )
TERM 終端類型常用的有vt100,ansi,vt200,xterm等
示例$PS1="test:";export PS1
test: PS1="\$";export PS1
$echo $MAIL
/var/mail/username
(7)保留字符及其含義
$ shell變量名的開始如$var
| 管道將標(biāo)準(zhǔn)輸出轉(zhuǎn)到下一個(gè)命令的標(biāo)準(zhǔn)輸入
# 注釋開始
& 在后臺(tái)執(zhí)行一個(gè)進(jìn)程
匹配一個(gè)字符
* 匹配0到多個(gè)字符(與DOS不同可在文件名中間使用并且含.)
$- 使用set及執(zhí)行時(shí)傳遞給shell的標(biāo)志位
$! 最后一個(gè)子進(jìn)程的進(jìn)程號(hào)
$# 傳遞給shell script的參數(shù)個(gè)數(shù)
$* 傳遞給shell script的參數(shù)
$@ 所有參數(shù)個(gè)別的用雙引號(hào)括起來
$? 上一個(gè)命令的返回代碼
$0 當(dāng)前shell的名字
$n (n:1-) 位置參數(shù)
$$ 進(jìn)程標(biāo)識(shí)號(hào)(Process Identifier Number, PID)
>file 輸出重定向
<file 輸入重定向
`command` 命令替換如 filename=`basename /usr/local/bin/tcsh`
>>fiile 輸出重定向append
轉(zhuǎn)義符及單引號(hào)
$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/hbw
ork/bin
其他
$dir=ls
$$dir
$alias dir ls
$dir
ls > filelist
ls >> filelist
wc -l < filelist
wc -l filelist
sleep 5; echo 5 seconds reaches; ls -l
ps ax |egrep inetd
find / -name core -exec rm {} \; &
filename=`date "+%Y%m%d"`.log
2. shell變量
變量代表某些值的符號(hào)如$HOME,cd命令查找$HOME,在計(jì)算機(jī)語言
中可以使用變量可以
進(jìn)行多種運(yùn)算和控制
Bourne Shell有如下四種變量
.用戶自定義變量
.位置變量即 shell script之參數(shù)
.預(yù)定義變量特殊變量
.環(huán)境變量(參考shell定制部分)
(1)用戶自定義變量數(shù)據(jù)的存儲(chǔ)
$ COUNT=1
$ NAME="He Binwu"
技巧因?yàn)榇蟛糠諹NIX命令使用小寫字符因此在shell編程中通常
使用全大寫變量
當(dāng)然這并不是強(qiáng)制性的但使用大寫字符可以在編程中方便地識(shí)別
變量
變量的調(diào)用在變量前加$
$ echo $HOME
/home/hbwork
$ WEEK=Satur
$ echo Today is $WEEKday
Today is
$echo Today is ${WEEK}day
Today is Saturday
Shell變量賦值從右從左進(jìn)行(Linux Shell/bash從左向右賦值!)
$ X=$Y Y=y
$ echo $X
y
$ Z=z Y=$Z
$ echo $Y
$
使用unset命令刪除變量的賦值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z
$
有條件的命令替換
在Bourne Shell中可以使變量替換在特定條件下執(zhí)行即有條件
的環(huán)境變量替換
這種變量替換總是用大括號(hào)括起來的
.設(shè)置變量的默認(rèn)值
在變量未賦值之前其值為空Bourne Shell允許對(duì)變量設(shè)置
默認(rèn)值其格式如
下
${variable:-defaultvalue}
例
$ echo Hello $UNAME
Hello
$ echo Hello ${UNAME:-there}
Hello there
$ echo $UNAME #變量值并未發(fā)生變化
$ UNAME=hbwork
$ echo Hello ${UNAME:-there}
Hello hbwork
$
.另一種情況改變變量的值格式如下
${variable:=value}
例
$ echo Hello $UNAME
Hello
$ echo Hello ${UNAME:=there}
Hello there
$ echo $UNAME #變量值并未發(fā)生變化
there
$
.變量替換中使用命令替換
$USERDIR=${$MYDIR:-`pwd`}
.在變量已賦值時(shí)進(jìn)行替換 ${variable:+value}
.帶有錯(cuò)誤檢查的有條件變量替換
${variable:?value}
例
$ UNAME=
$ echo ${UNAME:?"UNAME has not been set"}
UNAME: UNAME has not been set
$ echo ${UNAME:?}
UNAME: parameter null or not set
(2)位置變量(Shell參數(shù))
在shell script中位置參數(shù)可用$1..$9表示$0表示內(nèi)容通常為當(dāng)前執(zhí)行
程序的文件名
.防止變量值被替換 readonly variable
.使用export命令輸出變量使得變量對(duì)子shell可用當(dāng)shell執(zhí)行一下
程序時(shí)shell
將為其設(shè)置一個(gè)新的環(huán)境讓其執(zhí)行這稱之了subshell. 在Bourne Shell中變量通常
被認(rèn)為是本地變量也就是說在對(duì)其賦值之外的shell環(huán)境之外是不認(rèn)識(shí)
此變量的使
用export對(duì)subshell可用
例對(duì)變量PS1的export操作shell的提示符將發(fā)生變化
$ PS1=`hostname`$
peony$sh
$ echo $PS1
$ <-輸出結(jié)果
$ exit
peony$export PS1
peony$sh
peony$ echo $PS1
peony$ <-輸出結(jié)果
peony$