shell语句
一、for语句
1.for语句格式
for i in {1..10} | `seq 1 3 10` (步距为3,即每个3执行命令)
do
echo $i
sleep 1 ##执行命令后休眠时间为1s
done
2.编写脚本check_host检查1-10的主机是否可达
[[email protected] ost]# vim check_host2.sh
#!/bin/bash
for IP in {1..10}
do
ping -c1 -w1 172.25.254.$IP &> /dev/null && echo 172.25.254.$IP is up
done
3.编写脚本create_user自动建立userfile的用户
[[email protected] mnt]# vim create_user2.sh
#!/bin/bash
for i in `cat $1`
do
useradd $i
done
[[email protected] ost]# touch userfile
[[email protected] ost]# vim userfile
[[email protected] ost]# cat userfile
user7
[[email protected] ost]# su - user7
[[email protected] ~]$
4.编写build_user.sh脚本将/ost/userfile与/ost/passwdfile一一对应,建立
[[email protected] ost]# vim userfile
user1
user2
user3
[[email protected] ost]# vim passfile
123
123
123
[[email protected] ost]# vim build_user.sh
[[email protected] ost]# sh build_user.sh
1 #!/bin/bash
2 n=`awk 'BEGIN{N=0}{N++}END{print N}' /ost/userfile`
3 for Num in `seq 1 "$n"`
4 do
5 User_name=`sed -n ""$Num"p" /ost/userfile`
6 Passwd=`sed -n ""$Num"p" /ost/passfile`
7 useradd $User_name
8 echo $Passwd | passwd --stdin $User_name
9 done
5.编写脚本time.sh实现10s倒计时
[[email protected] ost]# vim time.sh
[[email protected]undation77 ost]# sh time.sh
1 #!/bin/bash
2 for Second in {10..1}
3 do
4 echo -n "after $Second's is end "
5 echo -ne "\r\r"
6 sleep 1
7 done
二、while语句
1.编写脚本Use.sh,当根分区内存使用量超过80%时,每隔10s生成警告日志
1 #!/bin/bash
2 Use_Memory=`df | awk -F " " '/\/$/{print $5}' | cut -d "%" -f 1`
3 while [ $Use_Memory -gt "80" ]
4 do
5 echo "Permissive: Ues_Memory of root directory overflows 80%" >> /var/log/messages
6 sleep 10
7 done
或者
1 #!/bin/bash
2 while true
3 do
4 Use_Memory=`df | awk -F " " '/\/$/{print $5}' | cut -d "%" -f 1`
5 [ $Use_Memory -gt "80" ] && {
6 echo "Permissive: Ues_Memory of root directory overflows 80% " >> /var/log/messages
7 }
8 sleep 10
9 done
三、if语句
1.编写脚本User_create.sh,当文件个数不符合要求或者文件不存在时报错
复杂型:
1 #!/bin/bash
2 if
3 [ $# -eq 2 ]
4 then
5 [ -e $1 ] && {
6 [ -e $2 ] && {
7 n=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
8 for Num in `seq 1 "$n"`
9 do
10 User_name=`sed -n ""$Num"p" $1`
11 Passwd=`sed -n ""$Num"p" $2`
12 useradd $User_name
13 echo $Passwd | passwd --stdin $User_name
14 done }
15 } || echo Error!!
16 else
17 echo Error!!
18 fi
简单型
19 if [ $# -lt 2]
20 then
21 echo Error:please input a user file and a passwd file !!
22 elif [ ! -e $1 ]
23 then
24 echo Error:$1 is not exist!!
25 elif [ ! -e $2 ]
26 then
27 echo Error:$2 is not exist!!
28 else
29 n=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
30 for Num in `seq 1 "$n"`
31 do
32 User_name=`sed -n ""$Num"p" $1`
33 Passwd=`sed -n ""$Num"p" $2`
34 useradd $User_name
35 echo $Passwd | passwd --stdin $User_name
36 done
37 fi
2.编写脚本test.sh,当输入cat时,输出dog;输入dog时,输出cat;其他则报错
1 #!/bin/bash
2 if [ "$1" = cat ]
3 then
4 echo dog
5 elif [ "$1" = dog ]
6 then
7 echo cat
8 else
9 echo Error:please input cat or dog after script!
10 fi
四、case语句
case语句横向同时比较,效率优于if语句
1.编写脚本service_ctrl.sh,当输入命令时,对httpd服务做不同操作
1 #!/bin/bash
2 case $1 in
3 start)
4 systemctl start httpd
5 ;;
6 port)
7 netstat -antuple | grep httpd
8 ;;
9 stop)
10 systemctl stop httpd
11 ;;
12 *)
13 echo Error:$1 is not found!
14 esac
五、expect语句
####注意:需要安装expect服务#####
expect:自动应答脚本,具备自己的运行环境;针对某一脚本,自动输出结果
1.编写脚本passwd.exp,自动修改root用户密码
查看相关命令的脚本:
[[email protected] mnt]# which passwd
/bin/passwd
[[email protected] mnt]# which expect
/bin/expect
编写脚本:
[[email protected] mnt]# cat passwd.exp
#!/bin/expect
spawn /bin/passwd ##监控脚本
expect "New"
send "123\r"
expect "Retype"
send "123\r"
expect eof
2.编写脚本ssh.exp,自动链接指定主机
1 #!/bin/expect
2 set IP [ lindex $argv 0 ]
3 set PASSWD [ lindex $argv 1 ]
4 spawn ssh [email protected]$IP
5 expect {
6 "yes/no" { send "yes\r"; exp_continue}
7 "password" { send "$PASSWD\r" }
8 }
9 interact
10 #expect eof
实验链接主机:
[[email protected] mnt]# expect ssh.exp 172.25.254.10 westos
spawn ssh [email protected]
[email protected]'s password:
Last login: Wed May 16 14:36:07 2018 from 172.25.254.200
3.编写脚本check_host.sh,输出1-10网络通的主机名
六、脚本语句控制器
exit
break
continue
七、倒计时
编写脚本1:10倒计时