高级bash编程指南(二)

内容范围:第五章 引用开始

1.echo $(ls -l)#输出结果没有换行

echo "$(ls -l)"#不会去掉换行符

2.退出码

(1)exit num(num必须是一个0-255范围的十进制整数)

(2)如果一个脚本以不带参数的exit命令结束,脚本的退出码将是执行exit命令前的最后一个命令的退出码

(3)没有exit,exit 没退出码和exit $?三者时等价的

(4)当一个函数返回时,$?保存了函数里最后一个命令的退出码,当一个脚本结束时,保存了脚本的退出码。

3.逻辑非(!)

! true ;echo $?   #result:1  注意!后面的空格

去掉空格后输出true

4.

(1)一个if/then结构测试一系列命令的退出码是否为0(0意味着命令执行成功),这里跟C是不同的。

(2)if命令不仅能测试【】也可以测试任何命令。

(3)【和test同义词,内建shell,返回比较结果(0真,1假)

【【 】】扩展,是关键字   (())   let 

(4)test 内建shell,在bash脚本中的test语句不必调用外部的/usr/bin/test的二进制文件;同样【也不必调用/usr/bin/【;其中/usr/bin/【是链接到/usr/bin/test的一个符号链接。

可以用type命令进行查看。

(5)【【】】结构比bash版本的【】更通用,它时从ksh88中引进的test命令的扩展。

i)【【 】】之间的所有字符都不会被文件扩展或是标记分割,但是会有参数引用和命令替换。

ii)在【【】】测试结构比用【】更能防止脚本里的许多逻辑错误,比如说&&,||,< ,>操作符能在一个【【】】测试里通过,但在【】结构会发生错误。

(6)(())结构扩展并计算一个算数表达式的值。一个非零值的表达式返回一个0或真作为退出码,这和test即【】刚好相反。

5.文件测试操作符

(1)-g 文件或目录的设置-ID(sgid)标记是否被设置

如果一个目录的sgid标志被设置,在这个目录下创建的文件都属于拥有次目录的用户组,而不必时创建文件的用户所属的组。这个特性对在一个工作组里的共享目录很有好处。

(2)-u 文件的设置-用户-ID(suid)标志是否被设置

一个root用户拥有的二进制执行文件如果设置了suid标志,则普通用户可以以root权限运行。这对需要存取系统硬件的执行程序(pppd ,cdrecord)很有用。如果没有设置suid位,则这些二进制执行程序不能有非root的普通用户调用。用sudo应该也可以吧 

6.整数比较

i)-le,-ne,-lt,等在【】中使用,<,<=等在(())中使用。> ,<可以在【】中使用,但需要转义。!=,=,==可以在【】中使用

使用的时候注意符号两边的空格

7.字符串比较

  if [ -n "$string1" ]:字符串不为null,为真

  if [ -z "$string2" ]:字符串为null,为真

  【】中使用!=,=,==,其他的需要转义

  当时用【【】】时则不用转义

8.混合比较

(1)-a 逻辑与 -o 逻辑或

(2)if 【【 condition1 && condition2 】】等价于 if 【 “expr1‘ -a ”expr2“ 】,if [ $condition1 ]&&[ $condition2 ]

注意比较操作符&&和||不能用于【】中。

9.bash中在函数外可以使用函数中的局部变量。

10.

: $((n=$n+1))冒号是必须的,而且后面有空格。没有:的话bash会把该句作为命令运行

等价于((n=n+1)),: $[n=$n+1],let "n++",((n++)),: $((n++)),: $[n++]

11.逗号操作符

链接两个或更多的算法操作。所有的操作都被求值(可能会有副作用),但值返回最后的一个操作的结构。

let "t1=((5+3,7-1,15-4))" #t1=11

12.数字常量

除非一个数字有特别的前缀或符号,否则shell脚本把它当成十进制的数。一个前缀为0的数字时八进制。一个前缀为0x的数字是十六进制数

posted @ 2011-03-14 21:45  xdzone  Views(567)  Comments(0Edit  收藏  举报