高级bash编程指南(二)
时间:2011-03-14 来源:xdzone
内容范围:第五章 引用开始
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的数字是十六进制数