Appearance
六、流程控制
1、if判断
1、基本语法
1、单分支
sh
if [ 条件判断式 ];then
程序
fi
或者
sh
if [ 条件判断式 ]
then
程序
fi
2、多分支
sh
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
- [ 条件判断式 ],中括号和条件判断式之间必须有空格
- 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
2、case语句
1、基本语法
sh
case $变量名 in "值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
*) ...省略其他分支...
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
- case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于 java 中的 break。
- 最后的“*)”表示默认模式,相当于 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 值 1 值 2 值 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