shell之case和循环语句(case语句的格式与举例)(for循环,while循环until循环语句的详解和continue,break解释, 九九乘法口诀表 ,等腰三角形)

shell编程之case语句与循环语句(for,while)

case多分支语句

格式:
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	...
*)
esac


case语句的实例

100分优秀 70 分良好 60 分不及格

[root@localhost ~]# vi pinghost.sh 
read -p "请输入(0-100) 成绩: " score
case $score in
 8[5-9]|9[0-9]|100)
    echo "成绩优秀"
  ;;
 7[0-9]|8[0-4])
     echo "成绩良好"
  ;;
 6[0-9])
     echo "成绩不合格"
  ;;
*)
    echo "成绩不合格"   
 esac

使用for循环语句

读取不同的变量值,用来逐个执行同一组命令

语句结构
for 变量名 in 取值列表
do
	命令序列
done

mark

for语句实例

批量添加用户,密码为123456

[root@localhost opt]# vim name.txt.sh
zhangsan 
lisi 
wanwu
[root@localhost opt]# vim user.sh
#!/bin/bash
list=$( cat /root/4.txt )  这里格式$( 要连一起 =$连一起
for add in $list
 do
   useradd $add
  echo "123123" | passwd --stdin $add
  echo "创建成功{user} "
 done

批量删除用户

[root@localhost opt]# vim user.sh
#!/bin/bash
list=$(cat /root/4.txt)
for add in $list
 do
   userdel -r  $add &>/dev/null
 done

查看主机状态

[root@localhost opt]# vim 1.txt
192.168.100.1
192.168.100.2
192.168.100.3
[root@localhost opt]# vim ping.sh 
#!/bin/bash
name=$(cat /root/1.txt)
 for ip in $name
do
  ping -c 3 -i 0.2 -w 3 $ip > /dev/null
if [ $? -eq 0 ];then
    echo "${ip} is up"
  else
    echo   "${ip} is down"
fi
done
[root@localhost opt]# vim ping.sh 
Host 192.168.197.1 is up
Host 192.168.197.2 is up
Host 192.168.197.3 is down
-c:发送三个包
-i: 发包间隔0.2秒
-W:等待时间3秒
$?最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误

查看主机状态第二种方法

[root@localhost opt]# vim ipchk.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do
  ping -c 3 -i 0.2 -W 3 "192.168.197.$i" &> /dev/null
  if [ $? -eq 0 ]
        then
        echo "Host 192.168.197.$i is up"
  else
        echo "Host 192.168.197.$i is down"
  fi
done
[root@localhost opt]# ./ipchk.sh 
Host 192.168.197.1 is up
Host 192.168.197.2 is up
Host 192.168.197.3 is down
Host 192.168.197.4 is down
Host 192.168.197.5 is down
Host 192.168.197.6 is down
Host 192.168.197.7 is down
Host 192.168.197.8 is down
Host 192.168.197.9 is down
Host 192.168.197.10 is down

用循环语句输出1-10的数字的五种办法

1

[root@192 ~]# vi 6.txt.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do
  echo $i
done

2

#!/bin/bash
i=1
for ((;i<=10;i++))
do
        echo "$i"
done


3

#!/bin/bash
i=1
for ((;i<=10;))
do
        echo "$i"
        let i++
done


4

#!/bin/bash
i=1
for ((;;))
do
  if [ $i -le 10 ]
        then
        echo "$i"
        let i++
  else
        exit 0
  fi
done


计算偶数/奇数的和

计算偶数的和

[root@192 ~]# vi 6.txt.sh 
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
  do
        let sum+=$i
  done
        echo "总和为:$sum"


计算奇数的和

[root@192 ~]# vi 6.txt.sh 
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
  do
        let sum+=$i
  done
        echo "总和为:$sum"

求偶数和

[root@192 ~]# vi 6.txt.sh 
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
  do
        if [ `expr $i % 2` -eq 0 ]
         then
           let sum+=$i
        fi
  done
        echo "总和为:$sum"


求奇数和

[root@192 ~]# vi 6.txt.sh 
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
  do
        if [ `expr $i % 2` -eq 1 ]
         then
           let sum+=$i
        fi
  done
        echo "总和为:$sum"

while循环语句

语句结构
while 条件测试操作
do
	命令序列
done

mark

使用while循环语句输出1-10数字

[root@192 ~]# vi 6.txt.sh 
#!/bin/sbin
i=1
while [ $i -le 20 ]
  do
   echo $i
   let i++
done

使用while批量添加用户

#!/bin/bash
i=0
while [ $i -le 19 ]
do
  let i++
  useradd stu$i
  echo "123456" | passwd --stdin stu$i &> /dev/null
  echo "stu$i添加成功"
done
echo "添加完毕"

显示出1-10不能被3整除的数

[root@localhost opt]# vim count1.sh
#!/bin/bash
i=1
while [ $i -le 10 ] 
do
  if [ `expr $i % 3` -ne 0 ];then
  echo "$i"
  fi
  let i++
done
[root@localhost opt]# sh count1.sh 
1
2
4
5
7
8
10

九九乘法表(2种方法)

echo -n 不换行输出

echo -e 处理特殊字符

\a 发出警告声;

\b 删除前一个字符; 

\c 最后不加上换行符号; 

\f 换行但光标仍旧停留在原来的位置; 

\n 换行且光标移至行首; 

\r 光标移至行首,但不换行; 

\t 插入tab; 

\v 与\f相同; 

\ 插入\字符; 

\nnn 插入nnn(八进制)所代表的ASCII字符;

第一种方法

#!/bin/bash
for ((k=1;k<=9;k++))
do
 for ((i=1;i<=$k;i++))
 do
  echo -n ""$k"x"$i"=$(expr $k \* $i)  "
  if [ $i -eq $k ]
        then
        echo -e '\n'
  fi
 done
done


第二种方法

#!/bin/bash
   for ((i=1;i<=9;i++))
    do
     for ((k=1;k<=i;k++))
       do
       echo -ne "${i}x${k}=$[$i*$k]\t"
      done
   echo ""
    done
[root@zhang .ssh]# sh zhang5.sh
1x1=1  

2x1=2  2x2=4  

3x1=3  3x2=6  3x3=9  

4x1=4  4x2=8  4x3=12  4x4=16  

5x1=5  5x2=10  5x3=15  5x4=20  5x5=25  

6x1=6  6x2=12  6x3=18  6x4=24  6x5=30  6x6=36  

7x1=7  7x2=14  7x3=21  7x4=28  7x5=35  7x6=42  7x7=49  

8x1=8  8x2=16  8x3=24  8x4=32  8x5=40  8x6=48  8x7=56  8x8=64  


三角形(直角,到三角,等腰)

先输出正三角

#!/bin/bash
for ((i=1;i<=5;i++))
do
   for ((j=1;j<=i;j++))
   do
   echo -n "#"
   done
   echo ""
done
~      
[root@promote ~]# sh 6.txt.sh
#
##
###
####
#####             

在输出倒三角

#!/bin/bash
for ((i=1;i<=5;i++))
do
   for ((k=5;k>=i;k--))
   do
   echo -n "#"
   done
   echo "" 
done
~     
[root@promote ~]# sh 6.txt.sh
#####
####
###
##
#

等腰三角形

#!/bin/bash
for ((i=1;i<=5;i++))
do
   for ((k=5;k>=i;k--))
   do
     echo -n " "
   done
      for ((j=1;j<=$i*2-1;j++))
      do
        echo -n "*"
      done
    echo ""
done
[root@promote ~]# sh 6.txt.sh
     *
    ***
   *****
  *******
 *********
echo -n 不换行输出

untill循环语句

重复测试某个条件,只要条件不成立则反复执行

until 条件测试操作
do
 命令序列
done

mark

案例

*until小于等于20


#!/bin/bash
i=1
while [ $i -le 20 ]
do
    echo $i
    let i++
done
[root@192 ~]# sh abn.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

while死循环

#!/bin/bash
while true
do
  read -p "输入yes退出;" keyi
   if [ $keyi = yes ]
      then
      break
   fi
done
echo "退出成功" 
[root@192 ~]# sh b.sh
输入yes退出;no
输入yes退出;12
输入yes退出;yes
退出成功

案例2

创建20个用户名为com密码为123456创建20个用户密码为123456

#!/bin/bash
name="com"
i=1
while [ $i -le 20 ]
do
  useradd ${name}${i}
  echo "123456" | passwd --stdin ${name}${i}
  let i++
done
[root@192 ~]# sh 1.sh
更改用户 com1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 com2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 com3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 com4 的密码 。
passwd:所有的身份验证令牌已经成功更新。
.
.
.

更改用户 com20 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@192 ~]# vim 1.sh

案例3

100中没有3的倍数

#!/bin/bash
i=100
while [ $i -gt 0 ]
do
 if [ `expr $i % 3` -eq 0 ];then
    let i--
    continue
  else
      echo $i
  fi
   let i--
done
~     

通过变量RANDOM获得随机数

石头剪刀布实验

[root@localhost opt]# vim four.sh 
#!/bin/bash
#name=four
#This is a game!

echo "石头=1、剪刀=2、布=3"
read -p "请随机输入1或2或3:" num1
num=$(($RANDOM%3 + 1))
if [ $num1 -ge 1 ] && [ $num1 -le 3 ];then
  if [ $num -eq 1 ] && [ $num1 -eq 3 ];then
   echo "恭喜哦,你赢了"
  elif [ $num -eq 1 ] && [ $num1 -eq 2 ];then
   echo "你输了,不要灰心"
  elif [ $num -eq 2 ] && [ $num1 -eq 1 ];then
   echo "恭喜哦,你赢了"
  elif [ $num -eq 2 ] && [ $num1 -eq 3 ];then
   echo "你输了,不要灰心"
  elif [ $num -eq 3 ] && [ $num1 -eq 2 ];then
   echo "恭喜哦,你赢了"
  elif [ $num -eq 3 ] && [ $num1 -eq 1 ];then
   echo "你输了,不要灰心"
  else
   echo "平局,再来"
  fi
else
 echo "你违规了"
fi
[root@localhost opt]# sh four.sh 
石头=1、剪刀=2、布=3
请随机输入1或2或3:2
你输了,不要灰心
[root@localhost opt]# sh four.sh 
石头=1、剪刀=2、布=3
请随机输入1或2或3:1
恭喜哦,你赢了
[root@localhost opt]# sh four.sh 
石头=1、剪刀=2、布=3
请随机输入1或2或3:3
恭喜哦,你赢了
[root@localhost opt]# sh four.sh 
石头=1、剪刀=2、布=3
请随机输入1或2或3:4
你违规了


continue和break,exit区别

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

1、break命令允许跳出所有循环(终止执行后面的所有循环)。结束并退出循环。

2、continue不会跳出所有循环,仅仅跳出当前循环,转而进入下一轮循环。

3、exit
退出脚本,
常带一个整数给系统,如 exit 0

给指定用户发送消息

为指定用户发送消息,若用户不在线(未登录系统),则每5秒钟试一次,直到用户登录系统后再发送在线消息,用户名与消息通过位置参数传递给脚本

给指定用户发送在线消息
$# 添加到Shell的参数个数
`basename $0`值显示当前脚本或命令的名字
exit  是用来结束一个程序的执行的,而return只是用来从一个函数中返回。
 exit 1 的时候,一般是出错定义这个1,也可以是其他数字,很多系统程序这个错误编号是有约定的含义的。 但不为0就表示程序运行出错。调用环境就可以根据这个返回值判断 你这个程序运行是否ok。

#!/bin/bash
username=$1
  if [ $# -lt 1 ];then
    echo " zhang: `basename $0 ` <username > [ < message > ]  " 
       exit 1
   fi           

[root@localhost ~]# echo $?
1
[root@localhost ~]# sh 20.sh tanger asdj
[root@localhost ~]# echo $?
0
---------------------------------------------------------
验证是否属于系统用户
 if grep "^$username" /etc/passwd > /dev/null;then :
   else
    echo "not user "
  exit 2
fi
~
^脱字符     模式位于文本首行开始
---------------------------------------------------------

测试用户是否在线,如何不在线,每5s联系一次
  until who | grep "$username" > /dev/num;do
   echo "user no login "
sleep 5
 done
[root@localhost ~]# ./20.sh tange
[root@localhost ~]# vim 20.sh 
[root@localhost ~]# ./20.sh zhang
user no login 
user no login 

[root@localhost ~]# echo "hollo" | write tange

n
    echo " zhang: `basename $0 ` <username > [ < message > ]  " 
       exit 1
   fi           

[root@localhost ~]# echo $?
1
[root@localhost ~]# sh 20.sh tanger asdj
[root@localhost ~]# echo $?
0
---------------------------------------------------------
验证是否属于系统用户
 if grep "^$username" /etc/passwd > /dev/null;then :
   else
    echo "not user "
  exit 2
fi
~
^脱字符     模式位于文本首行开始
---------------------------------------------------------

测试用户是否在线,如何不在线,每5s联系一次
  until who | grep "$username" > /dev/num;do
   echo "user no login "
sleep 5
 done
[root@localhost ~]# ./20.sh tange
[root@localhost ~]# vim 20.sh 
[root@localhost ~]# ./20.sh zhang
user no login 
user no login 

[root@localhost ~]# echo "hollo" | write tange


猜你喜欢

转载自blog.csdn.net/weixin_47151717/article/details/107582977
今日推荐