??xml version="1.0" encoding="utf-8" standalone="yes"?>少妇在线看www,黄色网址在线播放,亚洲宅男一区http://www.aygfsteel.com/asdtiang/category/48658.htmlasdtiang-java-groovy-grails studyzh-cnMon, 23 May 2011 11:35:36 GMTMon, 23 May 2011 11:35:36 GMT60linux shell ~辑基础http://www.aygfsteel.com/asdtiang/archive/2011/05/23/350828.htmlasdtiangasdtiangMon, 23 May 2011 06:13:00 GMThttp://www.aygfsteel.com/asdtiang/archive/2011/05/23/350828.htmlhttp://www.aygfsteel.com/asdtiang/comments/350828.htmlhttp://www.aygfsteel.com/asdtiang/archive/2011/05/23/350828.html#Feedback0http://www.aygfsteel.com/asdtiang/comments/commentRss/350828.htmlhttp://www.aygfsteel.com/asdtiang/services/trackbacks/350828.htmlshellE序
什么是shellE序? 单的说shellE序是一个包含若q行
shell或?strong>linux命o(h)的文?
象编写高U语a的程序一?~写一个shellE序需要一个文本编辑器.如VI{?
在文本编辑环境下,依据shell的语法规?输入一些shell/linux命o(h)?形成一个完?br />的程序文?
执行shellE序文g有三U方?br />(1)#chmod +x file
(2)#sh file
(3)# . file
在编?strong>shell?W一行一定要指明pȝ需要那Ushell解释你的shellE序,?#! /bin/bash,
#! /bin/csh,/bin/tcsh,q是#! /bin/pdksh .
2.shell中的变量
(1)常用pȝ变量
     $ #        :保存E序命o(h)行参数的数目
     $ ?        :保存前一个命令的q回?br />     $ 0        :保存E序?br />     $ *        :?"$1 $2...")的Ş式保存所有输入的命o(h)行参?br />     $ @        :?"$1""$2"...)的Ş式保存所有输入的命o(h)行参?br />(2)定义变量
   shell语言是非cd的解释型语言,不象用C++/JAVA语言~程旉要事先声明变?l一
个变量赋?实际上就是定义了(jin)变量.
   ?strong>linux支持的所有shell?都可以用赋值符?=)为变量赋?
?
abc=9 (bash/pdksh不能在等号两侧留下空?)
set abc = 9 (tcsh/csh)
   ׃shellE序的变量是无类型的,所以用户可以用同一个变量时而存攑֭W时而存?br />整数.
?
name=abc (bash/pdksh)
set name = abc (tcsh)
在变量赋g?只需在变量前面加一?d?
?
echo $abc
(3)位置变量
当运行一个支持多个命令行参数的shellE序?q些变量的值将分别存放在位|变量里.
其中W一个参数存攑֜位置变量1,W二个参数存攑֜位置变量2,依次cL...,shell保留
q些变量,不允许用户以令外的方式定义他?同别的变??W号引用他们.

3.shell中引L(fng)使用Ҏ(gu)
shell使用引号(单引?双引?和反斜线("\")用于向shell解释器屏蔽一些特D字W?
反引?")对shell则有Ҏ(gu)意义.
?
abc="how are you" (bash/pdksh)
set abc = "how are you" (tcsh)
q个命o(h)行把三个单词l成的字W串how are you作ؓ(f)一个整体赋值给变量abc.
abc1='@LOGNAME,how are you!' (bash/pdksh)
set abc1='$LOGNAME,how are you!' (tcsh)
abc2="$LOGNAME,how are you!" (bash/pdksh)
set abc2="$LOGNAME,how are you!" (tcsh)
LOGNAME变量是保存当前用户名的shell变量,假设他的当前值是:wang.执行完两条命令后,
abc1的内Ҏ(gu):$LOGNAME, how are you!.而abc2的内Ҏ(gu);wang, how are you!.
象单引号一?反斜U也能屏蔽所有特D字W?但是他一ơ只能屏蔽一个字W?而不能屏?br />一l字W?
反引L(fng)功能不同于以上的三种W号.他不h屏蔽Ҏ(gu)字符的功?但是可以通过他将
一个命令的q行l果传递给另外一个命?
?
contents=`ls` (bash/pdksh)
set contents = `ls` (tcsh)
4.shellE序中的test命o(h)
在bash/pdksh?命o(h)test用于计算一个条件表辑ּ的?他们l常在条件语句和循环
语句中被用来判断某些条g是否满.
test命o(h)的语法格?
test expression
或?br />[expression]

在test命o(h)?可以使用很多shell的内部操作符.q些操作W介l如?
(1)字符串操作符 用于计算字符串表辑ּ
test命o(h)    |    含义
-----------------------------------------
Str1 = str2 | 当str1与str2相同?q回True
Str1! = str2| 当str1与str2不同?q回True
     Str      | 当str不是I字W时,q回True
    -n str    | 当str的长度大??q回True
    -z str    | 当str的长度是0?q回True
-----------------------------------------
(2)整数操作W具有和字符操作W类似的功能.只是他们的操作是针对整数
test表达?nbsp;  |    含义
---------------------------------------------
Int1 -eq int2|当int1{于int2?q回True
Int1 -ge int2|当int1大于/{于int2?q回True
Int1 -le int2|当int1于/{于int2?q回True
Int1 -gt int2|当int1大于int2?q回True
Int1 -ne int2|当int1不等于int2?q回True
-----------------------------------------
(3)用于文g操作的操作符,他们能检?文g是否存在,文gcd{?br />test表达?nbsp;  |    含义
------------------------------------------------
-d file      |当file是一个目录时,q回 True
-f file      |当file是一个普通文件时,q回 True
-r file      |当file是一个刻L件时,q回 True
-s file      |当file文g长度大于0?q回 True
-w file      |当file是一个可写文件时,q回 True
-x file      |当file是一个可执行文g?q回 True
------------------------------------------------
(4)shell的逻辑操作W用于修?q接包含整数,字符?文g操作W的表达?br />test表达?nbsp;   |    含义
----------------------------------------------------------
! expr        |当expr的值是False?q回True
Expr1 -a expr2|当expr1,expr2值同为True?q回True
Expr1 -o expr2|当expr1,expr2的D有一个ؓ(f)True?q回True
-----------------------------------------------------------
注意:
tcsh shell 不用test命o(h),但是tcsh中的表达式同栯承担相同的功?tcsh
支持的表辑ּ于C中的表达式相?通常使用在if和while命o(h)?
tcsh表达?nbsp;   |    含义
-------------------------------------------------------
Int1 <= int2 |当int1于/{于int2?q回True
Int1 >= int2 |当int1大于/{于int2?q回True
Int1 < int2   |当int1于int2?q回True
Int1 > int2   |当int1大于int2?q回True
Str1 == str2 |当str1与str2相同?q回True
Str1 != str2 |当str1与str2不同?q回True
-r file       |当file是一个可L件时,q回True
-w file       |当file是一个可写文件时,q回True
-x file       |当file是一个可执行文g?q回True
-e file       |当file存在?q回True
-o file       |当file文g的所有者是当前用户?q回True
-z file       |当file长度??q回True
-f file       |当file是一个普通文件时,q回True
-d file       |当file是一个目录时,q回True
Exp1 || exp2 |当exp1和exp2的D一个ؓ(f)True?q回True
Exp1 && exp2 |当exp1和exp2的值同为True?q回True
! exp         |当exp的gؓ(f)False?q回True

5.条g语句
同其他高U语aE序一?复杂的shellE序中经怋用到分支和@环控制结?
bash,pdksh和tcsh分别都有两种不同形式的条件语?if语句和case语句.
(1)if语句
语法格式:
bash/pdksh用法:
if [expression1]
then
commands1
elif [expression2]
commands2
else
commands3
if

tcsh用法:
if (expression1) then
commands1
else if (expression2) then
commands2
else
commands3
endif

含义:当expression1的条件ؓ(f)True?shell执行then后面的commands1命o(h);?br />expression1的条件ؓ(f)falseq且expression2的条件满ؓ(f)True?shell执行
commands2命o(h);当expression1和expressin2的条件值同为false?shell执行
commands3命o(h).if语句以他的反写fil尾.

(2)case语句
case语句要求shell一个字W串S与一l字W串模式P1,P2,...,Pn比较,当S?br />某个模式Pi惛_配时,执行相应的那一部分E序/命o(h).shell的case语句中字W?br />模式里可以包含象*q样的通配W?
语法格式:
bash/pdksh用法:
case string1 in
str1)
commands1;;
str2)
commands2;;
*)
commands3;;
esac

tcsh用法:
switch (string1)
case str1:
statements1
breaksw
case str2:
statements2
breaksw
default:
statements3
breaksw
endsw

含义:shell字W串string1分别和字W串模式str1和str2比较.如果string1与str1匚w,?br />shell执行commands1的命?语句;如果string11和str2匚w,则shell执行commands2的命?
语句.否则shell执行commands3的那D늨?命o(h).其中,每个分支的程?命o(h)都要以两?br />分号(;;)l束.

6.循环语句
当需要重复的某些操作?p用到循环语句.

(1)for语句
大家知道在很多编E语a中for语句是最常见.在shell中也不例?for语句要求shell包?br />在这个语句中的一l命令连l执行一定的ơ数.
语法格式:
bash/pdksh
用法1:
for var1 in list
do
commands
done
含义:在这个for语句?对应于list中的每个?shell执行一ơcommands代表的一l命?
在整个@环的每一ơ执行中,变量var1依此取list中的不同的?
用法2:
for var1
do
setatements
done
含义:在这个for语句?shell针对变量var1中的每一分别执行一ơstatements代表的一l?br />命o(h).当用这UŞ式的语句?shell认ؓ(f)var1变量中包含了(jin)所有的位置变量,而位|变量中
存放着E序的命令行参数?也就是说,他等价于下列形式:
for var1 in " $@"
do
statements
done

tcsh用法:
在tcsh中没有forq个单词,与for语句起同样功能的是foreach语句
foreach name (list)
commands
end

举例:
for file                       ;bash/pdksh
do
tr a-z A-Z<$file>file.caps
done

#                              ;tcsh
foreach file ( $ * )
tr a-z A-Z<$file>$file.caps
end


(2)while语句
while语句是shell提供的另一U@环语? while语句指定一个表辑ּ和一l命?q个
语句使得shell重复执行一l命?直到表达式的gؓ(f)False为止.
语法格式:
while expression     ;bash
do
statements
done

while (expression)   ;tcsh
statements
end
举例:
count=1              ;bash
while [ -n "$ *"]    ***
do
echo "this is a parameter number $count $1"
shift
count='expr $count + 1'
done

set count = 1         ;tcsh
while ( " $ * " ! = "")
echo "this is a parameter number $count $1"
shift
set count = 'expr $count + 1'
end

语句中shift命o(h)的功能是所有的命o(h)行参Cơ相左传?

(3)until语句
until与while语句hcM的语法格式和功能,不同的是while中expression的gؓ(f)True?
shell执行命o(h)l?而until中当expression的gؓ(f)False?shell才执行那l命?
语法格式:
until expression
do
commands
done
举例:
count=1
until [ -z " $ * "]       ***
echo "this is a parameter number $count $1"
shift
count='expr $count + 1'
done
情注意上qC子中?**?在while中的表达? -n string,他的含义是当string不是I?br />字符串时,表达式的gؓ(f)True;在until中的表达? -z string,他的 含义是当string是空
字符串时,表达式的gؓ(f)True.由此可见,两个E序Ҏ(gu)件表辑ּ的设|恰好是相反?

(4)shift语句
bash和tcsh都支持shift命o(h).shift存攑֜位置变量中的命o(h)行参?依次向左传?例如
位置变量当前gؓ(f):
$1=file1 $2=file2 $3=file3
执行一ơshift命o(h)?位置变量的gؓ(f):
$1=file2 $2=file3
q可以在shift命o(h)中指定位|变量{Uȝơ数, ?
shift n
例子:
while [ "$1"]
do
if [ "$1"="-i"] then
infile=" $2"
shift 2
else if [ "$1"="-o"] then
outfile="$2"
shift 2
else
echo "Program $0 does not recognize option $1"
fi
done
tr a-z A-Z<$infile>$outfile

(5)select语句
select语句是pdksh提供的一个独特的循环语句.他不同于前面介绍的@环语?他不?br />反复计算一个条件表辑ּ,q依据表辑ּ的值决定是否执行一l命?select的功能是自动?br />生成一个简单的文本菜单.
语法格式:
select menu [in list_of_items]
do
commands
done
含义:当执行一个select语句?pdksh分别为每个列在list_of_items中的成员建立一个菜?br />选项.list_of_items既可以是一个包含多个选项的变?也可以是直接列在E序中的一l选项
.如果语句中没有提供list_of_items,select语句用位|变量作为list_of_items.
举例:
select menuitem in pick1 pick2 pick3
do
echo "are you sure you want to pick $menuitem"
read res                   ;接收用户的输?q且输入的值存攑֜特定变量?
if [ $res=" y" -o $res=" Y"]
then
break                      ;用于退出while,for,select{@环语?br />fi
done
(6)repeat语句
repeat语句是tcsh提供的独有的循环语句.使用repeat命o(h)要求shell对一个命令执行一?br />的次?
语法格式:
repeat count command
?
foreach num ( $ *)
repeat $num echo -n " *"
echo " "
end

7.shell中的函数
shell允许用户定义自己的函?函数是高U语a中的重要l构.shell中的函数于C或者其?br />语言中定义的函数一?与从头开?一行一行地写程序相?使用函数主要好处是有利于l织
整个E序.在bash?一个函数的语法格式如下:
fname (){
shell comands
}
定义好函数后,需要在E序中调用他?bash中调用函数的格式:
fname [parm1 parm2 parm3...]
调用函数?可以向函C递Q意多个参?函数这些参数看做是存放他的命o(h)行参数的
位置变量.
举例:
q个E序定义?个函?
upper ():传递给他的文g中的字母转换成大?q存攑ֈ同名的结ؓ(f).out的文件中.
lower ():传递给他的文g里的字母转换成小?q存攑ֈ同名的结ؓ(f).out的文件中.
print ():输出传递给他的文g的内?
usage_error ():输出E序的帮助信?
E序的主模块是个case条g语句,他根据命令行中第一个参?军_E序要完成的功能,q调用相?br />的函数完成这一功能.
upper (){
shift
for i
do
tr a-a A-Z<$!>$1.out
rm $1
mv $1.out $1
shift
done; }
lower () {
shift
for i
do
tr A-Z a-z<$1>$1.out
rm $1
mv $1.out $1
shift
done; }
print() {
shift
for i
do
lpr $1
shift
done; }
usage_error() {
echo " $1 syntax is $1<option><input files>"
echo ""
echo " where option is one of the following"
echo " p--to print frame files"
echo " u--to save as uppercase"
echo " l--to save as lowercase";}
case $1 in
p | -p)print $@;;
u | -u)upper $@;;
l | -l)lower $@;;
*) usage_error $0;;
esac

------------------------------------------------------------------------------
ȝ
利用shell~程是提高系l管理工作效率的重要手段,学好shell跟了(jin)解系l基本命令和理
工具的用方法同样重?

?
A.bash中常用的命o(h)
命o(h)      |    含义
-------------------------------------------------------------------------------
Alias     |讄命o(h)别名
Bg        |一个被挂v的进E在后台执行
cd        |改变用户的当前目?br />exit      |l止一个shell
export    |使作个命令的参数的变量及(qing)其当前?在当前运行的shell的子q程中可?br />fc        |~辑当前的命令行历史列表
fg        |让一个被挂v的进E在前台执行
help      |昄bash内部命o(h)的帮助信?br />history   |昄最q输入的一定数量的命o(h)?br />kill      |l止一个进E?br />pwd       |昄用户当前工作目录
unalias   |删除命o(h)行别?br />--------------------------------------------------------------------------------

B.bash中常用的pȝ变量
变量          |    含义
-------------------------------------------------------------------------------
EDITOR,FCEDIT |Bash的fc命o(h)的默认文本编辑器
HISTFILE      |规定存放最q输入命令行文g的名?br />HISTSIZE      |规定命o(h)行历史文件的大小
HOME          |当前用户的宿ȝ?br />OLDPWD        |用户使用的前一个目?br />PATH          |规定bashL可执行文件时搜烦(ch)的\?br />PS1           |命o(h)行环境中昄W一U提C符?br />PS2           |命o(h)行环境中昄W二U提C符?br />PWD           |用户当前工作目录
SECONDS       |当前q行的bashq程的运行时?以秒为单?

asdtiang 2011-05-23 14:13 发表评论
]]>
վ֩ģ壺 ʲ| | ¡| ʡ| | Ȫ| ɽ| ̫ԭ| | | ˮ| | | ˺| | | | | | | | Դ| ̫| | | ƺ| ˫| | | ɽ| ͬ| | | | | ɽ| | | ͼ| ǹ| ຣʡ|