shell --常用语句

for 语句

格式

一般格式:

格式1:

 for((条件))
 do   
     动作
 done


格式2:

 for  变量名  in  范围
 do   
      动作
 done

例1:

输出10秒倒计时
vim y.sh
{
#!/bin/bash
  for SEC in {10..1}
  do
    echo -n "After ${SEC}s is end" 
    echo -ne "\r"
    sleep 1
  done
}

例2:

vim y1.sh
{
#!/bin/bash
        [ -e "/test/host_ip" ] &&{
        echo /test/host_ip is exist !!
        echo "[O]verwrite [B]ackup [S]kip"
        read -p "Please input your action: " WORD
        ACTTON=`echo $WORD | tr 'a-z' 'A-Z'`
        [ "$ACTTON" = "O" ] &&{
                rm -rf /test/host_ip
        }
        [ "$ACTTON" = "B" ] &&{
                mv /test/host_ip  /test/host_ip.bak
        }
        [ "$ACTTON" = "S" ] &&{
                exit 0
        }
}
for ip in {1..20}
do
        ping -c1 -w1 172.25.254.$ip &> /dev/null &&{
        echo  172.25.254.$ip >> /test/host_ip
}
done
}

while 语句

格式

一般格式:   

while  条件
do             ##满足条件则执行动作
    动作
done

vim w.sh
{
#!/bin/bash
while true
do
   read -p "Please input word:" WORD
   echo $WORD
done
}

嵌套循环

1. for循环的嵌套

for((条件))
do
     for((条件))
     do
         动作
     done
done


2.while循环的嵌套

while 条件
do
    while 条件
    do
           动作
    done
done

打印乘法口诀表

分析:乘法口诀表有9行9列,并且当前的行数等于当前的列数,即第1行有1个等式,第2行有2个等式;显示需要用到嵌套循环

方法1:

[root@localhost mnt]# vim 9*9.sh
#####################
for((i=1;i<=9;i++))
do
    for((j=1;j<=i;j++))
    do
    echo -n "$i*$j=$[$i*$j] "
    done
    echo -e "\n"           ##\n表示换行;注意:必须加-e解析
done

在这里插入图片描述

[root@localhost mnt]# sh 9*9.sh 

在这里插入图片描述
方法2:

[root@localhost mnt]# vim 9*9.sh
####################
for((i=1;i<=9;i++))
do
    for((j=1;j<=i;j++))
    do
    echo -ne "$i*$j=$[$i*$j]\t"        ##-t表示4个空格
    if                                 ##注意:if语句中的条件必须有空格才能生效
        [ $i = $j ]
    then
        echo -e "\n" 
    fi
    done
done

在这里插入图片描述

[root@localhost mnt]# sh 9*9.sh 

在这里插入图片描述

until 语句

vim u.sh
{
#!/bin/bash
until false
do
        read -p "Please input word: " WORD
        echo $WORD
done
}

例:

倒计时1分10秒
vim l.sh
{
#!/bin/bash
SEC=10
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
        while [ "$SEC" = "0" -a "$MIN" = "0" ]    #当分和秒都为0时退出
        do
                exit 0
        done

        while [ "$SEC" = "0" ]         #当秒为0时执行while语句中内容
        do
                echo -ne "After $MIN:$SEC is end !!"
                echo -ne "\r"
                sleep 1
                SEC=59        
                ((MIN--))              #当秒为59时分自减1
        done
        echo -ne "After $MIN:$SEC is end !!"
        echo -ne "\r"
        sleep 1
done
}

if 语句

格式

if语句的一般形式:

(1).单个条件

if  条件            
then  执行命令
fi
 
if  条件1
then  执行命令1
else  执行命令2
fi

(2).多个条件

if    条件1
then       执行命令1
elif  条件2
then       执行命令2
.....
else       执行命令3
fi

几种常见的退出方式:
  
   exit             ##退出当前脚本
   break            ##退出当前循环
   continue         ##提前退出当前循环,进入下一次循环

注意:eq不能用于比较字符串,比较字符串只能用 ==

例:
当输入   -a 时建立文件
        -d 时删除文件
	-p 时移动文件
输入其他时报错 : Please input -a | -d | -p fllowing filectrl.sh
vim filectrl.sh 
{
#!/bin/bash
CLO(){
       echo -e "\033[${1}m$2\033[0m"    
}            #设定颜色函数,方便调用

NAME(){      #设定函数用于循环

        read -p "Please input your action: " WORD
        if  [ "$WORD" = "-a"  ]     #判断输入是否为-a后执行-a的操作
        then
               read -p " Please input filename: " FILE
                [ -e "$FILE" ] &&{          
                        CLO  31  "$FILE is exit"     #判断所要建立的文件是否存在,存在时提醒文件已经存在
                }||
                {
                        touch $FILE
                        CLO 32 "$FILE touch successful "   
                }    #文件不存在时,建立文件,建立后提示文件建立成功
        elif [ "$WORD" = "-d" ]    #判断输入是否为-d后执行-d的操作
        then
                read -p "Please input delete filename: " FILE
                [ -e "$FILE" ]  &&{      #如果文件存在就执行删除命令,删除后提示删除成功
                        rm -rf  $FILE
                        CLO 32  "$FILE  is deleted  "
                }||
                {
                        
			CLO 31 "$FILE is not exit !!!"  #文件不存在提示文件不存在
                }
        elif [ "$WORD" = "-p" ]
        then
                read -p "Please input move filename: " FILE
                [ -e "$FILE" ] ||{
                        CLO 31 "$FILE is not exit !!!"
                }&&
                {
			mv  $FILE /mnt
                        CLO 32 "$FILE is moved"
                }    #文件存在执行复制命令,文件不存在提示文件不存在
        else
                        CLO 31 "Please input -a | -d | -p fllowing filectrl.sh"
                        exit 0   #输入的不是-a  -d  -p 会退出
        fi
        NAME
}
NAME
}

case 语句

格式

 case 变量名 in
           常量1)           ##可以用于判断多个条件;当常量1与变量名相同时,执行命令1,以此类推
           命令1
           ;;
           常量2)    
           命令2
 esac

if语句与case语句的区别

 if语句中的条件判断是从上到下顺序依次判断  
 case语句中的条件判断是同步的
例:
当输入   -a 时建立文件
        -d 时删除文件
	-p 时移动文件
输入其他时报错 : Please input -a | -d | -p fllowing filectrl.sh
vim case.sh
{
#!/bin/bash
Check_File()
{
        if [ -e "$1" ]
        then
                $2
                $3
        fi
}

if [ "$#" -lt "2" ]
then
        echo "Error:Please input option [-a|-p|-d] and filename following $0"
        exit 0
fi

case $1 in
        -a|a|-A|A)
        Check_File $2 "echo $2 is exist !!" exit
        touch $2
        ;;
        -d|d|-D|D)
        Check_File $2 "rm -rf $2" exit
        echo "$2 is not exis"
        ;;
        -p|p|-P|P)
        Check_File $2 "cp -rp $2 /mnt" exit
        echo "$2 is not exist"
        ;;
        *)
        echo "Please input -a|-d|-p following $0 !!"
esac
}

expect

例:
找出1-10号机中开着的主机,并将主机名 ip 存放到/mnt/host_list下
vim auto.sh
{
#!/bin/bash
Auto_Connect()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 $2
expect {
"yes/no" { send "yes\r" ; exp_continue }
"password" { send "westos\r"}
}
expect eof
EOF
}
for NUM in {1..10}
do
        ping -c1 -w1 172.25.254.$NUM &> /dev/null
        if [ "$?" = "0" ]
        then
          echo  "`Auto_Connect 172.25.254.$NUM hostname | tail -n 1`    A       172.25.254.$NUM">> /mnt/host_list
        fi
done
  sed  's/^M//g' -i /mnt/host_list

}   

^M  : ctrl+v  ctrl+M                                             
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值