Shell脚本 (三) 条件判断 与 流程控制

时间:2023-03-08 21:53:15
Shell脚本 (三) 条件判断 与 流程控制

个人博客网:https://wushaopei.github.io/    (你想要这里多有)

六、条件判断

1、基本语法

[ condition ](注意condition 前后要有空格)

注意:条件非空即为true,[ webcode ]返回true,[]返回false

2、常用判断条件

(1)两个整数之间比较

= 字符串比较

-lt 小于(less than)                   -le 小于等于(less equal

-eq 等于(equal)                      -gt 大于(greater than

-ge 大于等于(greater equal)  -ne 不等于 (Not equal

(2)按照文件权限进行判断

-r  有读的权限(read)                   -w 有写的权限(write

-x  有执行的权限(execute

(3)按照文件类型进行判断

   -f  文件存在并且是一个常规的文件(file

-e 文件存在(existene)                 -d 文件存在并是一个目录(directory

3、案例实操

(1)23是否大于等于22

[root@rich datas]# [ 23 -ge 22 ]
[root@rich datas]# echo $?
0

Shell脚本 (三) 条件判断 与 流程控制

  • echo $? 返回的是0,说明上一个正确执行了
[root@rich datas]# [ 23 -le 22 ]
[root@rich datas]# echo $?
1

Shell脚本 (三) 条件判断 与 流程控制

  • echo $? 返回的非0,说明上一个执行失败了

(2)helloworld.sh 是否具有写权限

[root@rich datas]# [ -w helloworld.sh ]
[root@rich datas]# echo $?
0

Shell脚本 (三) 条件判断 与 流程控制

(3)/home/wenmin/cls.txt 目录中的文件是否存在

[root@rich datas]# [ -e /home/wenmin/cls.txt ]
[root@rich datas]# echo $?
1

Shell脚本 (三) 条件判断 与 流程控制

  • 执行echo $? 返回不为0,说明文件不存在
[root@rich wenmin]# [ -e /home/wenmin/wenxing.txt ]
[root@rich wenmin]# echo $?
0

Shell脚本 (三) 条件判断 与 流程控制

  • 执行echo $? 返回为0,说明文件存在

(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令, || 表示上一条命令执行失败后,才执行下一条命令)

[root@rich datas]# [ condition ] && echo OK || echo notok
OK

Shell脚本 (三) 条件判断 与 流程控制

  • 先执行 运算式,返回为true, 再执行 echo OK ,打印 OK ; 由于当前判断使用短路或,左边为true时,右边不执行
[root@rich datas]# [ condition ] && [ ] || echo notok
notok

Shell脚本 (三) 条件判断 与 流程控制

  • 先执行 运算式,返回为true, 再执行 [ ] ,运算式为空,返回false ; 由于当前判断使用短路或,左边为false时,右边执行打印,结果为 notok

七、流程控制(重点)

1、 if 判断

1.1 基本语法

 if[ 条件判断式 ];then

    程序

 fi

 或者

 if [ 条件判断式 ]

   then

      程序

 fi

Shell脚本 (三) 条件判断 与 流程控制

注意事项:

(1) [ 条件判断式 ],中括号和条件判断式之间必须有空格

(2) if 后要有空格

1.2 案例实操

(1) 输入一个数字,如果是1,则输出 wenminzuimei,如果是2,则输出 cls zhenmei ,如果是其他,什么也不输出。

[root@rich datas]# touch if.sh
[root@rich datas]# vim if.sh #!/bin/bash
if [ $1 -eq 1 ];then
echo "wenmin zhen mei"
elif [ $1 -eq 2 ]
then
echo "cls zhen mei"
fi

Shell脚本 (三) 条件判断 与 流程控制

执行shell脚本:

[root@rich datas]# bash if.sh
if.sh: 第 2 行:[: -eq: 期待一元表达式
if.sh: 第 4 行:[: -eq: 期待一元表达式
[root@rich datas]# bash if.sh 1
wenmin zhen mei
[root@rich datas]# bash if.sh 2
cls zhen mei
[root@rich datas]# bash if.sh 3
[root@rich datas]#

Shell脚本 (三) 条件判断 与 流程控制

  • 有执行结果可知,在 if 条件判断式中,需输入对应的参数,不然无法返回结果;当输入参数 1 时, 返回的是 "-eq 1 "所对应的参数;当输入参数 2 时, 返回的是 "-eq 2 "所对应的参数;当输入参数 3 时, 没有对应的 if 条件,所以没有返回值。

2、 case 语句

2.1 基本语法

 case  $变量名 in

    “值 1”)

      如果变量的值等于值1,则执行程序 1

      ;;

    “值 2”)

      如果变量的值等于值2,则执行程序2

      ;;

    ...省略其他分支......

     *)
如果变量的值都不是以上的值,则执行此程序
;;
esac

Shell脚本 (三) 条件判断 与 流程控制

注意事项:

(1) case 行尾必须为单词“in”,每一个模式匹配必须以左括号“)”结束

(2)双分号 “;;”表示命令序列结束,相当于java中的break;

(3)最后的 “*)” 表示默认模式,相当于java中的default.

2.2 案例实操

(1) 输入一个数字,如果是1,则输出wenmin,如果是2,则输出 cls ,如果是其他,输出 danlian。

[root@rich datas]# touch case.sh
[root@rich datas]# vim case.sh #!/bin/bash case $1 in
1)
echo "wenmin"
;;
2)
echo "cls"
;;
*)
echo "danlian"
;;
esac

Shell脚本 (三) 条件判断 与 流程控制

执行 case.sh 脚本:

[root@rich datas]# bash case.sh 1
wenmin
[root@rich datas]# bash case.sh 2
cls
[root@rich datas]# bash case.sh 3
danlian
[root@rich datas]# bash case.sh 4
danlian

Shell脚本 (三) 条件判断 与 流程控制

输入参数为1,返回 “wenmin”;输入参数为2,返回“cls”;输入参数为3或其他,返回“danlian”.

3、for 循环

3.1 基本语法1

  for(( 初始值;循环控制条件;变量变化 ))

      do

        程序

      done

Shell脚本 (三) 条件判断 与 流程控制

3.2 案例实操

(1) 从1加到100

[root@rich datas]# touch for.sh
[root@rich datas]# vim for.sh #!/bin/bash s=0;
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done echo $s

Shell脚本 (三) 条件判断 与 流程控制

执行 for.sh 脚本

[root@rich datas]# bash for.sh
5050

Shell脚本 (三) 条件判断 与 流程控制

3.3 基本语法2

   for 变量 in 值 1 值 2 值 3 ....

      do

          程序

      done

Shell脚本 (三) 条件判断 与 流程控制

3.4 案例实操

(1)打印所有输入参数

[root@rich datas]# touch for2.sh
[root@rich datas]# vim for2.sh #!/bin/bash
#打印数字 for i in $*
do
echo "wenmin xihuan $i"
done

Shell脚本 (三) 条件判断 与 流程控制

[root@rich datas]# bash for2.sh mm
wenmin xihuan mm
[root@rich datas]# bash for2.sh mm cls
wenmin xihuan mm
wenmin xihuan cls
[root@rich datas]# bash for2.sh mm cls xuewen
wenmin xihuan mm
wenmin xihuan cls
wenmin xihuan xuewen

Shell脚本 (三) 条件判断 与 流程控制

  • 将所有参数一次一个的赋予 i  ,并逐个打印出来。

#!/bin/bash
#打印数字 for i in $*
do
echo "wenmin xihuan $i"
done for j in $@
do
echo "wenmin xihuan $j"
done
~

Shell脚本 (三) 条件判断 与 流程控制

[root@rich datas]# bash for2.sh mm cls xuewen shaopei
wenmin xihuan mm
wenmin xihuan cls
wenmin xihuan xuewen
wenmin xihuan shaopei
wenmin xihuan mm
wenmin xihuan cls
wenmin xihuan xuewen
wenmin xihuan shaopei

Shell脚本 (三) 条件判断 与 流程控制

  • 将所有参数一次一个的赋予 i 或 j ,并逐个打印出来。

#!/bin/bash
#打印数字 for i in "$*"
do
echo "wenmin xihuan $i"
done for j in "$@"
do
echo "wenmin xihuan $j"
done

Shell脚本 (三) 条件判断 与 流程控制

[root@rich datas]# bash for2.sh mm cls xuewen shaopei
wenmin xihuan mm cls xuewen shaopei
wenmin xihuan mm
wenmin xihuan cls
wenmin xihuan xuewen
wenmin xihuan shaopei

Shell脚本 (三) 条件判断 与 流程控制

  • “$*”将所有参数一次性赋予 i ,并一次性打印出来; “$@”将所有参数循环一次一个的赋予 j ,并逐个打印出来。

4、while 循环

4.1 基本语法

while [ 条件判断式 ]

    do

       程序

    done

Shell脚本 (三) 条件判断 与 流程控制

4.2 案例实操

(1) 从1 加到100

[root@rich datas]# touch while.sh
[root@rich datas]# vim while.sh #!/bin/bash s=0
i=1
while [ $i -le 100 ]
do
s=$[$s + $i]
i=$[$i + 1]
done

Shell脚本 (三) 条件判断 与 流程控制

脚本中,$i 代表的是变量的值;判断语句  “ [ ] ”需要加空格,算数表达式 “ [ ] ”不需要加空格。

执行脚

[root@rich datas]# bash while.sh
5050

Shell脚本 (三) 条件判断 与 流程控制