SHELL03 - 循环结构 shell字体颜色 case语句、函数中断控制

一、循环结构

让特定代码重复执行

1.for循环

1)特点:循环的次数是固定的!

2)语法结构及特点

for  变量    in   值1    值2   …

do 

    命令

done

for    ((i=1;i<10;i++))               /另一种写法

do

  命令

done

###########################

seq  1  5   =   seq  5  =  echo  {1..5}    默认起始位置为1

seq  1  2  5  --输出1  3 5 ,第一个1为起始位置   中间的2为步长  第三个5为结束位置 

###########################

3)应用

# 输出3个chenguiz             / 或  `seq 3`    或 {1..3}

for  i  in  1 2 3 

do 

echo "chenguiz"

done

###########################

快速创建1000个文件

for  i  in  {1..1000}

do 

touch /tmp/$i .txt

done

###########################

#读取用户文件,自动创建用户,初始密码为123456

for i in $(cat /root/user.txt)

do

id $i &>/dev/null

if [ $? -ne 0 ];then

        useradd $i

        echo "123456" | passwd --stdin  $i &>/dev/null

        echo "$i 用户创建成功!"

else

        echo "$i 用户已存在" >> /root/user.log

fi

done

###########################

#拼网段,分开导出以便查看

for  i in {113..119}

do

ping -c 2  -i0.1 -W1 172.40.55.$i  &>/dev/null     (-c:发送的包个数  -i:发送每个数据包之间的间隔  -W:等待响应的时间)

if  [ $? -eq 0 ];then

echo  "172.40.55.$i   is up !"  >>/root/up.log

else 

echo  "172.40.55.$i   is down !" >>/root/down.log

fi

done

###########################

Shell输出颜色控制:
文字颜色30-37:
echo -e "\033[30m 黑色字 \033[0m" 
echo -e "\033[31m 红色字 \033[0m" 
echo -e "\033[32m 绿色字 \033[0m" 
echo -e "\033[33m 黄色字 \033[0m" 
echo -e "\033[34m 蓝色字 \033[0m" 
echo -e "\033[35m 紫色字 \033[0m" 
echo -e "\033[36m 天蓝字 \033[0m" 
echo -e "\033[37m 白色字 \033[0m"


背景颜色40-47
echo -e "\033[40;37m 黑底白字 \033[0m" 
echo -e "\033[41;37m 红底白字 \033[0m" 
echo -e "\033[42;37m 绿底白字 \033[0m" 
echo -e "\033[43;37m 黄底白字 \033[0m" 
echo -e "\033[44;37m 蓝底白字 \033[0m" 
echo -e "\033[45;37m 紫底白字 \033[0m" 
echo -e "\033[46;37m 天蓝底白字 \033[0m" 
echo -e "\033[47;30m 白底黑字 \033[0m"

末尾控制选项:
\33[0m 关闭所有属性
\33[1m 设置高亮度 
\33[4m 下划线 
\33[5m 闪烁 
\33[7m 反显 
\33[8m 消隐 
\33[30m — \33[37m 设置前景色 
\33[40m — \33[47m 设置背景色 
\33[nA 光标上移n行 
\33[nB 光标下移n行 
\33[nC 光标右移n行 
\33[nD 光标左移n行 
\33[y;xH设置光标位置 
\33[2J 清屏 
\33[K 清除从光标到行尾的内容 
\33[s 保存光标位置 
\33[u 恢复光标位置 
\33[?25l 隐藏光标 
\33[?25h 显示光标

2.while循环

1)特点:不定次数,当判断为真时,一直循环执行;判断为假,则循环结束。

    四循环的缺点:超耗内存,需sleep   0.1

2)结构

while   [ 判断 ]

do

   命令

done

while  :        /死循环固定格式   加冒号

do 

  命令

done

###########################

3)应用

#循环10次

i=1

while [ $i -le 10 ]

do

        echo "你好!"

        i=$[i+1]        或let  i++                 /循环10次

done

###########################

#无限猜

num=$[RANDOM%100+1]                   /随机数取100的余数(0-99)加1-100

i=0            /先定义次数的变量              

while :

do

        read -p "有个随机数,你来猜猜看:"  cai

        let i++                                           /每猜一次加一

        if [ $cai  -eq $num ];then

          echo "恭喜你,猜对了!共猜了$i 次。"

          exit                                            /猜对并退出

        elif [ $cai -gt $num ];then

          echo "猜大了"

        else

          echo "猜小了"

        fi

done

###########################

打印一个9*9乘法表

难点:不换行  echo  -n   “2*1=2”   ;echo  -n   “2*2=4” 

         for i  in   `seq  9`              for  j  in   `seq  9`

          echo “$i*$j=$[i*j]”

#!/bin/bash

for  i in `seq  9`       

do 

for j in  `seq  $i`            /$ij永远小于等于i

do

   echo  -n "$i*$j=$[i*j]   "         /引号最后留个空格以隔开        

done

echo            /里面执行完后换行

done

###########################

二、服务脚本设计

1.case分支结构

1)case 语句 【简单的if:只能执行等于的值,判断等于和不等于】

case   变量   in

1)                

    命令;;          /命令结束用双分号

2

    命令;;

*

    命令;;        /最后一个值的双分号可加可不加

esac

###########################

当运行/root/foo.sh redhat,输出为fedora ;当运行/root/foo.sh fedora,输出为redhat ;当没有任何参数或者参数不是 redhat 或者 fedora时,其错误输出产生以下信息: /root/foo.sh redhat|fedora 

#!/bin/bash

case  $1   in

readhat)  

echo  “nihao”          /命令未完不用分号

echo  “fedora”;;       /命令结束用双分号

fedora)

echo “readhat”;;

*)

echo '/root/foo.sh redhat|fedora ';;

esac

###########################

创建选项

#!/bin/bash

case  $1  in

-t)

touch  $2;;

-c)

cat  $2;;

-e)

vim  $2;;

-d)

rm  -rf   $2;;

*)

echo  “用法:test.sh [-t|-c|-e|-d]文件

esac

###########################

read -p  “请输入任意:”   key

case   $key    in 

[a-z])                   /case的优势,支持[ ] 

echo  “字母;;

[0-9])

echo  “数字;;

*

echo  “其他字符;;

esac

 

三、函数及中断控制

1.shell函数

1)定义函数(脚本执行完就失效):   

函数名() {  命令序列 }      或  function    函数名 命令序列 }

2)调用函数

     # chen(){ mkdir -p $1; cd  $1; pwd; }           /定义

     #chen   /mnt/chen         /调用

###########################

定义函数 

.(){ .|.& }   /&放入后台,一直执行本身,死循环,耗光内存瞬间死机

###########################

定义颜色的函数,方便调用

cecho(){  echo  -e  “\033[$1m  $2  \033[0m” }

cecho  32  ok

cecho  33  nihao


2.中断及退出

1) break:中断整个循环

   continue:中断本次循环,进入下一次循环

   exit:结束整个脚本 =kill,默认返回是0

  # ssh  172.40.55.$i  “poweroff”    /直接把$i关机

###########################

for  i  in  {1..10}

do

[  $i  -eq  5 ]  &&  break         /break显示到4之后就执行GameOver

echo  $1                                   /continue跳过5显示所有

done                                                  /exit  显示到4就结束整个脚本

echo  “Game  Over !” 

###########################

从键盘循环取整数(0结束)并求和,输出最终结果

sum=0

while  :

do

read  -p  “请输入待累加的整数:”  num          / 键盘循环取整数

[ $num  -eq  0  ]  &&  break          / 0结束

sum=$[ sum + num ]                /求和

done

echo “总和是:$sum ”

###########################

跳过1~20以内非6的倍数,输出其他数的平方值,设定退出代码为

for  i   in   {1..20}            /1~20以内

do

        [  $[i%6]  -ne  0  ]  &&  continue         /6的倍数

        echo   $[i*i]            / 输出其他数的平方值

done

exit 2          / 设定退出代码为2

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

练习题:

1 编写uaddfor.sh脚本,根据用户名列表快速添加用户账号。

需要添加的账号名称保存在/root/users.txt文件中,每行一个用户名。要求在执行uaddfor.sh脚本后,能够为这些用户名快速添加好系统账号,并将登录密码设置为1234567。
#!/bin/bash
if [ $# -eq 0 ];then
        echo "please input fileName"
        exit 1
elif [ ! -f $1 ];then
        echo "input file is not found" 
        exit 2
fi
for username in $(cat $1)
do
        id $username &> /dev/null
        if [ $? -eq 0 ];then
                echo "$username has exit"
        else
                useradd $username
                echo 1234567 | passwd --stdin $username
        fi
done

2 编写sumwhile脚本,计算从1-100之间所有整数的和。
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
        sum=$[sum+i]
        let i++
done
echo $sum

3 简述Linux服务脚本中的case分支结构。
case分支结构就是开关结构
当匹配上了给出的条件;就执行相应的程序,然后不会再往下执行
#!/bin/bash
#use case program :
#       when you input redhat the output is fedora
#       when you input fedora the output is redhat
case $1 in
redhat)
        echo "fedora";;
fedora)
        echo "redhat";;
*)
        echo "your input is not redhat or fedora"

esac

4 简述定义一个Shell函数的两种方法。
function 函数名{
}
函数名(){

}

5 简述Shell环境常见的中断及退出控制指令。
continue :跳出本轮循环,并不会跳出整个循环体
break:  跳出循环体,执行循环体后面的语句
exit :  退出脚本,默认返回值是0

猜你喜欢

转载自blog.csdn.net/qq_36441027/article/details/80085409
今日推荐