条件判断
test:类似于if
前面说到过$?可以用来判断上一个命令是否正确执行,我们就用一下这个命令来查看。
- 等号两边要有空格。
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $a 12 [root@iZwz9hv1phm24s3jicy8x1Z ~]# test $a = 12 [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z ~]# test $a=12 [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z ~]# test $a=14 [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z ~]# test $a = 14 [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 1
上面每次判断都要用test,我们可以使用[ a = b ],但是要注意这个要求前后必须有空格
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ $a = 12 ] [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z ~]# [ $a = 102 ] [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 1
前面那种方式是把它当成字符串进行比较的。
对于数字之间的比较我们使用下面的方式进行:
Shell中整数之间的比较
(1)两个整数之间比较
- -eq 等于(equal)
- -ne 不等于(not equal)
- -lt 小于(less than)
- -le 小于等于(less equal)
- -gt 大于(greater than)
- -ge 大于等于(greater equal)
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 2 -lt 2 ] [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 1 [root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 2 -le 2 ] [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 5 -gt 2 ] [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 5 -gt 22 ] [root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $? 1
判断文件是否可读可写可执行
- -r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute)
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -x add.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 1 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -r add.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -w add.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -x third.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0
判断文件
- -e 文件存在(existence)
- -f 文件存在并且是一个常规的文件(file)
- -d 文件存在并且是一个目录(directory)
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls -l total 16 -rw-r--r-- 1 root root 15 Apr 21 00:04 add.sh -rwxrwx--- 1 root root 121 Apr 20 23:01 hello.sh drwxr-xr-x 2 root root 4096 Apr 20 19:59 test -rwxrwx--- 1 root root 24 Apr 20 20:16 third.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -e add.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -d add.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 1 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -f add.sh ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -d test ] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一 条命令执行失败后,才执行下一条命令)
可以把当成三目运算符来进行运算
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ $a = 12 ] && echo $a || echo "a不等于12" 12 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ $a != 12 ] && echo $a || echo "a等于12" a等于12
流程控制
单分支if语句
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ];then echo "OK";fi [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=178 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ];then echo "OK";fi OK
- -a:表示and
- -o:表示or
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . if.sh dongmu 欢迎主人 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . if.sh dongm [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat if.sh if [ $1 = dongmu ] then echo "欢迎主人" fi [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -a $a -lt 35 ]; then echo "可以入职";fi [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=19 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -a $a -lt 35 ]; then echo "可以入职";fi 可以入职 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=38 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -a $a -lt 35 ]; then echo "可以入职";fi [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -o $a -lt 35 ]; then echo "可以入职";fi 可以入职 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 35 -o $a -lt 18 ]; then echo "不可以入职";fi 不可以入职 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a 38 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=34 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 35 -o $a -lt 18 ]; then echo "不可以入职";fi
多分支if语句
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; fi; 大于18 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; else echo "小 于15"; fi; 大于18 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=16 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; else echo "小 于15"; fi; 大于15 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=13; [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; else echo "小 于15"; fi; 小于15
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . if.sh dongmu 12
欢迎主人
add.sh hello.sh if.sh test third.sh
您还是孩子
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat -n if.sh
1
2 if [ $1 = dongmu ]
3 then
4 echo "欢迎主人"
5 fi
6
7 echo ****************
8
9
10 if [ $2 -gt 18 -a $2 -lt 45 ]
11 then echo "你正值壮年"
12 elif [ $2 -gt 45 ]
13 then echo "您已经人到中年"
14 else echo "您还是孩子"
15 fi
case条件判断语句
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim case.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . case.sh 1
您1岁了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . case.sh 2
您两岁了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . case.sh 12
您已经长大了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat -n case.sh
1
2 case $1 in
3 "1") echo "您1岁了";;
4 "2") echo "您两岁了";;
5 *) echo "您已经长大了";;
6 esac
循环流程控制
- 第一种for循环的方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat -n for.sh
1 sum=0
2 for((i=0;i<10;i++))
3 do
4 sum=$[$sum+$i]
5 echo $sum
6 done
7
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . for.sh
0
1
3
6
10
15
21
28
36
45
我们之前说linux里面不能用<小于>大于,但是这里可以用,是因为在双小括号里面,在双小括号里面是可以用的。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if((9>8));then echo OK;fi; OK
- 第二种for循环的方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# for os in linux windows ios ;do echo $os;done linux windows ios
对于这第二种枚举所有的情况,有时候数据可能很多,我们可以直接使用{起始值..终止值}即可
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sum=0;for a in {1..10};do sum=$[$a+$sum];echo $sum;done
1
3
6
10
15
21
28
36
45
55
之前我们学习过,$*和$@一个是整体,一个是每一部分,下面我们进行测试
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim for.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat for.sh for a in $@ do echo $a done echo '**********************' for b in $* do echo $b done [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . for.sh 1 2 3 4 5 1 2 3 4 5 ********************** 1 2 3 4 5
- 这个看似好像没有区别,但是再看如果被引号引起来之后呢
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . for.sh 1 2 3 4 5 1 2 3 4 5 ********************** 1 2 3 4 5 ********************** 1 2 3 4 5 ********************** 1 2 3 4 5 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat for.sh for a in $@ do echo $a done echo '**********************' for b in $* do echo $b done echo '**********************' for a in "$@" do echo $a done echo '**********************' for b in "$*" do echo $b done
这个时候就可以发现$*被当成了整体。
while循环语句
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim while.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./while.sh 55 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat while.sh sum=0 a=1 while [ $a -le 10 ] do sum=$[ $a+$sum ] a=$[ $a+1 ] done echo $sum 下面这种方式也可以 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim while.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./while.sh 10 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat while.sh sum=0 a=1 while [ $a -le 10 ] # do sum=$[ $a+$sum ] # a=$[ $a+1 ] do let sum=a; let a++; done echo $sum



