亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 46100 | 回復(fù): 1
打印 上一主題 下一主題

Bourne Shell及shell編程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2005-11-04 16:26 |只看該作者 |倒序?yàn)g覽
shell編程詳細(xì)版
  
Bourne Shell
介紹:Bourne Shell 基礎(chǔ)及其他很多有用的特性,shell編程及組織。
主要內(nèi)容:
.shell基礎(chǔ) 基本介紹,環(huán)境,選項(xiàng),特殊字符
.shell變量 用戶定義變量,環(huán)境變量,位置變量(shell 參數(shù))
.shell script編程
條件測(cè)試,循環(huán)及重復(fù)控制
.shell定制
1.shell基礎(chǔ)知識(shí)
作者:Stephen Bourne 在Bell實(shí)驗(yàn)室開(kāi)發(fā)
建議:man sh 查看相關(guān)UNIX上的改進(jìn)或特性
(1)shell提示符及其環(huán)境
/etc/passwd文件
提示符:$
/etc/profile $HOME/.profile
(2)shell執(zhí)行選項(xiàng)
-n 測(cè)試shell script語(yǔ)法結(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)用戶,這些用戶通常是看不到提
示符的。通常受限制用戶的主目錄是不可寫(xiě)的。
不足:如果用戶可以調(diào)用sh,則rsh的限制將不在起作用,事實(shí)上如果用戶在vi及more
程序中調(diào)用shell,而這時(shí)rsh的限制將不再起作用。
(4)用set改變 shell選項(xiàng)
用戶可以在$提示符下用set命令來(lái)設(shè)置或取消shell的選項(xiàng)。使用-設(shè)置選項(xiàng),+取消相應(yīng)
選項(xiàng),大多數(shù)UNIX系統(tǒng)允許a,e,f,h,k,n,u,v和x的開(kāi)關(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
PS1,PS2 默認(rèn)提示符($)及換行提示符(>)
TERM 終端類(lèi)型,常用的有vt100,ansi,vt200,xterm等
示例:$PS1="test:";export PS1
test: PS1="$";export PS1
$echo $MAIL
/var/mail/username
(7)保留字符及其含義
$ shell變量名的開(kāi)始,如$var
| 管道,將標(biāo)準(zhǔn)輸出轉(zhuǎn)到下一個(gè)命令的標(biāo)準(zhǔn)輸入
# 注釋開(kāi)始
& 在后臺(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)括起來(lái)
$? 上一個(gè)命令的返回代碼
$0 當(dāng)前shell的名字
$n (n:1-) 位置參數(shù)
$$ 進(jìn)程標(biāo)識(shí)號(hào)(Process Identifier Number, PID)
>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/hbwork/bin
其他:
$dir=ls
$$dir
$alias dir ls
$dir
ls > filelist
ls >> filelist
wc -l  /dev/rmt/0h
書(shū)寫(xiě)程序的目的是一次編程,多次使用(執(zhí)行)!
$ cat > backup.sh
cd /home/hbwork
ls * | cpio -o > /dev/rmt/0h
^D
執(zhí)行:
$ sh backup.sh
或:
$ chmod +x backup.sh
$ ./backup.sh
技巧:在shell script中加入必要的注釋?zhuān)员阋院箝喿x及維護(hù)。
(2)shell是一個(gè)(編程)語(yǔ)言
同傳統(tǒng)的編程語(yǔ)言一樣,shell提供了很多特性,這些特性可以使你的shell script
編程更為有用,如:數(shù)據(jù)變量、參數(shù)傳遞、判斷、流程控制、數(shù)據(jù)輸入和輸出,子
程序及以中斷處理等。
. 在shell編程中使用數(shù)據(jù)變量可以將程序變量更為通用,如在上面backup.sh中:
cd $WORKDIR
ls * | cpio -o > /dev/rmt/0h
. Shell編程中的注釋以#開(kāi)頭
. 對(duì)shell變量進(jìn)行數(shù)字運(yùn)算,使用expr命令
expr integer operator integer
其中operator為+ - * / %, 但對(duì)*的使用要用轉(zhuǎn)義符,如:
$expr 4 * 5
20
$int=`expr 5 + 7`
$echo $int
12
(3)Shell編程的參數(shù)傳遞, 可通過(guò)命令行參數(shù)以及交互式輸入變量(read)
restoreall.sh 對(duì)backup.sh程序的備份磁帶進(jìn)行恢復(fù)
$cat > restoreall.sh
cd $WORKDIR
cpio -i  /dev/rmt/0h
rm -rf *
改進(jìn)如下:
#當(dāng)使用了管道命令時(shí),管理命令的返回代碼為最后一個(gè)命令的返回代碼
if ls -a | cpio -o > /dev/rmt/0h
then
rm -rf *
fi
. if-then-else語(yǔ)句
if command_1
then
command_2
else
command_3
fi
技巧: 由于shell對(duì)命令中的多余的空格不作任何處理,一個(gè)好的程序員會(huì)用這一特性
對(duì)自己的程序采用統(tǒng)一的縮進(jìn)格式,以增強(qiáng)自己程序的可讀性.
. 使用test命令進(jìn)行進(jìn)行條件測(cè)試
格式: test conditions
test在以下四種情況下使用: a. 字符比較 b.兩個(gè)整數(shù)值的比較
c. 文件操作,如文件是否存在及文件的狀態(tài)等
d. 邏輯操作,可以進(jìn)行and/or,與其他條件聯(lián)合使用
a. 測(cè)試字符數(shù)據(jù): shell變量通常民政部下均作為字符變量
str1 = str2 二者相長(zhǎng),相同
str1 != str2 不同
-n string string不為空(長(zhǎng)度不為零)
-z string string為空
string string不為空
例:
$ str1=abcd #在含有空格時(shí)必須用引號(hào)括起來(lái)
$ test $str1=abcd
$ echo $?
0
$ str1="abcd "
$ test $str1=abcd
$ echo $?
1
Note: 在test處理含有空格的變量時(shí)最好用引號(hào)將變量括起來(lái),否則會(huì)出現(xiàn)錯(cuò)誤的結(jié)果,
因?yàn)閟hell在處理命令行時(shí)將會(huì)去掉多余的空格,而用引號(hào)括起來(lái)則可以防止
shell去掉這些空格.
例:
$ str1=" "
$ test $str1
$ echo $?
1
$ test "$str1"
$ echo $?
0
$ test -n $str1
test: argument expected
$ test -n "$str1"
$ echo $?
0
$
b. 整數(shù)測(cè)試: test與expr相同,可以將字符型變量轉(zhuǎn)換為整數(shù)進(jìn)行操作,expr進(jìn)行
整數(shù)的算術(shù)運(yùn)算,而test則進(jìn)行邏輯運(yùn)算.
表達(dá)式 說(shuō)明
---------------------------------------
int1 -eq int2 相等?
int1 -ne int2 不等?
int1 -gt int2 int1 > int2 ?
int1 -ge int2 int1 >= int2 ?
int1 -lt int2 int1  empty
$ test -r empty
$ echo $?
0
$ test -s empty
1
$ test ! -s empty
$ echo $?
0
e. 測(cè)試條件之邏輯運(yùn)算
-a And
-o Or
例: $ test -r empty -a -s empty
$ echo $?
1
f. 進(jìn)行test測(cè)試的標(biāo)準(zhǔn)方法
因?yàn)閠est命令在 shell編程中占有很重要的地位,為了使shell能同其他編程語(yǔ)言一樣
便于閱讀和組織, Bourne Shell在使用test測(cè)試時(shí)使用了另一種方法:用方括號(hào)將整個(gè)
test測(cè)試?yán)ㄆ饋?lái):
$ int1=4
$ [ $int1 -gt 2 ]
$ echo $?
0
例: 重寫(xiě)unload程序,使用test測(cè)試
#!/bin/sh
#unload - program to backup and remove files
#syntax: unload directory
#check arguments
if [ $# -ne 1 ]
then
echo "usage: $0 directory"
exit 1
fi
#check for valid directory name
if [ ! -d "$1" ]
then
echo "$1 is not a directory"
exit 2
fi
cd $1
ls -a | cpio -o > /dev/rmt/0h
if [ $? -eq 0 ]
then
rm -rf *
else
echo "A problem has occured in creating backup"
echo "The directory will not be ereased"
echo "Please check the backup device"
exit 3
fi
# end of unload
在如上示例中出現(xiàn)了exit, exit有兩個(gè)作用:一是停止程序中其他命令的執(zhí)行,二是
設(shè)置程序的退出狀態(tài)
g. if嵌套及elif結(jié)構(gòu)
if command
then
command
else
if command
then
command
else
if command
then
command
fi
fi
fi
改進(jìn):使用elif結(jié)構(gòu)
if command
then
command
elif command
then
command
elif command
then
command
fi
elif結(jié)構(gòu)同if結(jié)構(gòu)類(lèi)似,但結(jié)構(gòu)更清淅,其執(zhí)行結(jié)果完全相同.
h.交互式從鍵盤(pán)讀入數(shù)據(jù)
使用read語(yǔ)句,其格式如下:
read var1 var2 ... varn
read將不作變量替換,但會(huì)刪除多余的空格,直到遇到第一個(gè)換行符(回車(chē)),
并將輸入值依次賦值給相應(yīng)的變量。
例:
$ read var1 var2 var3
Hello my friends
$ echo $var1 $var2 $var3
Hello my friends
$ echo $var1
Hello
$ read var1 var2 var3
Hello my dear friends
$ echo $var3
dear friends  while循環(huán):
格式:
while command
do
command
command
command
...
done
例: 計(jì)算1到5的平方
#!/bin/sh
#
#Filename: square.sh
int=1
while [ $int -le 5 ]
do
sq=`expr $int * $int`
echo $sq
int=`expr $int + 1`
done
echo "Job completed"
$ sh square.sh
1
4
9
16
25
Job completed
until循環(huán)結(jié)構(gòu):
格式:
until command
do
command
command
....
command
done
示例:使用until結(jié)構(gòu)計(jì)算1-5的平方
#!/bin/sh
int=1
until [ $int -gt 5 ]
do
sq=`expr $int * $int`
echo $sq
int=`expr $int + 1`
done
echo "Job completed"
使用shift對(duì)不定長(zhǎng)的參數(shù)進(jìn)行處理
在以上的示例中我們總是假設(shè)命令行參數(shù)唯一或其個(gè)數(shù)固定,或者使用$*將整個(gè)命令
行參數(shù)傳遞給shell script進(jìn)行處理。對(duì)于參數(shù)個(gè)數(shù)不固定并且希望對(duì)每個(gè)命令參數(shù)
進(jìn)行單獨(dú)處理時(shí)則需要shift命令。使用shift可以將命令行位置參數(shù)依次移動(dòng)位置,
即$2->$1, $3->$2. 在移位之前的第一個(gè)位置參數(shù)$1在移位后將不在存在。
示例如下:
#!/bin/sh
#
#Filename: shifter
until [ $# -eq 0 ]
do
echo "Argument is $1 and `expr $# - 1` argument(s) remain"
shift
done
$ shifter 1 2 3 4
Argument is 1 and 3 argument(s) remain
Argument is 2 and 2 argument(s) remain
Argument is 3 and 1 argument(s) remain
Argument is 4 and 0 argument(s) remain
$
使用shift時(shí),每進(jìn)行一次移位,$#減1,使用這一特性可以用until循環(huán)對(duì)每個(gè)參
數(shù)進(jìn)行處理,如下示例中是一個(gè)求整數(shù)和的shell script:
#!/bin/sh
# sumints - a program to sum a series of integers
#
if [ $# -eq 0 ]
then
echo "Usage: sumints integer list"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo $sum
$ sh sumints 324 34 34 12 34
438
$
使用shift的另一個(gè)原因是Bourne Shell的位置參數(shù)變量為$1~$9, 因此通過(guò)位置變量
只能訪問(wèn)前9個(gè)參數(shù)。但這并不等于在命令行上最多只能輸入9個(gè)參數(shù)。此時(shí)如果想訪問(wèn)
前9個(gè)參數(shù)之后的參數(shù),就必須使用shift.
另外shift后可加整數(shù)進(jìn)行一次多個(gè)移位,如:
shift 3
. for循環(huán)
格式:
for var in arg1 arg2 ... argn
do
command
....
command
done
示例:
$ for letter in a b c d e; do echo $letter;done
a
b
c
d
e
對(duì)當(dāng)前目錄下的所有文件操作:
$ for i in *
do
if [ -f $i ]
then
echo "$i is a file"
elif [ -d $i ]
echo "$i is a directory"
fi
done
求命令行上所有整數(shù)之和:
#!/bin/sh
sum=0
for INT in $*
do
sum=`expr $sum + $INT`
done
echo $sum
從循環(huán)中退出: break和continue命令
break 立即退出循環(huán)
continue 忽略本循環(huán)中的其他命令,繼續(xù)下一下循環(huán)
在shell編程中有時(shí)我們要用到進(jìn)行無(wú)限循環(huán)的技巧,也就是說(shuō)這種循環(huán)一直執(zhí)行碰
到break或continue命令。這種無(wú)限循環(huán)通常是使用true或false命令開(kāi)始的。UNIX
系統(tǒng)中的true總是返加0值,而false則返回非零值。如下所示:
#一直執(zhí)行到程序執(zhí)行了break或用戶強(qiáng)行中斷時(shí)才結(jié)束循環(huán)
while true
do
command
....
command
done
上面所示的循環(huán)也可以使用until false, 如下:
until false
do
command
....
command
done
在如下shell script中同時(shí)使用了continue,break以及case語(yǔ)句中的正規(guī)表達(dá)式用法:
#!/bin/sh
# Interactive program to restore, backup, or unload
# a directory
echo "Welcome to the menu driven Archive program"
while true
do
# Display a Menu
echo
echo "Make a Choice from the Menu below"
echo _
echo "1 Restore Archive"
echo "2 Backup directory"
echo "3 Unload directory"
echo "4 Quit"
echo
# Read the user's selection
echo -n "Enter Choice: "
read CHOICE
case $CHOICE in
[1-3] ) echo
# Read and validate the name of the directory
echo -n "What directory do you want? "
read WORKDIR
if [ ! -d "$WORKDIR" ]
then
echo "Sorry, $WORKDIR is not a directory"
continue
fi
# Make the directory the current working directory
cd $WORKDIR;;
4) :;; # :為空語(yǔ)句,不執(zhí)行任何動(dòng)作
*) echo "Sorry, $CHOICE is not a valid choice"
continue
esac
case "$CHOICE" in
1) echo "Restoring..."
cpio -i
2) echo "Archiving..."
ls | cpio -o >/dev/rmt/0h;;
3) echo "Unloading..."
ls | cpio -o >/dev/rmt/0h;;
4) echo "Quitting"
break;;
esac
#Check for cpio errors
if [ $? -ne 0 ]
then
echo "A problem has occurred during the process"
if [ $CHOICE = 3 ]
then
echo "The directory will not be erased"
fi
echo "Please check the device and try again"
continue
else
if [ $CHOICE = 3 ]
then
rm *
fi
fi
done
(6)結(jié)構(gòu)化編程:定義函數(shù)
同其他高級(jí)語(yǔ)言一樣,shell也提供了函數(shù)功能。函數(shù)通常也稱(chēng)之為子過(guò)程(subroutine),
其定義格式如下:
funcname()
{
command
...
command; #分號(hào)
}
定義函數(shù)之后,可以在shell中對(duì)此函數(shù)進(jìn)行調(diào)用,使用函數(shù)定義可以將一個(gè)復(fù)雜的程序分
為多個(gè)可管理的程序段,如下所示:
# start program
setup ()
{ command list ; }
do_data ()
{ command list ; }
cleanup ()
{ command list ; }
errors ()
{ command list ; }
setup
do_data
cleanup
# end program
技巧:
. 在對(duì)函數(shù)命名時(shí)最好能使用有含義的名字,即函數(shù)名能夠比較準(zhǔn)確的描述函數(shù)所完成
的任務(wù)。
. 為了程序的維護(hù)方便,請(qǐng)盡可能使用注釋
使用函數(shù)的另一個(gè)好處就是可以在一個(gè)程序中的不同地方執(zhí)行相同的命令序列(函數(shù)),
如下所示:
iscontinue()
{
while true
do
echo -n "Continue?(Y/N)"
read ANSWER
case $ANSWER in
[Yy]) return 0;;
[Nn]) return 1;;
*) echo "Answer Y or N";;
esac
done
}
這樣可以在shell編程中調(diào)用iscontinue確定是否繼續(xù)執(zhí)行:
if iscontinue
then
continue
else
break
fi
** shell函數(shù)與shell程序非常相似,但二者有一個(gè)非常重要的差別:shell程序是由子shell
執(zhí)行的,而shell函數(shù)則是作為當(dāng)前shell的一部分被執(zhí)行的,因此在當(dāng)前shell中可以改
變函數(shù)的定義。此外在任意shell(包括交互式的shell)中均可定義函數(shù),如:
$ dir
dir: not found
$ dir () { ls -l ;}
$ dir
total 5875
-rw-r--r-- 1 hbwork 100 Nov 10 23:16 doc
-rw-r--r-- 1 hbwork 2973806 Nov 10 23:47 ns40docs.zip
-rw-r--r-- 1 hbwork 1715011 Nov 10 23:30 ns840usr.pdf
-rw-r--r-- 1 hbwork 1273409 Sep 23 1998 radsol21b6.tar.Z
-rw-r--r-- 1 hbwork 7526 Nov 10 23:47 wget-log
-rw-r--r-- 1 hbwork 1748 Nov 13 21:51 wget-log.1
$ unset dir
$ dir () {
> echo "Permission Link Owner Group File_SZ LastAccess FileName"
> echo "-----------------------------------------------------------"
> ls -l $*;
> }
$ dir
Permission Link Owner Group File_SZ LastAccess FileName
-----------------------------------------------------------
total 5875
-rw-r--r-- 1 hbwork 100 Nov 10 23:16 doc
-rw-r--r-- 1 hbwork 2973806 Nov 10 23:47 ns40docs.zip
-rw-r--r-- 1 hbwork 1715011 Nov 10 23:30 ns840usr.pdf
-rw-r--r-- 1 hbwork 1273409 Sep 23 1998 radsol21b6.tar.Z
-rw-r--r-- 1 hbwork 7526 Nov 10 23:47 wget-log
-rw-r--r-- 1 hbwork 1748 Nov 13 21:51 wget-log.1
通常情況下,shell script是在子shell中執(zhí)行的,困此在此子shell中對(duì)變量所作的
修改對(duì)父shell不起作用。點(diǎn)(.) 命令使用shell在不創(chuàng)建子shell而由當(dāng)前shell讀取
并執(zhí)行一個(gè)shell script, 可以通過(guò)這種方式來(lái)定義函數(shù)及變量。此外點(diǎn)(.)命令最
常用的功能就是通過(guò)讀取.profile來(lái)重新配置初始化login變量。如下所示:
$ . .profile
(csh相對(duì)于.命令的是source命令).
(7)使用And/Or結(jié)構(gòu)進(jìn)行有條件的命令執(zhí)行
And , 僅當(dāng)?shù)谝粋(gè)命令成功時(shí)才有執(zhí)行后一個(gè)命令,如同在邏輯與表達(dá)式中如果前面的
結(jié)果為真時(shí)才有必要繼續(xù)運(yùn)算,否則結(jié)果肯定為假。
格式如下:
command1 && command2
例:rm $TEMPDIR/* && echo "File successfully removed"
等價(jià)于
if rm $TEMPDIR/*
then
echo "File successfully removed"
fi
Or, 與AND相反,僅當(dāng)前一個(gè)命令執(zhí)行出錯(cuò)時(shí)才執(zhí)行后一條命令
例: rm $TEMPDIR/* || echo "File not removed"
等價(jià)與:
if rm $TEMPDIR/*
then
command
else
echo "File not removed"
fi
混合命令條件執(zhí)行
command1 && command2 && command3
當(dāng)command1, command2成功時(shí)才執(zhí)行command3
command1 && command2 || comamnd3
僅當(dāng)command1成功,command2失敗時(shí)才執(zhí)行command3
當(dāng)然可以根據(jù)自己的需要進(jìn)行多種條件命令的組合,在此不多講述。
(8) 使用getopts命令讀取unix格式選項(xiàng)
UNIX格式選項(xiàng)指如下格式的命令行參數(shù):
command -options parameters
使用格式:
getopts option_string variable
具體使用方法請(qǐng)參考getopts的在線文檔(man getopts).
示例如下:
#newdate
if [ $# -lt 1 ]
then
date
else
while getopts mdyDHMSTjJwahr OPTION
do
case $OPTION
in
m) date '+%m ';; # Month of Year
d) date '+%d ';; # Day of Month
y) date '+%y ';; # Year
D) date '+%D ';; # MM/DD/YY
H) date '+%H ';; # Hour
M) date '+%M ';; # Minute
S) date '+%S ';; # Second
T) date '+%T ';; # HH:MM:SS
j) date '+%j ';; # day of year
J) date '+%y%j ';;# 5 digit Julian date
w) date '+%w ';; # Day of the Week
a) date '+%a ';; # Day abbreviation
h) date '+%h ';; # Month abbreviation
r) date '+%r ';; # AM-PM time
?) echo "Invalid option $OPTION";;
esac
done
fi
$ newdate -J
94031
$ newdate -a -h -d
Mon
Jan
31
$ newdate -ahd
Mon
Jan
31
$
示例程序:復(fù)制程序
# Syntax: duplicate [-c integer] [-v] filename
# where integer is the number of duplicate copies
# and -v is the verbose option
COPIES=1
VERBOSE=N
while getopts vc: OPTION
do
case $OPTION
in
c) COPIES=$OPTARG;;
v) VERBOSE=Y;;
?) echo "Illegal Option"
exit 1;;
esac
done
if [ $OPTIND -gt $# ]
then
echo "No file name specified"
exit 2
fi
shift `expr $OPTIND -1`
FILE=$1
COPY=0
while [ $COPIES -gt $COPY ]
do
COPY=`expr $COPY + 1`
cp $FILE ${FILE}${COPY}
if [ VERBOSE = Y ]
then
echo ${FILE}${COPY}
fi
done
$ duplicate -v fileA
fileA1
$ duplicate -c 3 -v fileB
fileB1
fileB2
fileB3
4. Shell的定制
通常使用shell的定制來(lái)控制用戶自己的環(huán)境,比如改變shell的外觀(提示符)以及增強(qiáng)
自己的命令。
(1)通常環(huán)境變量來(lái)定制shell
通常改變環(huán)境變量可以定制shell的工作環(huán)境。shell在處理信息時(shí)會(huì)參考這些環(huán)境變量
,改變環(huán)境變量的值在一定程度上改變shell的操作方式,比如改變命令行提示符。
.使用IFS增加命令行分隔符
默認(rèn)狀態(tài)下shell的分隔符為空格、制表符及換行符,但可以通過(guò)改變IFS的值加入自己
的分隔符。如下所示:
$ IFS=":"
$ echo:Hello:my:Friend
Hello my Friend
(2)加入自己的命令及函數(shù)
如下程序:
#Directory and Prompt change program
#Syntax: chdir directory
if [ ! -d "$1" ]
then
echo "$1 is not a directory"
exit 1
fi
cd $1
PS1=`pwd`$
export PS1
$ chdir /usr/home/teresa
$
但此程序在執(zhí)行時(shí)系統(tǒng)提示符并不會(huì)改變,因?yàn)榇顺绦蚴窃谧觭hell中執(zhí)行的。因此其變量
對(duì)當(dāng)前shell并無(wú)影響,要想對(duì)當(dāng)前shell起作用,最好是將此作為函數(shù)寫(xiě)在自己的.profile中
或建立自己的個(gè)人函數(shù)文件.persfuncs
#Personal function file persfuncs
chdir()
{
#Directory and Prompt change program
#Syntax: chdir directory
if [ ! -d "$1" ]
then
echo "$1 is not a directory"
exit 1
fi
cd $1
PS1=`pwd`$
export PS1;
}
再執(zhí)行:
$ . .persfuncs
$ chdir temp
/home/hbbwork/temp$
也可在自己的.profile文件中用 . .persfuncs調(diào)用.persfuncs.
說(shuō)明:在bash/tcsh中已經(jīng)使用別名,相對(duì)而言別名比此方法更為方便。
5. 有關(guān)shell的專(zhuān)門(mén)討論
(1)shell程序的調(diào)試
切記:程序員(人)總是會(huì)犯錯(cuò)誤的,而計(jì)算機(jī)是不會(huì)錯(cuò)的。
使用-x進(jìn)行跟蹤執(zhí)行,執(zhí)行并顯示每一條指令。
(2)命令組
用小括號(hào)將一組命令括起來(lái),則這些命令會(huì)由子shell來(lái)完成;而{command_list;}則在當(dāng)
前shell中執(zhí)行。這兩者的主要區(qū)別在于其對(duì)shell變量的影響,子shell執(zhí)行的命令不會(huì)
影響當(dāng)前shell中的變量。
$ NUMBER=2
$ (A=2;B=2;NUMBER=`expr $A + $B`; echo $NUMBER)
4
$ echo $NUMBER
2
$ { A=2;B=2;NUMBER=`expr $A + $B`; echo $NUMBER; }
4
$ echo $NUMBER
4
總結(jié):
在本章中講述了Bourne Shell的基本知識(shí),使用shell變量,shell script基礎(chǔ)。這些概念
對(duì)于理解學(xué)習(xí)Korn Shell, csh以及其他script編程都是非常有用的。
很多OS都有不少語(yǔ)言及一些script功能,但很少有象UNIX SHELL這樣靈活強(qiáng)大的script腳
本語(yǔ)言能力。
對(duì)于系統(tǒng)管理員或程序員來(lái)說(shuō),熟練地使用shell script將對(duì)日常工作(系統(tǒng)維護(hù)及管理)
非常有用,如果你想作一個(gè)合格的系統(tǒng)管理員,強(qiáng)烈建議你進(jìn)一步深入的了解和使用
shell.
另外,對(duì)于系統(tǒng)管理員來(lái)說(shuō),PERL也是一個(gè)必不可少的script編程語(yǔ)言,尤其是對(duì)于處理
文本格式的各種文件,PERL具有shell, awk, sed, grep等的功能,但使用起來(lái)更為靈活,
功能也更強(qiáng)大。大家可以參考“Perl By Examples"來(lái)學(xué)習(xí)和使用PERL。
[/url]


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):[url]http://blog.chinaunix.net/u/11054/showart_55197.html

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
2 [報(bào)告]
發(fā)表于 2010-12-28 14:22 |只看該作者
不錯(cuò),支持一個(gè)。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP