for
for | 定义变量 |
---|---|
do | 使用变量,执行动作 |
done | 结束标志 |
- 格式1:
#!/bin/bash
for WESTOS in `seq 2 2 10`
do
echo $WESTOS
done
注:中间的2代表的步,每隔两位输出2到10的一个数
-
格式2:
for WESTOS in 1 2 3
do
echo $WESTOS
done
-
格式3:
for WESTOS in {10…1}
do
echo $WESTOS
done
注:正序或者逆序显示
- 格式4:
for ((WESTOS=0;WESTOS<10;WESTOS++))
do
echo $WESTOS
done
w
hile
书写格式:
while ture #条件为真
do
#条件成立所作循环动作
done
until
书写格式:
until false ##条件为假
do
#条件不成立所作循环动作
done
注: while和until语句的true或者false可以写成其他判定语句
if
书写格式:
if 条件1
then
#条件1成立时所做的命令
elif 条件2
then
#条件2成立所做的命令
...
else
#上述条件都不成立时所做的命令
fi
脚本练习:
需求:当执行check_file.sh这个脚本时;会询问你想要查询的文件名字,判断该文件是什么类型的文件,知道输入的是exit时会退出
#!/bin/bash
while true
do
read -p "Please input filename: " FILE
if [ -z "$FILE" ]
then
echo -e "\033[31mError:Please input correct filename\033[0m"
elif [ "$FILE" = "exit" ]
then
exit
elif [ ! -e "$FILE" ]
then
echo -e "\033[31mError:$FILE is not exist\033[0m"
elif [ -L "$FILE" ]
then
echo -e "\033[32m$FILE is soft link\033[0m"
elif [ -f "$FILE" ]
then
echo -e "\033[32m$FILE is a file\033[0m"
elif [ -d "$FILE" ]
then
echo -e "\033[32m$FILE is directory\033[0m"
elif [ -S "$FILE" ]
then
echo -e "\033[32m$FILE is socket\033[0m"
elif [ -c "$FILE" ]
then
echo -e "\033[32m$FILE is character device\033[0m"
elif [ -b "$FILE" ]
then
echo -e "\033[32m$FILE is Block device\033[0m"
else
echo -e "\033[31mError:Unknown file type\033[0m"
fi
done
测试:
case
书写格式:
case $1 in
word1|WORD1) #输入的命令是word1或者WORD1时执行action1动作
action1
;;
word2|WORD2) #输入的命令是word2或者WORD2时执行action1动作
action2
;;
*) #输入的命令不是上述的所有命令时执行action3动作
action3
esac
注:case和if的区别:if 是从上到下一次判定,而case是先匹配输入的命令在执行符合该条件的动作
脚本练习:
需求:当执行system_watch.sh 脚本时,后面跟disk memory upload其中的一个时:
(每秒显示)
- disk 监控磁盘使用情况
- memory 监控内存使用情况
- upload 监控启动负载
#!/bin/bash
case $1 in
disk|DISK)
watch -tn 1 df -H
;;
memory|MEMORY)
watch -tn 1 free -m
;;
upload|UPLOAD)
watch -tn 1 uptime
;;
*)
echo -e "\033[31mError:Please input correct options!!\033[0m"
esac
expect
dnf install expect -y
-
问题脚本
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
-
应答脚本
vim /mnt/answer.exp
#!/usr/bin/expect set timeout 1 #设置遇到没有的反应时间为1s 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 } "ok" { send "$FEEL\r" } } expect eof
测试:
chmod +x /mnt/ask.sh
参数:interact 代表拥有交互的shell
break,continue,exit
contiue | 终止当此次前循环提前进入下个循环 |
---|---|
break | 终止当前所在语句所有动作进行语句外的其他动作 |
exit | 脚本退出 |