(shell篇)shell的循环语句+应答语句

Table of Contents

循环语句1  :for语句:

循环语句2:while true语

循环语句3:if语句:

shell语句应答语句:

循环语句1  :for语句:

for i in {1..10}

do

     echo  $i  

done              ###此时输出的是从1到10

 

for i in seq 1 2 10

do

      echo $i

done     ###从1到10输出间隔为2
for i in `ls /opt`

do

     echo $i

done     ###此时的i代表的是opt底下的目录
for i in `cat /testfile`

do

   echo $i

done   ###此时的i代表的是每一行输出

实验1 :创建一个脚本可以实现

编写脚本:

检验目标ip是不是开启机器的

脚本内容:

#################################
# Author:   unn                 #
#Create_Date:   2019-03-09      #
#!/bin/bash
for i in `cat ipfile`
do
ping -w1 -c1 $i &>/dev/null
[ "$?" = "1" ]&&{
echo $i is up
}||{
echo $i is down
}
 
done

实验2:脚本目标:

实现倒计时给定数字的倒计时:

#!/bin/bash
[ -z $1 ]&&{
    echo input errpr!
    exit
}
clear
for ((SEC=$1;SEC>0;SEC--))
do
    echo -n "After $SEC seconds down  "
    echo -ne "\r"
    sleep 1
done

实验结果:

循环语句2:while true语句

用法举例:

#!/bin/bash
while true
do
        read -p "Please in put a word:" WORD
        while [ "$WORD" = "exit" ]
        do
                echo bye!
                exit 0
        done
        echo $WORD
done

实验结果:

注:与while true相对应的还有until false语句此语句是在条件不成立的时候运行

实验3:

编写脚本目标:user_ctrl.sh 脚本实现的目标是:

脚本内容:
 

#!/bin/bash
while true
do
read -p "[C]reate  [D]elete [E]xit
" ACTION
    while [ "$ACTION" = "c" ]
    do
    read -p "Please input username :" USERNAME
    id $USERNAME &>/dev/null &&{
    echo     "$USERNAME is exist"
    break
    }
    read -p "Please input password :" PASSWD
    useradd $USERNAME &>/dev/null
    echo $PASSWD | passwd --stdin $USERNAME &>/dev/null
    echo "$USERNAME was created!"
    break
    done

    while [ "$ACTION" = "d" ]
    do
    read -p "Please input username :" USERNAME
     id $USERNAME &>/dev/null ||{
        echo    "$USERNAME is not exist"
        break
        }
    userdel -r $USERNAME
    echo "$USERNAME was delete"
    break
    done

    while [ "$ACTION" = "e" ]
    do
    echo "bye!"
    exit
    done
done

实验测试:

循环语句3:if语句:

if ...
then
elif
then
...
else
fi

用法示例:

#!/bin/bash
while true
do
        read -p "input key word:" WORD
        if [ $WORD = "a" ]
        then
                echo "apple" 
        elif [ $WORD = "b" ]
        then
                echo "banana"
        else
                echo "input error"
                exit
        fi
done

测试:

练习脚本:

目标要求:编辑一个脚本,可以检测目标文件属性

#!/bin/bash
[ -z $1 ]&&{
        echo input error!
        exit
}
[ -e $1 ]||{
        echo target is not exist!
        exit
}
        if [ -L "$1" ]
        then
        echo target is a link!
        elif [ -S "$1" ]
        then
        echo target is a socket!
        elif [ -b "$1" ]
        then
        echo target is a block!
        elif [ -d "$1" ]
        then
        echo target is a dir!
        elif [ -c "$1" ]
        then
        echo target is a character!
        elif [ -f "$1" ]
        then
        echo target is a file!
        fi

测试:脚本可以正常运行。

脚本目标:从1:10秒开始的倒计时:

#!/bin/bash
MIN=1
SEC=10
for ((SEC;SEC>=0;SEC--))
do
        if
                [ "$SEC" -eq "0" -a "$MIN" -eq "0" ]
        then
                exit 0
        elif
                [ "$SEC" -eq "0" -a "$MIN" -ge "0" ]
        then
                echo $MIN:$SEC
                SEC=59
                ((MIN--))
                sleep 1
        fi
        echo $MIN:$SEC
        sleep 1 
done

运行结果:

这是运用if语句来写的倒计时的脚本,后面还会介绍用运算的方法写的倒计时的脚本。

shell语句应答语句:

在之前的知识中我们可以用EOF来进行自动输入动作:如下面的例子:

#!/bin/bash
passwd root <<EOF
redhat
redhat
EOF

运行的结果:

下面介绍的shell语句需要下载软件expect,此软件可以提供问答语句

yum install expect -y    ###下载expect软件

用法示例:

两个脚本的结合:

脚本1:

#!/bin/bash
read -p "input ur name :" NAME
read -p "input ur age :" AGE
#read -p "input ur object :" OBJECT
read -p "input ur feel :" FEEL
echo "my name is $NAME $AGE years old study $OBJECT feel $FEEL"

脚本2:

#!/usr/bin/expect
spawn /mnt/ask.sh
expect "name"
send "sun\r"
expect "age"
send "20\r"
expect "object"
send "linux\r"
expect "feel"
send "happy\r"
expect eof

测试结果:

但是这是在我们提前知道问题内容的时候的操作,早不知道问题是不是2会出现的时候我们该怎么做呢?
当应答脚本编写如下的时候:

#!/usr/bin/expect
spawn /mnt/ask.sh                 ###此文件要有运行的权限
expect {
        "name" {send "sun\r" ; exp_continue}  
          "age" { send "20\r";exp_continue}
        "object" { send "linux\r";exp_continue}
        "feel" { send "happy\r"}
}
expect eof

此时再次运行应答脚本的时候在遇到没有的问题的时候会跳过此个问题,换下一个问题:

练习脚本:

脚本目标自动连接目标主机并停留在目标主机的环境下:

脚本内容:

#!/usr/bin/expect
spawn ssh root@172.25.254.206
expect {
        "yes/no" { send "yes\r";exp_continue }
        "password"   { send "redhat\r" }
}
interact

注:interact表示的是停留在当前的交互环境中


脚本测试:

用for循环编辑脚本:

脚本目标,输出两个数的最大公约数和最小公倍数:

num1 = int(input('请输入要求的数1:'))
num2 = int(input('请输入要求的数2:'))
for i in range(1, min(num1, num2) + 1):
    if num1 % i == 0 and num2 % i == 0:
        gys=i
    else:
        continue
print('两个数的最大公约数是%d' % i)
print('最小公倍数是:%d' % ((num2 * num1) / i))

脚本测试:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值