Skip to content

六、流程控制

1、if判断

1、基本语法

1、单分支

sh
if [ 条件判断式 ];then
	程序
fi

或者

sh
if [ 条件判断式 ]
then
	程序
fi

2、多分支

sh
if [ 条件判断式 ]
then
	程序
elif [ 条件判断式 ]
then
	程序
else
	程序
fi

注意事项:

  1. [ 条件判断式 ],中括号和条件判断式之间必须有空格
  2. if 后要有空格

2、案例实操

输入一个数字,如果是 1,则输出 banzhang zhen shuai,如果是 2,则输出 cls zhen mei,如果是其它,什么也不输出。

sh
#!/bin/bash
#By author xueqimiao
if [ $1 -eq 1 ]
then
       echo "banzhang zhen shuai"
elif [ $1 -eq 2 ]
then
       echo "cls zhen mei"
fi
[root@k8s-node shells]$ chmod 777 if.sh
[root@k8s-node shells]$ ./if.sh 1
banzhang zhen shuai

比较两个整数的大小

sh
#!/bin/bash
#By author xueqimiao
NUM=100
if (( $NUM > 4 )) ;then
	echo "The Num $NUM more than 4."
else
  echo "The Num $NUM less than 4."
fi

判断系统目录是否存在

sh
#!/bin/bash
# test DIR or Files
#By author xueqimiao
if [ ! -d /data/20140515 -a ! -d /tmp/2019/ ];then
	mkdir -p /data/20140515 
fi

多个条件测试分数判断

sh
#!/bin/bash
#By author xueqimiao 
scores=$1
if [[ $scores -eq 100 ]]; then
	echo "very good!";
elif [[ $scores -gt 85 ]]; then
	echo "good!";
elif [[ $scores -gt 60 ]]; then
	echo "pass!";
elif [[ $scores -lt 60 ]]; then 
	echo "no pass!"
fi

image-20220419150033478

2、case语句

1、基本语法

sh
case $变量名 in "值 1")
	如果变量的值等于值 1,则执行程序 1
;;
"值 2")
	如果变量的值等于值 2,则执行程序 2
;;
*) ...省略其他分支...
	如果变量的值都不是以上的值,则执行此程序
;;
esac

注意事项:

  1. case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  2. 双分号“;;”表示命令序列结束,相当于 java 中的 break。
  3. 最后的“*)”表示默认模式,相当于 java 中的 default。

2、案例实操

输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其它,输出renyao。

sh
[root@k8s-node shells]$ touch case.sh
[root@k8s-node shells]$ vim case.sh
!/bin/bash
case $1 in
"1")
       echo "banzhang"
;;
"2")
echo "cls" ;;
*)
       echo "renyao"
;;
esac
[root@k8s-node shells]$ chmod 777 case.sh
[root@k8s-node shells]$ ./case.sh 1
1

3、for循环

1、基本语法1

sh
for (( 初始值;循环控制条件;变量变化 )) do
	程序
done

2、案例实操

循环打印字符串

sh
#!/bin/bash
#By author xueqimiao
for website in www.baidu.com www.taobao.com www.qq.com
do
	echo $website
done

循环打印 1 至 100 数字,seq 表示列出数据范围

sh
#!/bin/bash
#By author xueqimiao 
for i in `seq 1 100` 
do
	echo "NUM is $i"
done

从1加到100

sh
[root@k8s-node shells]$ touch for1.sh
[root@k8s-node shells]$ vim for1.sh
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
       sum=$[$sum+$i]
done
echo $sum
[root@k8s-node shells]$ chmod 777 for1.sh
[root@k8s-node shells]$ ./for1.sh
5050

对系统日志文件进行分组打包

sh
#!/bin/bash
#By author xueqimiao
for i in `find /var/log -name*.log”` 
do
tar -czf 2019_log$i.tgz $i 
done

批量远程主机文件传输

sh
#!/bin/bash
#auto scp files for client 
#By author xueqimiao
for i in `seq 100 200`
do
	scp -r /tmp/test.txt root@192.168.1.$i:/data/webapps/www 
done

批量远程主机执行命令

sh
#!/bin/bash
#auto scp files for client
#By author xueqimiao
for i in `seq 100 200`
do
	ssh -l root 192.168.1.$i 'ls /tmp' 
done

循环打印 10 秒等待提示

sh
for ((j=0;j<=10;j++)) do
	echo -ne "\033[32m-\033[0m"
	sleep 1 
done
echo

3、基本语法2

sh
for 变量 in 值 12 值 3...
do
	程序
done

4、案例实操

打印所有输入参数

sh
[root@k8s-node shells]$ touch for2.sh
[root@k8s-node shells]$ vim for2.sh
#!/bin/bash #打印数字
for i in cls mly wls
do   echo "ban zhang love $i"
done
[root@k8s-node shells]$ chmod 777 for2.sh
[root@k8s-node shells]$ ./for2.sh
ban zhang love cls
ban zhang love mly
ban zhang love wls

比较$*和$@区别

$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 ...$n 的形式输出所有参数。

sh
[root@k8s-node shells]$ touch for3.sh
[root@k8s-node shells]$ vim for3.sh
#!/bin/bash
echo '=============$*============='
for i in $*
do echo "ban zhang love $i" done
echo '=============$@============='
for j in $@
do echo "ban zhang love $j" done
[root@k8s-node shells]$ chmod 777 for3.sh
[root@k8s-node shells]$ ./for3.sh cls mly wls
=============$*=============
banzhang love cls
banzhang love mly
banzhang love wls
=============$@=============
banzhang love cls
banzhang love mly
banzhang love wls

当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 ...$n”的形式输 出所有参数;$@会将各个参数分开,以“$1” “$2”...“$n”的形式输出所有参数。

sh
[root@k8s-node shells]$ vim for4.sh
#!/bin/bash
echo '=============$*============='
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个 for 循环只会循环一次 do
       echo "ban zhang love $i"
done
echo '=============$@============='
for j in "$@" #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do
       echo "ban zhang love $j"
done
[root@k8s-node shells]$ chmod 777 for4.sh
[root@k8s-node shells]$ ./for4.sh cls mly wls
=============$*=============
banzhang love cls mly wls
=============$@=============
banzhang love cls
banzhang love mly
banzhang love wls

4、while 循环

1、基本语法

sh
while [ 条件判断式 ] do
	程序
done

2、案例实操

从1加到100

sh
[root@k8s-node shells]$ touch while.sh
[root@k8s-node shells]$ vim while.sh
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
       sum=$[$sum+$i]
       i=$[$i+1]
done
echo $sum
[root@k8s-node shells]$ chmod 777 while.sh
[root@k8s-node shells]$ ./while.sh
5050