您的位置:首页 > 运维架构 > Shell

linux shell编程基础2

2011-04-25 17:37 267 查看

1.test命令(方括号[   ]为同义词):

用于提供对条件的判断,例如:

if test
condition   也可以不用test
condition,而使用 [ conditon
]         ([ , ] 的前后必须有空格)

then

   
commands

fi

condition有三种:

(1)数值比较: –eq,
–ne,             
–ge,-gt,            -le,
lt

       但是要注意:test命令无法处理存储在变量中的浮点值。

使用bash计算器bc时,只是欺骗了shell把浮点值作为字符串值存储于一个变量中。如果只是先使用echo语句显示结果,这种方法很好。但是在面向数值的函数(如数值测试条件)中不起作用。

2)字符串比较:=,!=,<,>,-n(检测字符串长度是否大于0),-z(检测字符串长度是否等于0)

字符串相等:测试比较将所有标点符号和大写都考虑在内

字符串顺序:要注意两点:

1).’>’,’<’一定要用’/’转义,否则shell会将它们当做重定向符号,将字符串值看做文件名

2).大于和小于的顺序与在sort命令中的顺序不同。

在test中,同一个字母,大写字母>小写字母

在sort中,相反。

字符串大小:评估一个变量是否包含数据时,使用-n和-z比较方便

对空变量和未初始化的变量检测出的长度也为0

(3)文件比较

文件比较是shell脚本中最强大和最常用的一类比较。
test可以测试文件状态和路径。(使用的非常频繁!)

-d file: 检查file是否存在并且是一个目录

-e file: 检查file是否存在

-f file: 检查file是否存在并且是一个文件
-r file: 检查file是否存在并且可读
-s file: 检查file是否存在并且不为空
-w file: 检查file是否存在并且可写
-x file: 检查file是否存在并且可执行
-O file: 检查file是否存在并且被当前用户拥有
-G file:检查file是否存在并且默认组是否为当前用户组
file1 –nt
file2: 检查file1是否比file2新

file1 –ot
file2: 检查file1是否比file2旧  

2. 复合条件查询:

[ condition1 ] && [
condition2 ]

[
condition1 ] || [ condition2 ]

3. 命令行参数:

(1)读取参数

 

[b]   读取输入的参数的变量为位置参数,位置参数通过标准数字表示,[/b]

  
其中$0为程序名称,$1为第一个参数,$2为第二个参数,依次类推,直到$9为第九个参数。

  
shell脚本自动将命令行参数赋值给各个位置变量。

  
同时输入多个参数(可以是数值也可以是字符串)时,必须使用空格分隔(要想在参数值中包含空格,就必须使用单引号或双引号)

  
当参数多于9个后,必须在shell脚本内使用大括号将变量括起来,如${10}。从而可以使用任意个参数。

(2)读取程序名称

传递给变量$0的字符串实际上是程序的路径(根据调用方法决定是相对还是绝对路径)。

使用basename命令可以去掉路径前缀,只获得程序名称(名字中不可以有空格)。

(3)测试脚本

当脚本认为应该包含参数,却实际上没有数据时,就会出错。

好的方法是对参数进行检查来保证使用参数前确实存在数据,可以使用-n参数来检查。

ex: if [ –n “$1” ] then .. else .. fi

4. 特殊的参数变量:

(1)参数计数

[b][b]使用[b]特殊变量$#测试执行脚本时包含的命令行参数个数[/b]。脚本中任何位置都可以使用$#[/b][/b]

ex: if [ $# –ne 2 ] 即可测试参数个数

可以使用${!#}来返回最后一个命令行参数(当无参数时,$#为0,而${!#}为程序名)

(2)获取所有数据

变量$*将命令行中提供的所有参数作为一个单词处理,它将多个参数看成一个参数。

变量$@将命令行中提供的所有参数作为同一个字符串中的多个单词处理。允许对其中的值进行迭代(一般使用for),分隔开不同参数

5. 移位:

shift命令能够改变命令行参数的相对位置。默认将每个参数变量左移一个位置(变量$0不变,$1丢弃,注意不可以恢复了!)

在不清楚参数数目情况下,这是一个迭代参数的好办法

可以为shift提供一个参数,来实现多位移变化

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息