条件成立执行指令 |
基本句式
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 条件
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 ###第一项判断条件
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
同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 横向对比 点名
自动应答命令用于交互式命令的自动执行 |
字符含义
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
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
###单独执行
#!/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 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下的计算器,适合整数及小数运算
$[] 用户整数运算