SHELL编程Word下载.docx
- 文档编号:22277252
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:20
- 大小:22.90KB
SHELL编程Word下载.docx
《SHELL编程Word下载.docx》由会员分享,可在线阅读,更多相关《SHELL编程Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
("
$1"
"
$2"
...)
$-显示shell使用的当前选项。
$?
显示最后命令的推出状况。
0表示没有错误。
/bin/sh
if[$#-ne2];
then
Usage:
$0stringfile"
exit1;
fi
grep$1$2;
if[$?
-ne0];
NotFound"
in$2"
Found"
上面的例子中使用了$0$1$2$#$?
等变量,下面是程序的解释:
判断运行参数个数,如果不等于2,显示使用"
用法帮助"
其中$0表示就是脚本自己。
用grep在$2文件中查找$1字符串。
判断前一个命令运行后的返回值(一般成功都会返回0,失败都会返回非0)。
如果没有成功显示没找到相关信息,否则显示找到了。
其中"
表示转义,在"
里面还需要显示"
号,则需要加上转义符"
参数置换的变量
1、变量=${参数:
-word}:
如果设置了参数,则用参数的值置换变量的值,否则用word置换。
即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
[-z"
${COLUMNS:
-}"
]&
&
COLUMNS=80
2、变量=${参数:
=word}:
如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。
注意,位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。
3、变量=${参数:
?
word}:
如果设置了参数,则用参数的值置换变量的值,否则就显示word并从Shell中退出,如果省略了word,则显示标准信息。
这种变量要求一定等于某一个参数的值。
如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
4、变量=${参数:
+word}:
如果设置了参数,则用word置换变量,否则不进行置换。
字符串匹配的操作:
${PARAMETER#WORD}shell像文件名扩展中那样扩展WORD,并从PARAMETER扩展后的值的开头删除最短的匹配模式(若存在匹配模式的话)。
使用‘@’或‘$’即可删除列表中每个参数的模式。
${PARAMETER##WORD}导致从开头删除最长的匹配模式而不是最短的匹配模式。
${PARAMETER%WORD}shell像文件名扩展中那样扩展WORD,并从PARAMETER扩展后的值末尾删除最短的匹配模式(若存在匹配模式的话)。
${PARAMETER%%WORD}导致从末尾删除最长的匹配模式而不是最短的匹配模式。
${PARAMETER/PATTERN/STRING}shell像文件名扩展中那样扩展PATTERN,并替换PARAMETER扩展后的值中最长的匹配模式(若存在匹配模式的话)。
为了在PARAMETER扩展后的值开头匹配模式,可以给PATTERN附上前缀#,如果要在值末尾匹配模式,则附上前缀%。
如果STRING为空,则末尾的/可能被忽略,匹配将被删除。
使用‘@’或‘$’即可对列表中的每个参数进行模式替换。
${PARAMETER//PATTERN/STRING}对所有的匹配(而不只是第一个匹配)执行替换。
變數設定方式str沒有設定str為空字串str已設定非為空字串
var=${str-expr}var=exprvar=var=$str
var=${str:
-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
+expr}var=var=var=expr
var=${str=expr}str=expr
var=exprstr不變
var=str不變
var=$str
=expr}str=expr
var=exprstr=expr
var=${str?
expr}expr輸出至stderrvar=var=str
?
expr}expr輸出至stderrexpr輸出至stderrvar=str
[ian@pinguino~]$x="
a1b1c2d2"
[ian@pinguino~]$echo${x#*1}
b1c2d2
[ian@pinguino~]$echo${x##*1}
c2d2
[ian@pinguino~]$echo${x%1*}
a1b
[ian@pinguino~]$echo${x%%1*}
a
[ian@pinguino~]$echo${x/1/3}
a3b1c2d2
[ian@pinguino~]$echo${x//1/3}
a3b3c2d2
[ian@pinguino~]$echo${x//?
1/z3}
z3z3c2d2
字符串子集提取:
${x:
3:
5}
的值就是“eval”,
清单9.shell参数值的子字符串
somevalue"
[ian@pinguino~]$echo"
5}"
eval
字符串长度:
您已经知道$#表示参数的数量,而${PARAMETER:
OFFSET:
LENGTH}扩展适用于单个参数以及$*和$@,因此,可以使用一个类似的结构体${#PARAMETER}来确定单个参数的长度也就不足为奇了。
清单10中所示的简单的testlength函数阐明了这一点。
自己去尝试使用它吧。
清单10.参数长度
[ian@pinguino~]$testlength(){forpin"
$@"
doecho${#p};
done}
[ian@pinguino~]$testlength1abc"
defghi"
1
3
7
1.4、运算和运算符
1.4.1、整数运算符
整数的算术运算符
+-*/%
赋值运算符
+=-=*=/=%=
位运算符
<
>
>
&
|~^
位运算赋值运算符
=>
=&
=|=~=^=
逻辑运算符:
||!
=<
<
=!
===
expr命令计算一个表达式的值
格式:
exprarg
计算(2+3)×
4的值
1、分步计算,即先计算2+3,再对其和乘4
s=`expr2+3`
expr$s*4
2、一步完成计算:
expr`expr2+3`*4
说明:
运算符号和参数之间要有空格分开;
通配符号(*),在作为乘法运算符时要用、“”、‘’符号修饰
关键字let计算表达式的值:
x=2006
let"
x=$x+1"
echo$x
x="
astring."
echo$x
又出现了新的关键字:
let。
关于整数变量计算,有如下几种:
+-*/%"
,他们的意思和字面意思相同,在*和/之前必须冠以反斜线,已防被SHELL先行解释。
整数运算一般通过let和expr这两个指令来实现,如对变量x加1可以写作:
或者x=`expr$x+1`
1.4.2、逻辑运算符
对应操作整数字符串
相同-eq=
不同-ne!
=
大于-gt>
小于-lt<
大于或等于-ge
小于或等于-le
为空-z
不为空-n
文件操作逻辑运算符:
-dfile----当file是一个目录时,返回True
-ffile----当file是一个普通文件时,返回True
-rfile----当file是一个只读文件时,返回True
-sfile----当file文件长度大于0时,返回True
-wfile----当file是一个可写文件时,返回True
-x"
/bin/ls"
----当/bin/ls是一个可执行文件时,返回True,目录是否可访问
-efile----当file存在时,返回True
-ofile----当file文件的所有者是当前用户时,返回True
-zfile----当file长度为0时,返回True
-u-----文件的UID标志被设置
-G-----文件的组ID和当前用户相同
file1-ntfile2-----文件file1比file2更新
file1-otfile2-----文件file1比file2更老
逻辑连接符:
!
expr当expr的值是False时,返回True
Expr1-aexpr2当expr1,expr2值同为True时,返回True
Expr1-oexpr2当expr1,expr2的值至少有一个为True时,返回True
命令逻辑连接符:
[-r"
$mailfolder"
]||{echo"
Cannotread$mailfolder"
;
exit1;
}
使用{}把两个命令括起来,表示一个函数的用法。
与||或
[-f"
/etc/shadow"
echo"
Thiscomputerusesshadowpasswors"
注意:
在“[”和“]”符号的左右都留有空格
mailfolder=/var/spool/mail/james
}
$mailfolderhasmailfrom:
grep"
^From"
$mailfolder
其中“^From“表示以From开头的
1.5、流程语句
1.5.1、if语句
if[逻辑表达式];
#commandcode
elif[逻辑表达式];
#commandcode
else
#commandcode
if[expression]
then
#codeblock
elif[expression]
fi
如果您为了简洁,想把then和if放在一行,那就要这样写了:
if[expression];
then。
即在then前加一个“;
”号。
1.5.2、case语句
casestring1in
str1)commands1;
str2)commands2;
*)commands3;
esac
#filelf.gz
lf.gz:
gzipcompresseddata,deflated,originalfilename,
lastmodified:
MonAug2723:
09:
182001,os:
Unix
脚本:
ftype=`file"
`
case"
$ftype"
in
Ziparchive"
*)unzip"
gzipcompressed"
*)gunzip"
bzip2compressed"
*)bunzip2"
*)#*通配符代表其他
error"
File$1cannotbeuncompressedwithsmartzip"
/bin/bash
Hitakey,thenhitreturn."
readKeypress
$Keypress"
[a-z])echo"
Lowercaseletter"
[A-Z])echo"
Uppercaseletter"
[0-9])echo"
Digit"
*)echo"
Punctuation,whitespace,orother"
esac
exit0
1.5.3、select语句
尤其擅长于交互式使用。
用户可以从一组不同的值中进行选择。
selectvarin...;
do
break
done
WhatisyourfavouriteOS?
selectvarin"
Linux"
GnuHurd"
FreeBSD"
Other"
break
Youhaveselected$var"
下面是该脚本运行的结果:
1)Linux
2)GnuHurd
3)FreeBSD
4)Other
#?
1
YouhaveselectedLinux
1.6、循环语句
1.6.1、for语句
forvarin数组列表;
#commandbolock
例子1:
forvarinABC;
echo"
varis$var"
例子2:
#列出RPM的数目
#用法:
showrpmrpmfile1rpmfile2...
#EXAMPLE:
showrpm/cdrom/RedHat/RPMS/*.rpm
forrpmpackagein$*;
if[-r"
$rpmpackage"
];
echo"
==$rpmpackage=="
rpm-qi-p$rpmpackage
else
ERROR:
cannotreadfile$rpmpackage"
fi
例子3:
forvar1in"
do
#statements
例2和例3的$*和“$@”是相同的
1.6.2、while语句
while[express];
#command
Done
count=1
while[-n"
$*"
]
thisisaparameternumber$count$1"
shift
count='
expr$count+1'
case$1in
-h)help;
shift1;
#functionhelpiscalled
#执行help函数,shift1表示,移除第一个变量$1,则第二个变为:
$1
-f)opt_f=1;
#variableopt_fisset
-l)opt_l=$2;
shift2;
#-ltakesanargument->
shiftby2
--)shift;
break;
#endofoptions
-*)echo"
error:
nosuchoption$1.-hforhelp"
*)break;
就像平常执行命令一样,当有参数-h时,则执行相应的动作
1.6.3、breake和continue
关键字"
break"
用来跳出循环。
而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
1.6.4、shiftshift将存放在位置变量中的命令行参数,依次向左传递.例如
位置变量当前值为:
$1=file1$2=file2$3=file3
执行一次shift命令后,位置变量的值为:
$1=file2$2=file3
还可以在shift命令中指定位置变量转移的次数,如:
shiftn
例子:
while["
if["
="
-i"
]then
infile="
$2"
shift2
elseif["
-o"
outfile="
else
Program$0doesnotrecognizeoption$1"
done
tra-zA-Z<
$infile>
$outfile
二、函数
脚本b2d将二进制数(比如1101)转换为相应的十进制数。
这也是一个用expr命令进行数学运算的例子:
#vim:
setsw=4ts=4et:
help()
{
cat<
b2h--convertbinarytodecimal
USAGE:
b2h[-h]binarynum
OPTIONS:
-hhelptext
EXAMPLE:
b2h111010
willreturn58
HELP
exit0
}
error()
{ #printanerrorandexit
exit1
lastchar()
{ #returnthelastcharacterofastringin$rval
if[-z"
#emptystring
rval="
return
fi
#wcputssomespacebehindtheoutputthisiswhyweneedsed:
numofchar=`echo-n"
wc-csed'
'
s///g'
`
#nowcutoutthelastchar
rval=`echo-n"
cut-b$numofchar`
chop()
{ #removethelastcharacterinstringandreturnitin$rval
if["
$numofchar"
="
1"
#onlyonecharinstring
numofcharminus1=`expr$numofchar"
-"
1`
#nowcutallbutthelastchar:
cut-b0-${numofcharminus1}`
-h)help;
#functionhelpiscalled
-*)error"
#Themainprogram
sum=0
weight=1
#oneargmustbegiven:
help
binnum="
binnumorig="
$binnum"
lastchar"
$rval"
sum=`expr"
$weight"
+"
$sum"
#removethelastpositionin$binnum
chop"
binnum="
weight=`expr"
*"
2`
binary$binnumorigisdecimal$sum"
三、sh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SHELL 编程