特别变量:
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
脚本调试:
1 -n 检测语法错误,不执行脚本
script:debug_quotes.sh
#!/bin/bash
echo "USER=$USER
echo "HOME=$HOME"
echo "OSNAME=$OSNAME"
[root@limt01 ~]# bash -n debug_quotes.sh
debug_quotes.sh:行4: 寻找匹配的 `"' 是遇到了未预期的文件结束符
debug_quotes.sh:行5: 语法错误: 未预期的文件结尾
2 -v 在执行过程是显示每条命令
script:listusers.sh
#!/bin/bash cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt
awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt #Clean up the temporary file.
/bin/rm -f /tmp/users.txt
[root@limt01 ~]# bash -v listusers.sh
#!/bin/bash cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt
awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
limt limt
root root #Clean up the temporary file.
/bin/rm -f /tmp/users.txt
3 -x 跟踪每一步执行记录
[root@limt01 ~]# bash -x listusers.sh
+ cut -d : -f1,5,7 /etc/passwd
+ grep -v sbin
+ grep sh
+ sort
+ awk -F: ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
limt limt
root root
+ /bin/rm -f /tmp/users.txt
数值测试:
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
字符串测试:
= 等于则为真
!= 不相等则为真
-z 字符串 字符串长度伪则为真
-n 字符串 字符串长度不伪则为真
文件测试:
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。
数值计算:
var=`expr $var + 1`
let "var=(2+2-1)/2"
var=$((var+1))
var=$[var+1]