shell脚本之for条件语句、case点名机制、if语句、while循环语句及export、exit、break、continue以及基本运算符号简介

for语句

条件成立执行指令

基本句式

for NUM in 1 2 3
for NUM in {1..3}
for NUM in `seq 1 3` 或 for NUM in `seq 1 2 10`
do
done

实验

[root@des mnt]# vim for.sh
###
for i in {1..10}
do
   echo $i
done

在这里插入图片描述

[root@des mnt]# sh for.sh 

在这里插入图片描述

for i in toy any tom
do
  echo $i
done
###输出1到10
[root@des mnt]# sh for.sh 

a=1
b=10
for i in `seq $a $b`
do
  echo $i
done
###输出1到10
[root@des mnt]# sh for.sh 

在这里插入图片描述
在这里插入图片描述

for ((i=1;i<10;i+=2))
do
    echo $i
done
###每两个取一值,直到数字9
[root@des mnt]# sh for.sh

在这里插入图片描述
在这里插入图片描述

for ((i=1;i<11;i++))
do

ping -c1 -w1 172.25.254.$i &> /dev/null     && echo yes || echo no

done
###检查172.25.254.1~172.25.254.10是否联通

在这里插入图片描述
在这里插入图片描述

while语句

执行循环语句

基本句式

while 条件
do
done

实验

[root@des mnt]# vim while.sh
###
#!/bin/bash
while true
do
        read -p "Please input world: " WORLD
        echo $WORLD
done
#####until与while作用相反(until false=while true)
until false
do
        read -p "Please input world: " WORLD
        echo $WORLD
done

在这里插入图片描述
在这里插入图片描述

[root@des mnt]# sh while.sh 
Please input world: 123
123
Please input world: echty
echty
Please input world: ^C
###不能自动停止

在这里插入图片描述
在这里插入图片描述

if语句

多项判断条件,某项条件成立则可执行相应指令

基本句式

开始
if 	###第一项判断条件
do	###第一项判断条件成立时执行的动作
elif	###第二项判断条件
then	###第二项判断条件成立时执行的动作
结束
else	###判断条件都不成立时执行的动作
fi	###结尾

实验

[root@des mnt]# vim if.sh

if  [ "$1" = westos   ]  ### 当输入为westos时输出westos
then
        echo westos
elif [ "$1" = linux  ]   ### 当输入为linux时输出为linux
then
        echo linux
elif [ "$1" = hello  ]   ###当输入为hello时输出为hi
then
        echo hi
else
        echo error       ###否则输出为error
fi

在这里插入图片描述

[root@des mnt]# sh if.sh 
[root@des mnt]# sh if.sh hello
[root@des mnt]# sh if.sh westos
[root@des mnt]# sh if.sh linux

在这里插入图片描述
实验:利用脚本添加文件中已有的用户,并将另一文件中对应行字符设为密码

[root@des ~]# vim if.sh
[root@des ~]# vim userfile   ###指定用户名文件
[root@des ~]# vim passwd	 ###指定用户密码(与用户名文件中用户一对一)
if [ $# -lt 2 ]
then
        echo "Erroe:please input two files following script!!!"
elif [ ! -e $1  ]
then
        echo "Error:$1 is not exist!"
elif [ ! -e $2  ]
then
        echo "Error:$2 is not exist!"
else
        NUM=`awk 'BEGIN{N=0}{N++}END{print N}' userfile`
        for I in `seq 1 $NUM`
        do
                USERNAME=`sed -n ${I}P userfile`
                PASSWD=`sed -n ${I}P passwdfile`
                getent passwd $USERFILE &> /dev/null
                if [ "$?" = "0" ]
                then
                        echo $USERNAME is exist
                else
                        useradd $USERNAME
                        echo $PASSWD | passwd --stdin $USERNAME > /dev/null
                fi
        done
fi

在这里插入图片描述
在这里插入图片描述
测试

[root@des ~]# sh if.sh 
[root@des ~]# sh if.sh user
[root@des ~]# sh if.sh user file
[root@des ~]# sh if.sh userfile file
[root@des ~]# sh if.sh userfile passwdfile

在这里插入图片描述

在这里插入图片描述

case语句

同if语句一样,为判断多项条件,某项条件成立则可执行相应指令,但case为横向执行,即指判断一次,速度更快

基本句式

case 变量 in
	linux|Linux|Linux)	###首位相符合的匹配条件
	echo westos		###匹配条件相和执行的动作
	;;			###分割符
	westos|WESTOS|Westos)	###次位相符合的匹配条件
	echo guo		###匹配次位条件相和执行的动作
	;;
	*)			###匹配条件不存在
	echo error		###不存在时的输出
esac				###结束

实验

[root@des mnt]# vim case.sh
case $1 in
        linux|LINUX|Linux)
        echo westos             
        ;;
        BAG|bag|Bag)
        echo 123
        ;;
        *)
        echo error              
esac

在这里插入图片描述

测试

[root@des mnt]# sh case.sh 
[root@des mnt]# sh case.sh bag
[root@des mnt]# sh case.sh LINUX

在这里插入图片描述
for语句与case语句
if 多次比较 判断条件
case 横向对比 点名

expect

自动应答命令用于交互式命令的自动执行

字符含义

spawn #expect中的监控程序,其运行后会监控命令提出的交互问题
send #发送问题给交互命令
"\r" #回车
exp_continue #标示问题不存在时继续回答下面的问题
expect eof #标示问题回答完毕退出expect环境
interact #标示问题回答完毕留在交互界面
set NAME [ index $argv n ] #定义变量

实验

安装export
[root@des mnt]# yum install expect

[root@des mnt]# vim ask.sh   		###设置需要回答的问题
[root@des mnt]# vim answer.exp  	###设置变量回答问题
[root@des mnt]# chmod +x answer.exp     ###给予执行条件
[root@des mnt]# ./answer.exp
[root@des mnt]# ./answer.exp guo 20 linux y

在这里插入图片描述
ask.sh

read -p "What's your name: " NAME   ##显示问题What's your name,要求输入NAME
read -p "How old are: "  AGE
read -p "Which object you study: " OBJ
read -p "Are you happy: "       FEEL
echo $NAME is $AGE\'s old study $OBJ feel $FEEL
###指定输入变量

[root@des mnt]# sh ask.sh 
###单独执行

在这里插入图片描述
answer.exp

#!/usr/bin/expect    		##指定执行为expect
set timeout 5			##5s不执行退出
set NAME [ lindex $argv 0 ]	##第一个变量在为搜索匹配到NAME的问题答案
set AGE [ lindex $argv 1 ]	##第二个变量在为搜索匹配到AGE的问题答案
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn sh /mnt/ask.sh		##搜索问题的指定文件
expect {
        "name" { send "$NAME\r" ; exp_continue }   ##指定问题的回答方式,并继续
        "old" { send "$AGE\r" ; exp_continue }
        "object" { send "$OBJ\r" ; exp_continue }
        "happy" { send "$FEEL\r" }		   ##无继续执行指令
}
interact					   ##完成后依然留在交互界面

在这里插入图片描述
在这里插入图片描述
实验二
链接172.25.254.{1…10}并报告其主机名

Auto_SSH()
{
/usr/bin/expect <<-EOF
spawn ssh root@$1 hostname
expect {
"yes/no" { send "yes\r" ; exp_continue }
"password" { send "westos\r" }
}
expect eof
EOF
}

for IP in {1..10}
do
	ping -c1 -w1 172.25.254.$IP &> /dev/null
	if [ "$?" = "0" ]
	then
	Auto_SSH 172.25.254.$IP | tail -n 1
	fi
done 

exit、break及continue

exit n 脚本退出,退出值为n
break 退出当前循化
continue 提前结束循环内部的命令,但不终止循环

实验

[root@des mnt]# vim wesd.sh
#!/bin/bash
for i in {1..10}
do
        if [ "$i" = "5" ]
        then
                echo lucky number
        fi 
        echo $i
done
[root@des mnt]# sh wesd.sh 

在这里插入图片描述

[root@des mnt]# vim wesd.sh
#!/bin/bash
for i in {1..10}
do
        if [ "$i" = "5" ]
        then
                echo lucky number
                exit 0
        fi
        echo $i
done
echo end
[root@des mnt]# sh wesd.sh 

在这里插入图片描述
在这里插入图片描述

#!/bin/bash
for i in {1..10}
do
        if [ "$i" = "5" ]
        then
                echo lucky number
                break
        fi
        echo $i
done
echo end

在这里插入图片描述
在这里插入图片描述

#!/bin/bash
for i in {1..10}
do
        if [ "$i" = "5" ]
        then
                echo lucky number
                continue
        fi
                echo $i
done
echo end

在这里插入图片描述
在这里插入图片描述

运算

运算方式及运算符号

运算符号             意义
+,-               加法,减法
*,/,%            乘法,除法,取余
**                 幂运算
++,--             自增加,自减少
<,<=,>,>=          比较符号
=,+=,-=,*=,/=,%=   赋值运算

运算操作与运算命令 含义

(())                  用与整数运算
let                   用与整数运算,与(())类似
expr                  用于整数运算,功能相对较多
bc                    linux下的计算器,适合整数及小数运算
$[]            	      用户整数运算
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值