脚本中语句的执行顺序(从上到下)
1.for语句
为循环执行动作
for语句结构
for 定义变量
do 使用变量,执行动作
done 结束标志
for语句的基本格式
格式1:
#!/bin/bash
for WESTOS in {1..10} 1-10连续选择
do
echo $WESTOS
done
格式2:
for WESTOS in `seq 1 2 10` 用命令执行结果赋予for的变量 2表示显示间隔为2
do
echo $WESTOS
done
格式3:
for NAME in westos linux lee NAME:变量 in + 变量的值
do
id $NAME &> /dev/null && {
echo $NAME is exist 利用变量操作任务,有多少变量就会重复多少次
}||{
echo $NAME is not exist
}
sleep 1 使for语句每1秒循环一次
done
2.条件语句
while...do语句
作用: 条件为真执行动作
while ture <!--条件为真-->
do <!--条件成立所作循环动作-->
done <!--结束-->
until...do 语句
作用: 条件为假执行动作
until false <!--条件为假-->
do <!--条件不成立所作循环动作-->
done <!--结束-->
if...then...elif...then...else...fi 语句
作用: 多次判定条件执行动作
代码结构
`if` <!--首次判断定-->
`then` <!--条件成立执行动作-->
`elif` <!--当首次判定不成立时再次判定-->
`then` <!--条件成立执行动作-->
`...` <!--elif可以书写多次-->
`else` <!--所有条件不成立执行动作-->
`fi` <!--结束-->
l练习:
check_file.sh
please input filename: file
file is not exist
file is file
file is direcory
此脚本会一直询问直到用户输入exit为止
5.case
此方法为直接判断,哪条成立就执行,不同于if的逐条询问判断
case $1 in 输入内容判断
word1|WORD1) 判断条件
action1 条件成立执行语句action1
;; 下一条
word2|WORD2)
action2
;;
*) 都不符合,执行语句action3
action3
esac 结束
6.expect 安装expect服务
问题文件:
vim /mnt/ask.sh
#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE
read -p "Which objective: " OBJ
read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK
问题回答:
>直接回答:
#!/bin/bash
/mnt/817/ask.sh <<EOF 输入重定向,此方式在应对交互式问题时非常机械,不能正确判定问题的准确性
lee
18
linux
happy
EOF
>应答脚本:
vim /mnt/answer.sh
#!/bin/bash
set timeout 1 超时时间设定为1秒
set NAME [ lindex $argv 0 ] expect命令后第一串字符
set AGE [ lindex $argv 1 ] 第二串
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh
expect {
"name" { send "$NAME\r";exp_continue } exp_continue:继续解答下一个问题
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" } 最后一个问题必须存在,问题顺序没有要求
}
expect eof 1.问题回答完毕后退出expect
2.interact 回答完毕后保留expect环境(参数二选一)exprct answer.exp lee 18 linux ok 解答问题
练习
输入ip判断是否ping通并获取hostname:
#!/bin/bash
Auto_Ssh(){
/usr/bin/expect <<EOF
spawn ssh -l root $1 hostname
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "westos\r" }
}
expect eof
EOF
}
[ -z "$1" ] && {
echo "Please input check ipaddress !! "
exit
}
ping -c1 -w1 $1 &> /dev/null && {
Auto_Ssh $1 | tail -n 1
}||{
echo $1 is down
}
7.break,continue,exit
contiue ##终止当此次前循环提前进入下个循环
break ##终止当前所在语句所有动作进行语句外的其他动作
exit ##脚本退出
echo $? 显示退出值,退出值为0表示没有任何报错,退出值为非0白哦呵斯有相应的报错
退出值范围为 0~255 exit 300 指定超出范围显示错误
练习
用户的检测及添加删除:
#!/bin/bash
USER_CTRL()
{
read -p "Please input username: " USER
if [ "$USER" = "exit" ]
then
break
else
id $USER &> /dev/null &&{
case $1 in
add)
echo "$USER is exist !!"
USER_CTRL add
;;
del)
userdel -r $USER
esac
}||{
case $1 in
add)
read -p "Please input password: " PASS
useradd $USER
echo $PASS | passwd --stdin $USER
;;
del)
echo "$USER is not exist !!"
USER_CTRL del
esac
}
fi
}
while true
do
read -p "Please input action: " ACTION
case $ACTION in
exit)
exit
;;
add)
USER_CTRL add
;;
del)
USER_CTRL del
;;
*)
echo wrong action
esac
done