8、条件判断[判断真假]
判断的两种方式
1、方式一
test 参数 测试内容
2、方式二[注意[]左右的空格]
[ 参数 测试内容 ]
查看所有的test命令
man test
直接使用某条命令的返回状态来表示真假
main 函数的返回值
main 函数返回 0 表示真
main 函数返回非0 表示假
通过$?来获取上一条命令返回状态
1、字符串判断
命令 | 说明 |
---|---|
[ -z 字符串 ] | 判断字符串是否为空 |
[ -n 字符串 ] | 判断字符串不是空串 |
[ -o 字符串 ] | 逻辑或 |
[ -a 字符串 ] | 逻辑与 |
[ 字符串1 == 字符串2] | 判断字符串1是否等于字符串2 |
[ 字符串1 != 字符串2] | 判断字符串1是否不等于字符串2 |
[root@localhost /] [ -z a ] #返回1 或者 test -z a 返回1
[root@localhost /] [ a == b ] #返回1
[root@localhost /] [ a != b ] #返回0
[root@localhost /] test -n '' #返回1
[root@localhost /] test -n '234234234' #返回0
2、整数、数组比较
命令 | 说明 |
---|---|
= | 字符串比较 |
-lt | 小于(less than) |
-le | 小于等于(less equal) |
-eq | 等于(equal) |
-ne | 不等于(not equal) |
-gt | 大于(greater than) |
-ge | 大于等于(greater equal) |
[root@localhost /] [ 2 = 3 ]
[root@localhost /] echo $? #输出1
[root@localhost /] [ 2 -lt 3 ]
[root@localhost /] echo $? #输出0
[root@localhost /] [ 2 -le 3 ]
[root@localhost /] echo $? #输出0
[root@localhost /] [ 2 -eq 3 ]
[root@localhost /] echo $? #输出1
[root@localhost /] [ 2 -ne 3 ]
[root@localhost /] echo $? #输出0
[root@localhost /] [ 2 -gt 3 ]
[root@localhost /] echo $? #输出1
[root@localhost /] [ 2 -ge 3 ]
[root@localhost /] echo $? #输出1
3、文件权限比较
命令 | 说明 |
---|---|
-r | 有读权限 |
-w | 有写权限 |
-x | 有执行权限 |
-s | 判断文件是否为非空白,有内容为真 |
[root@localhost /] [ -r test.sh ]
[root@localhost /] echo $?
[root@localhost /] [ -w test.sh ]
[root@localhost /] echo $?
[root@localhost /] [ -x test.sh ]
[root@localhost /] echo $?
4、文件类型判断
命令 | 说明 |
---|---|
-f | 文件存在并且是一个常规文件(file) |
-e | 文件存在(existence) |
-d | 文件存在并且是一个目录(directory) |
-c | 判断是否为字符设备文件 |
-b | 判断是否为块设备文件 |
-nt | file1是否比file2更新 |
-ot | file1是否比file2旧 |
-et | fie1与file2是否是链接文件 |
[root@localhost /] [ -f test.sh ]
[root@localhost /] echo $?
[root@localhost /] [ -e test.sh ]
[root@localhost /] echo $?
[root@localhost /] [ -d test.sh ]
[root@localhost /] echo $?
[root@localhost /] [ test1.sh -ot test.sh ]
9、分支结构if/then/elif/fi
if 命令|条件测试
then
xxxxxx
elif 命令2|条件测试2 ; then ; #then和if是同一行,必须加;
xxxxxx
else #不用加then
xxxxxx
fi #结束标识 将if倒着写
1、ifelse和read混合使用
#!/bin/bash
echo "用户输入的数字"
read number
if [ $number -lt 10 ]
then
echo "当前数字小于10"
elif [ $number -gt 11 ] && [ $number -lt 100 ] # | 与 &&
then
echo "当前数字大于10 并且小于100"
elif [ $number -gt 101 ] && [ $number -lt 1000 ]
then
echo "当前数字大于100 并且小于1000"
else
echo "当前数字大于1000"
fi
2、逻辑||或者&&与
符号 | 说明 |
---|---|
cmd1&& cmd2 | 1、若cmd1执行完毕后且正确执行为0则开始执行cmd2 2、若cmd1执行完毕且为错误不等于0则不执行cmd2 |
cmd1|| cmd2 | 1、若cmd1执行完毕后切正确执行为0则不执行cmd2 2、若cmd1执行完毕且为错误不等于0则开始执行cmd2 |
#两个都返回真,才算执行成功0,有任何一个返回假,则返回假
[root@localhost /] [ 5 -gt 6 ] && [ 2 -lt 1 ] #执行$?输出为1(第一个命令执行即返回失败)
[root@localhost /] [ 5 -gt 1 ] && [ 2 -lt 9 ] #执行$?输出为0(两个都判断成功,返回0)
#两者符合一个都返回真
[root@localhost /] [ 5 -gt 6 ] || [ 2 -lt 1 ] #执行 $?输出为1(两个条件都不满足都返回1)
[root@localhost /] [ 5 -gt 1 ] || [ 2 -lt 9 ] #执行 $?输出为0(两个条件有一个满足即返回0)
10、case和esac
1、语法规则
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statementn
esac
2、举例
#!/bin/bash
echo "输入yes或者no"
read YES_OR_NO
case "$YES_OR_NO" in
yes|y|YES|Y)
echo "输入的是:yes|y|YES|Y" ;;
no|n|NO|N)
echo "输入的是:no|n|NO|N" ;;
*)
echo "输入的其他字符" ;;
esac
11、for和while循环
1、for/do/done
如果do和for是一行,则do的前面需要加;
for i in {1…100}
do
…
done
#遍历目录ls
#!/bin/bash
for fruit in apple banana pear
do #如果do和for是一行,则do的前面需要加;
echo "当前水果为:$fruit"
done
#计算0-100之间的和
number=0
for num in {1..100}
do
number=$[$num+$number]
done
echo "最终的值:$number"
2、while/do/done
while 命令|条件测试
do
xxx
done
#!/bin/bash
sum=0
while [ i -le 100 ]; do
i=$(($i + 1))
sum=$(($sum + $i))
done
echo "使用while计算的和是:$num"
12、输出
echo -n 表示不换行
echo -e 解析转义字符
#eg
echo -e "123\t234"
printf "%d\t%s\n" 123 "hello" #输出123 hello