文章目录
1.for (循环)
知道循环次数,先判断后执行
1.1 for语句格式
for 定义变量
do 使用变量,执行动作
done 结束标志
格式1:
#!/bin/bash
for I in 1 2 3
do
echo $I
done
格式2:
#!/bin/bash
for I in `seq 1 2 10`
do
echo $I
done
格式3:
for I in {1..5}
do
echo $I
done
格式4:
#!/bin/bash
for ((I=0;I<10;I++))
do
echo $I
done
1.2 脚本练习
check_host.sh
用此脚本检测10台与您当前主机直连主机是否网络通常
如果网络通常请显示主机的ip列表
方法一:
#!/bin/bash
for n in `seq 1 254`
do
IP="192.168.0.${n[@]}"
ping -c1 -w1 $IP &>/dev/null && {
echo $IP
}
done
方法二:
#!/bin/bash
for IP in {200..209}
do
ping -c1 -w1 192.168.0.$IP &>/dev/null
[ "$?" = "0" ]&& {
echo 192.168.0.$IP
}
done
2.while
先循环后判断,不知道循环次数
&&只做一次,while会循环做。
2.1 while语句格式
while ture 条件为真
do 条件成立所作循环动作
done
3.until
程序设计中的直到型循环,当不满足条件时循环,满足时跳出循环。
3.1 until语句格式
until false 条件为假
do 条件不成立所作循环动作
done
4.if
4.1 if语句格式
if
then
elif
then
...
else
fi
4.2 IF脚本练习
check_file.sh
please input filename: file
file is not exist
file is common file
file is direcory 此脚本会一直询问直到用户输入exit为止
方法一:函数脚本
CHECK()
{
read -p "Please input filename:" FILENAME
if [ "$FILENAME" = "exit" -o "$FILENAME" = "EXIT" ]
then
echo "Bye"
exit
elif [ ! -e "$FILENAME" ]
then
echo "$FILENAME is not exist."
elif [ -L "$FILENAME" ]
then
echo "$FILENAME is link."
elif [ -f "$FILENAME" ]
then
echo "$FILENAME is common file."
elif [ -d "$FILENAME" ]
then
echo "$FILENAME is directory."
elif [ -S "$FILENAME" ]
then
echo "$FILENAME is socket."
elif [ -b "$FILENAME" ]
then
echo "$FILENAME is block."
elif [ -c "$FILENAME" ]
then
echo "$FILENAME is char."
fi
CHECK
}
CHECK
方法二:while循环
方法三:函数嵌套
#!/bin/bash
CHECK_FILE()
{
if [ "$1" "$2" ]
then
echo $3
ACTION
fi
ACTION()
{
read -p "Please input filename:" FILENAME
if [ "$FILENAME" = "exit" -o "$FILENAME" = "EXIT" ]
then
echo "Bye"
exit
elif [ ! -e "$FILENAME" ]
then
echo "$FILENAME is not exist."
fi
CHECK_FILE -L $FILENAME "$FILENAME is linkfile."
CHECK_FILE -f $FILENAME "$FILENAME is common file."
CHECK_FILE -d $FILENAME "$FILENAME is directory."
CHECK_FILE -S $FILENAME "$FILENAME is socket."
CHECK_FILE -b $FILENAME "$FILENAME is block."
CHECK_FILE -c $FILENAME "$FILENAME is char."
ACTION
}
ACTION
}
5.case
5.1 CASE语句格式
case $1 in
word1|WORD1)
action1
;;
word2|WORD2)
action2
;;
*)
action3
esac
#!/bin/bash
case $1 in
red|RED)
echo "color"
;;
1|2|3)
echo "number"
;;
*)
echo error
esac
5.2 CASE练习
脚本练习
system_watch.sh disk memory upload (每秒显示)
disk 监控磁盘使用情况
memory 监控内存使用情况
upload 监控启动负载
#!/bin/bash
case $1 in
disk|DISK)
watch -n 1 df -h /
;;
mem|MEM)
watch -n 1 free -m
;;
upload|UPLOAD)
watch -n 1 uptime
;;
*)
echo "Error:Please input disk|mem|upload"
esac
6.expect(自动应答)
需要安装expect
dnf install expect -y
6.1 expect示例
问题脚本
#!/bin/bash
read -p "What's your name:" NAME
read -p "How old are you:" AGE
read -p "which objective:" OBJ
read -p "How are you feeling:" FEEL
echo $NAME is $AGE years old and $FEEL to learn $OBJ.
EOF应答脚本:必须完整回答
Expect应答脚本:可以检测问题关键字
1.多个expect
2.一个expect
3.设定expect中的变量
#!/usr/bin/expect
set timeout 1
set NAME [ lindex $argv 0 ] 设定变量
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 }
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"feeling" { send "$FEEL\r" } }
expect eof
6.2 expect脚本练习
auto_ssh 192.168.0.1 westos
可以自动连接目标主机当目标主机网络不通时报错
方法一:
#!/usr/bin/expect
set IP [ lindex $argv 0 ]
set PASS [ lindex $argv 1]
spawn ssh root@$IP
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$PASS\r"}
}
interact
方法二:
#!/bin/bash
AUTO_CMD()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 "$3"
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$2\r"}
}
expect eof
EOF
}
ping -c1 -w1 $1 &> /dev/null &&{
AUTO_CMD $1 $2 "$3"
}
7.break,continue,exit
contiue | 终止当此次前循环提前进入下个循环 |
---|---|
break | 终止当前所在语句所有动作进行语句外的其他动作 |
exit | 脚本退出 |