分类:
2010-08-23 10:13:35
ucblog好像不支持文档中的图片,可以看附件中的word文档。
Shell编程学习总结
1、文件名替换:shell在执行命令前,会把命令行中的*替换为工作目录下的所有文件名。问号?表示单字符匹配。
2、输出重定向:’>’ 或 ‘>>’ ;输入重定向:’<’ ;管道命令: ‘|’ 。
3、/dev/null是一个特殊系统文件,从它读取立刻得到文件结束符,向它写入的内容会被丢弃,不做任何显示或其他处理。
例如:who
| grep $user > /dev/null #结果不会在屏幕显示,而是被吃掉。
4、Shell在给变量名赋值时不进行文件名替换;Shell在执行命令时,先进行变量替换,然后进行文件名替换。
$
x=* #把一个星号*赋给变量x
$
echo $x #先做变量替换得到echo *,然后做文件名替换把星号*替换为当前目录下所有文件名。
结果:输出当前目录下所有文件
5、${variable}结构
$ mv $filename
${filename}P #文件重命名,原文件名后加一个P字母
6、整数算术运算
a)
格式:$((expression))
expr
例子:$((i+1)),
$(( i=(i+1)*j )), result=$(( i<100 && j>10 ))
b)
expr
例子:
$
expr 1 + 2
3
$
result=$( expr $i + 1 )
$
str=”hello”
$
expr “$str” : “.*” #根据正则表达式匹配第一个操作数中的字符
5
7、单引号告诉Shell忽略所有特殊字符,双引号要求Shell忽略大多数特殊字符,除了这三种:“美元符$、反引号`、反斜杠\”。
$ x=*
$ echo ‘$x’
$x
$ echo “$x”
*
8、 命令替换:指Shell将一个命令的标准输出插到一个命令行的任何位置的功能
两种格式:`command`
和
$(command)
例子:$(
ls | wc -l ), $( grep Money $( find . –type f –a –size ) )
9、参数传递:执行Shell程序时,Shell把命令本身存入Shell变量(位置参数)0中,第一个参数存入1中,第二个参数存入2中,以此类推。如果给程序传递9个以上参数,不能用$10、$11引用参数,必须用${10}和${11}。
10、
$#变量存放传入参数的个数。
11、
$*变量可以引用传递给程序的所有参数,通常用于参数不确定或参数可变的程序中。$@变量与$*类似,但不同的是如果用”$@”,其效果是给每个参数加上引号,当参数中有空白符时比较有用。
12、
Shift命令的作用是把位置参数左移:$2中的内容赋给$1,$3中的内容赋给$2,以此类推,原来$1中的内容丢失,执行命令后参数个数$#自动减一。Shift之后跟一个计数值可以以此移动几个位置。
例如:
$ cat tshift #测试shift的程序
echo $# $*
shift
echo $# $*
shift
echo $# $*
shift
echo $# $*
shift
$ tshift a b c
3 a b c
2 a b
1 a b
0
$
13、
$?变量:存放命令的退出状态,0表示执行成功,非0表示运行失败。
14、
if命令格式:执行并检查command_t的结果,如果退出状态为0则执行then和else之间的命令,否则执行else和fi之间的命令。
if command_t
then
command
command
…
else
command
command
…
fi
15、
test命令:在if命令中测试一种或几种条件
格式:test
expression 或
[ expression ] ,test命令计算expression,如果为真其退出状态为0,否则退出状态为非0。
例如:
if test “$name”
= “Leo Liu” 或
if [ “$name” = “Leo Liu” ]
then
echo “find it”
fi
说明:test命令对参数要求比较严格,例如容易出现如下错误,当变量symbol的内容是等号时:
$ echo $symbol
=
$ test –z “$symbol”
sh: test:
argument expected # error message
$
原因是等号操作符的优先级比-z操作符高,所以test命令要求后面跟参数。为了解决这个问题可以把命令写成:test
X”$symbol” = X 如果symbol为空结果为真,否则结果为假。
16、
a) test字符串操作符
b) test整数操作符
c) 文件操作符
d) 逻辑操作符
逻辑非操作符’!’:[
! –f “$filename” ]
逻辑与操作符’-a’:[
-f “$filename” –a –r “$filename” ]
逻辑或操作符’-o’:[
“$a” –eq 0 –o “$b” –eq 0 ]
17、
case命令格式:
case value in
pat1) command
command
…
command;;
…
patn) command
command
…
command;;
esac
把value与pat1…patn相比,如果发现匹配项,就执行匹配项之后到双分号之前的所有命令,之后case命令结束。如果没发现匹配项case语句中的命令一条也不执行。
18、
程序调试用-x选项,可以键入sh
-x后面跟程序名和参数,这样可以跟踪程序的执行。
19、
for命令,基本格式:
Shell允许在for命令中进行变量替换和文件名替换。
for file in *;
do echo $file; done
for file in name[1-4];
do run $file; done
不带列表的for命令格式:
Shell会认出此格式,并自动将命令行键入的参数依次组织成列表,就跟键入以下命令一样:
20、
while命令,格式如下。执行command1并检测其退出状态,如果为0执行do与done之间的内容,然后再执行并检测command1,知道其退出状态不为0,此时循环执行完毕,继续执行done之后的命令。
例如:
21、
until命令,格式如下。until命令跟while命令很像,区别在于只要在until之后的命令退出状态不为0,循环就一直执行下去,一旦退出状态为0,循环就结束。
22、
shell支持break和continue命令中断循环,区别是break
终端循环的执行,continue只是跳过循环体中后面的命令,然后循环像正常情况一样正常执行。
23、
处理命令行参数,可以用shell内部命令getopts,格式如下。
getopts命令的设计目标是在循环中运行,每次执行循环,getopts就检查下一命令行参数,并判断它是否合法。判断的方法是检查参数是否以减号开口,后面跟一个包含在options中的字母。如果是,getopts就把匹配的选项字母存在指定变量variable中,并返回退出状态0。
如果减号后面的字母没有包含在options中,getops就在variable中存一个问号,并返回0,同时向标准错误写入一条错误信息。
如果命令行中已经没有参数,或是下一个参数不以减号开头,getopts就返回不为0的退出状态。
假定希望命令foo的选项-a、-i和-r能够被getopts识别,调用getopts的命令方式可能像下面这样:
getopts支持带后面参数的选项,选项的参数会被存入特殊变量OPTARG中。还有一个特殊变量OPTIND,初始值为1,每次执行getopts命令后它都要更新,反映后面要处理的命令行参数个数。
例子:
24、
read命令,格式如下:
当执行这一命令时,shell从标准输入读入一行数据,并把第一个词赋给variables中的第一个变量,第二个次赋给第二个变量,以此类推。如果读入的词数比变量数多,则多出的词一同赋给最后一个变量。
25、 变量$$保存登录当前shell的进程id号码,可用于在编写可以由多人同时运行的shell程序时,生成与进程相关的唯一临时文件。
26、Shell中的特殊变量总结:
|
chinaunix网友2010-08-25 15:29:10
Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com