Table of Contents
循环语句1 :for语句:
for i in {1..10}
do
echo $i
done ###此时输出的是从1到10
for i in seq 1 2 10
do
echo $i
done ###从1到10输出间隔为2
for i in `ls /opt`
do
echo $i
done ###此时的i代表的是opt底下的目录
for i in `cat /testfile`
do
echo $i
done ###此时的i代表的是每一行输出
实验1 :创建一个脚本可以实现
编写脚本:
检验目标ip是不是开启机器的
脚本内容:
#################################
# Author: unn #
#Create_Date: 2019-03-09 #
#!/bin/bash
for i in `cat ipfile`
do
ping -w1 -c1 $i &>/dev/null
[ "$?" = "1" ]&&{
echo $i is up
}||{
echo $i is down
}
done
实验2:脚本目标:
实现倒计时给定数字的倒计时:
#!/bin/bash
[ -z $1 ]&&{
echo input errpr!
exit
}
clear
for ((SEC=$1;SEC>0;SEC--))
do
echo -n "After $SEC seconds down "
echo -ne "\r"
sleep 1
done
实验结果:
循环语句2:while true语句
用法举例:
#!/bin/bash
while true
do
read -p "Please in put a word:" WORD
while [ "$WORD" = "exit" ]
do
echo bye!
exit 0
done
echo $WORD
done
实验结果:
注:与while true相对应的还有until false语句此语句是在条件不成立的时候运行
实验3:
编写脚本目标:user_ctrl.sh 脚本实现的目标是:
脚本内容:
#!/bin/bash
while true
do
read -p "[C]reate [D]elete [E]xit
" ACTION
while [ "$ACTION" = "c" ]
do
read -p "Please input username :" USERNAME
id $USERNAME &>/dev/null &&{
echo "$USERNAME is exist"
break
}
read -p "Please input password :" PASSWD
useradd $USERNAME &>/dev/null
echo $PASSWD | passwd --stdin $USERNAME &>/dev/null
echo "$USERNAME was created!"
break
done
while [ "$ACTION" = "d" ]
do
read -p "Please input username :" USERNAME
id $USERNAME &>/dev/null ||{
echo "$USERNAME is not exist"
break
}
userdel -r $USERNAME
echo "$USERNAME was delete"
break
done
while [ "$ACTION" = "e" ]
do
echo "bye!"
exit
done
done
实验测试:
循环语句3:if语句:
if ...
then
elif
then
...
else
fi
用法示例:
#!/bin/bash while true do read -p "input key word:" WORD if [ $WORD = "a" ] then echo "apple" elif [ $WORD = "b" ] then echo "banana" else echo "input error" exit fi done
测试:
练习脚本:
目标要求:编辑一个脚本,可以检测目标文件属性
#!/bin/bash
[ -z $1 ]&&{
echo input error!
exit
}
[ -e $1 ]||{
echo target is not exist!
exit
}
if [ -L "$1" ]
then
echo target is a link!
elif [ -S "$1" ]
then
echo target is a socket!
elif [ -b "$1" ]
then
echo target is a block!
elif [ -d "$1" ]
then
echo target is a dir!
elif [ -c "$1" ]
then
echo target is a character!
elif [ -f "$1" ]
then
echo target is a file!
fi
测试:脚本可以正常运行。
脚本目标:从1:10秒开始的倒计时:
#!/bin/bash
MIN=1
SEC=10
for ((SEC;SEC>=0;SEC--))
do
if
[ "$SEC" -eq "0" -a "$MIN" -eq "0" ]
then
exit 0
elif
[ "$SEC" -eq "0" -a "$MIN" -ge "0" ]
then
echo $MIN:$SEC
SEC=59
((MIN--))
sleep 1
fi
echo $MIN:$SEC
sleep 1
done
运行结果:
这是运用if语句来写的倒计时的脚本,后面还会介绍用运算的方法写的倒计时的脚本。
shell语句应答语句:
在之前的知识中我们可以用EOF来进行自动输入动作:如下面的例子:
#!/bin/bash
passwd root <<EOF
redhat
redhat
EOF
运行的结果:
下面介绍的shell语句需要下载软件expect,此软件可以提供问答语句
yum install expect -y ###下载expect软件
用法示例:
两个脚本的结合:
脚本1:
#!/bin/bash
read -p "input ur name :" NAME
read -p "input ur age :" AGE
#read -p "input ur object :" OBJECT
read -p "input ur feel :" FEEL
echo "my name is $NAME $AGE years old study $OBJECT feel $FEEL"
脚本2:
#!/usr/bin/expect
spawn /mnt/ask.sh
expect "name"
send "sun\r"
expect "age"
send "20\r"
expect "object"
send "linux\r"
expect "feel"
send "happy\r"
expect eof
测试结果:
但是这是在我们提前知道问题内容的时候的操作,早不知道问题是不是2会出现的时候我们该怎么做呢?
当应答脚本编写如下的时候:
#!/usr/bin/expect
spawn /mnt/ask.sh ###此文件要有运行的权限
expect {
"name" {send "sun\r" ; exp_continue}
"age" { send "20\r";exp_continue}
"object" { send "linux\r";exp_continue}
"feel" { send "happy\r"}
}
expect eof
此时再次运行应答脚本的时候在遇到没有的问题的时候会跳过此个问题,换下一个问题:
练习脚本:
脚本目标自动连接目标主机并停留在目标主机的环境下:
脚本内容:
#!/usr/bin/expect
spawn ssh root@172.25.254.206
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "redhat\r" }
}
interact
注:interact表示的是停留在当前的交互环境中
脚本测试:
用for循环编辑脚本:
脚本目标,输出两个数的最大公约数和最小公倍数:
num1 = int(input('请输入要求的数1:'))
num2 = int(input('请输入要求的数2:'))
for i in range(1, min(num1, num2) + 1):
if num1 % i == 0 and num2 % i == 0:
gys=i
else:
continue
print('两个数的最大公约数是%d' % i)
print('最小公倍数是:%d' % ((num2 * num1) / i))
脚本测试: