测试方法、执行结果和状态码的区别、测试脚本是否有语法错误
三种测试方法
[ expression ]【[空格expression空格],别忘了空格】
[[ expression ]]
test expression
整数测试
-gt,-lt,-eq,-ne,-ge,-le
INT1=11 INT2=22 [ $INT1 -eq $INT2 ]或[[ $INT1 -eq $INT2 ]]或test $INT1 -eq $INT2
执行结果和状态码的区别
if 条件,这个"条件"是0的时候代表成功,这个"条件"在"if"后面是个状态码。
只有使用上面的整数测试的条件的时候才用"[]",如果测试成立返回的状态码是0
USERNAME=user1
1、 if grep "^$USERNAME>" /etc/passwd; then 【正确,grep返回的是个状态码】
2、 if [ grep "^$USERNAME>" /etc/passwd ]; then 【错误,只有使用上面的整数测试的条件的时候才用"[]"】
3、 if [ grep "^$USERNAME\>" /etc/passwd
-eq 0 ]; then 【错误,grep返回的是命令的执行结果,一行内容,根本不是状态码,在"if"后面才是状态码】
4、 if [ grep "^$USERNAME\>" /etc/passwd | cut -d: -f3
-eq 0 ]; then 【如果$USERNAME的UID是0,该条件就成立,否则错误】
5、 if grep "^$USERNAME\>" /etc/passwd | cut -d: -f3
; then 【这个首先执行grep,如果$USERNAME的UID是0,if把0当作状态码,该条件就成立,否则也是错误的】
文件测试
-e FILE:测试文件是否存在
-d FILE:测试文件是否是目录
-f FILE:测试文件是否是普通文件
-r FILE:测试当前用户对该文件是否有读取的权限
-w
-x
[root@jiakang ~]# [ -d aaa ] [root@jiakang ~]# echo $? 1 [root@jiakang ~]# [ -d a ] [root@jiakang ~]# echo $? 0
定义脚本退出状态码
exit :退出脚本,停止脚本的执行【类似php的exit和die】
exit 8【定义退出状态码是8】
测试脚本是否有语法错误
bash -n 脚本
bash -x 脚本 :单步执行
[root@jiakang a]# cat testif.sh #!/bin/bash FILE=/etc/inittabs if [ -e $FILE ];then echo "OK" else echo "找不到文件" f [root@jiakang a]# bash -n testif.sh testif.sh: line 8: syntax error: unexpected end of file [root@jiakang a]# cat testif.sh #!/bin/bash FILE=/etc/inittabs if [ -e $FILE ];then echo "OK" else echo "找不到文件" fi [root@jiakang a]# bash -x testif.sh + FILE=/etc/inittabs + '[' -e /etc/inittabs ']' + echo $'\346\211\276\344\270\215\345\210\260\346\226\207\344\273\266' 找不到文件 [root@jiakang a]# echo $? 0【这个状态码是最后echo "找不到文件"返回的,echo输出的是最后一个命令的状态码】
字符串测试
==
!=
>
<
-n string :测定指定字符串是否为空,空则真,不空则假
-z string :测定指定字符串是否不空,不空则真,空则假
[ 字符串 == 字符串 ]【[空格 字符串 空格==空格 字符串 空格],注意==两侧都有空格】
[[ 字符串 == 字符串 ]]
[root@jiakang ~]# A="aaa" [root@jiakang ~]# B="bbb" [root@jiakang ~]# [ $A == $B ] [root@jiakang ~]# echo $? 1 [root@jiakang ~]# [ $A != $B ] [root@jiakang ~]# echo $? 0
for循环
用法:for 变量 in 列表; do 循环体 done
例如: for I in 1 2 3 4 5; do 加法运算 done
常用生成列表的方法
{1..100}
seq [起始数 [跳数]] 结束数
[root@jiakang ~]# seq 5 1 2 3 4 5 [root@jiakang ~]# seq 3 5 3 4 5 [root@jiakang ~]# seq 3 2 8 3 5 7
声明整数
let SUM
declare -i SUM
[root@jiakang a]# cat testfor.sh #!/bin/bash declare -i SUM=0 for I in `seq 1 2 100 ` ;do let SUM=$[$SUM+$I] done echo "sum=$SUM" [root@jiakang a]# ./testfor.sh sum=2500 [root@jiakang a]# cat testfor.sh #!/bin/bash declare -i SUM=0 for I in {1..100};do let SUM=$[$SUM+$I] done echo "sum=$SUM" [root@jiakang a]# ./testfor.sh sum=5050