格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
...
*)
esac
100分优秀 70 分良好 60 分不及格
[root@localhost ~]# vi pinghost.sh
read -p "请输入(0-100) 成绩: " score
case $score in
8[5-9]|9[0-9]|100)
echo "成绩优秀"
;;
7[0-9]|8[0-4])
echo "成绩良好"
;;
6[0-9])
echo "成绩不合格"
;;
*)
echo "成绩不合格"
esac
读取不同的变量值,用来逐个执行同一组命令
语句结构
for 变量名 in 取值列表
do
命令序列
done
批量添加用户,密码为123456
[root@localhost opt]# vim name.txt.sh
zhangsan
lisi
wanwu
[root@localhost opt]# vim user.sh
#!/bin/bash
list=$( cat /root/4.txt ) 这里格式$( 要连一起 =$连一起
for add in $list
do
useradd $add
echo "123123" | passwd --stdin $add
echo "创建成功{user} "
done
批量删除用户
[root@localhost opt]# vim user.sh
#!/bin/bash
list=$(cat /root/4.txt)
for add in $list
do
userdel -r $add &>/dev/null
done
查看主机状态
[root@localhost opt]# vim 1.txt
192.168.100.1
192.168.100.2
192.168.100.3
[root@localhost opt]# vim ping.sh
#!/bin/bash
name=$(cat /root/1.txt)
for ip in $name
do
ping -c 3 -i 0.2 -w 3 $ip > /dev/null
if [ $? -eq 0 ];then
echo "${ip} is up"
else
echo "${ip} is down"
fi
done
[root@localhost opt]# vim ping.sh
Host 192.168.197.1 is up
Host 192.168.197.2 is up
Host 192.168.197.3 is down
-c:发送三个包
-i: 发包间隔0.2秒
-W:等待时间3秒
$?最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误
查看主机状态第二种方法
[root@localhost opt]# vim ipchk.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
ping -c 3 -i 0.2 -W 3 "192.168.197.$i" &> /dev/null
if [ $? -eq 0 ]
then
echo "Host 192.168.197.$i is up"
else
echo "Host 192.168.197.$i is down"
fi
done
[root@localhost opt]# ./ipchk.sh
Host 192.168.197.1 is up
Host 192.168.197.2 is up
Host 192.168.197.3 is down
Host 192.168.197.4 is down
Host 192.168.197.5 is down
Host 192.168.197.6 is down
Host 192.168.197.7 is down
Host 192.168.197.8 is down
Host 192.168.197.9 is down
Host 192.168.197.10 is down
1
[root@192 ~]# vi 6.txt.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo $i
done
2
#!/bin/bash
i=1
for ((;i<=10;i++))
do
echo "$i"
done
3
#!/bin/bash
i=1
for ((;i<=10;))
do
echo "$i"
let i++
done
4
#!/bin/bash
i=1
for ((;;))
do
if [ $i -le 10 ]
then
echo "$i"
let i++
else
exit 0
fi
done
计算偶数的和
[root@192 ~]# vi 6.txt.sh
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
do
let sum+=$i
done
echo "总和为:$sum"
计算奇数的和
[root@192 ~]# vi 6.txt.sh
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
do
let sum+=$i
done
echo "总和为:$sum"
求偶数和
[root@192 ~]# vi 6.txt.sh
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
do
if [ `expr $i % 2` -eq 0 ]
then
let sum+=$i
fi
done
echo "总和为:$sum"
求奇数和
[root@192 ~]# vi 6.txt.sh
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
do
if [ `expr $i % 2` -eq 1 ]
then
let sum+=$i
fi
done
echo "总和为:$sum"
语句结构
while 条件测试操作
do
命令序列
done
使用while循环语句输出1-10数字
[root@192 ~]# vi 6.txt.sh
#!/bin/sbin
i=1
while [ $i -le 20 ]
do
echo $i
let i++
done
#!/bin/bash
i=0
while [ $i -le 19 ]
do
let i++
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
echo "stu$i添加成功"
done
echo "添加完毕"
显示出1-10不能被3整除的数
[root@localhost opt]# vim count1.sh
#!/bin/bash
i=1
while [ $i -le 10 ]
do
if [ `expr $i % 3` -ne 0 ];then
echo "$i"
fi
let i++
done
[root@localhost opt]# sh count1.sh
1
2
4
5
7
8
10
echo -n 不换行输出
echo -e 处理特殊字符
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
第一种方法
#!/bin/bash
for ((k=1;k<=9;k++))
do
for ((i=1;i<=$k;i++))
do
echo -n ""$k"x"$i"=$(expr $k \* $i) "
if [ $i -eq $k ]
then
echo -e '\n'
fi
done
done
第二种方法
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((k=1;k<=i;k++))
do
echo -ne "${i}x${k}=$[$i*$k]\t"
done
echo ""
done
[root@zhang .ssh]# sh zhang5.sh
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
先输出正三角
#!/bin/bash
for ((i=1;i<=5;i++))
do
for ((j=1;j<=i;j++))
do
echo -n "#"
done
echo ""
done
~
[root@promote ~]# sh 6.txt.sh
#
##
###
####
#####
在输出倒三角
#!/bin/bash
for ((i=1;i<=5;i++))
do
for ((k=5;k>=i;k--))
do
echo -n "#"
done
echo ""
done
~
[root@promote ~]# sh 6.txt.sh
#####
####
###
##
#
#!/bin/bash
for ((i=1;i<=5;i++))
do
for ((k=5;k>=i;k--))
do
echo -n " "
done
for ((j=1;j<=$i*2-1;j++))
do
echo -n "*"
done
echo ""
done
[root@promote ~]# sh 6.txt.sh
*
***
*****
*******
*********
echo -n 不换行输出
重复测试某个条件,只要条件不成立则反复执行
until 条件测试操作
do
命令序列
done
*until小于等于20
#!/bin/bash
i=1
while [ $i -le 20 ]
do
echo $i
let i++
done
[root@192 ~]# sh abn.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
while true
do
read -p "输入yes退出;" keyi
if [ $keyi = yes ]
then
break
fi
done
echo "退出成功"
[root@192 ~]# sh b.sh
输入yes退出;no
输入yes退出;12
输入yes退出;yes
退出成功
创建20个用户名为com密码为123456创建20个用户密码为123456
#!/bin/bash
name="com"
i=1
while [ $i -le 20 ]
do
useradd ${name}${i}
echo "123456" | passwd --stdin ${name}${i}
let i++
done
[root@192 ~]# sh 1.sh
更改用户 com1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 com2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 com3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 com4 的密码 。
passwd:所有的身份验证令牌已经成功更新。
.
.
.
更改用户 com20 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@192 ~]# vim 1.sh
100中没有3的倍数
#!/bin/bash
i=100
while [ $i -gt 0 ]
do
if [ `expr $i % 3` -eq 0 ];then
let i--
continue
else
echo $i
fi
let i--
done
~
石头剪刀布实验
[root@localhost opt]# vim four.sh
#!/bin/bash
#name=four
#This is a game!
echo "石头=1、剪刀=2、布=3"
read -p "请随机输入1或2或3:" num1
num=$(($RANDOM%3 + 1))
if [ $num1 -ge 1 ] && [ $num1 -le 3 ];then
if [ $num -eq 1 ] && [ $num1 -eq 3 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 1 ] && [ $num1 -eq 2 ];then
echo "你输了,不要灰心"
elif [ $num -eq 2 ] && [ $num1 -eq 1 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 2 ] && [ $num1 -eq 3 ];then
echo "你输了,不要灰心"
elif [ $num -eq 3 ] && [ $num1 -eq 2 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 3 ] && [ $num1 -eq 1 ];then
echo "你输了,不要灰心"
else
echo "平局,再来"
fi
else
echo "你违规了"
fi
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:2
你输了,不要灰心
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:1
恭喜哦,你赢了
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:3
恭喜哦,你赢了
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:4
你违规了
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
1、break命令允许跳出所有循环(终止执行后面的所有循环)。结束并退出循环。
2、continue不会跳出所有循环,仅仅跳出当前循环,转而进入下一轮循环。
3、exit
退出脚本,
常带一个整数给系统,如 exit 0
为指定用户发送消息,若用户不在线(未登录系统),则每5秒钟试一次,直到用户登录系统后再发送在线消息,用户名与消息通过位置参数传递给脚本
给指定用户发送在线消息
$# 添加到Shell的参数个数
`basename $0`值显示当前脚本或命令的名字
exit 是用来结束一个程序的执行的,而return只是用来从一个函数中返回。
exit 1 的时候,一般是出错定义这个1,也可以是其他数字,很多系统程序这个错误编号是有约定的含义的。 但不为0就表示程序运行出错。调用环境就可以根据这个返回值判断 你这个程序运行是否ok。
#!/bin/bash
username=$1
if [ $# -lt 1 ];then
echo " zhang: `basename $0 ` [ < message > ] "
exit 1
fi
[root@localhost ~]# echo $?
1
[root@localhost ~]# sh 20.sh tanger asdj
[root@localhost ~]# echo $?
0
---------------------------------------------------------
验证是否属于系统用户
if grep "^$username" /etc/passwd > /dev/null;then :
else
echo "not user "
exit 2
fi
~
^脱字符 模式位于文本首行开始
---------------------------------------------------------
测试用户是否在线,如何不在线,每5s联系一次
until who | grep "$username" > /dev/num;do
echo "user no login "
sleep 5
done
[root@localhost ~]# ./20.sh tange
[root@localhost ~]# vim 20.sh
[root@localhost ~]# ./20.sh zhang
user no login
user no login
[root@localhost ~]# echo "hollo" | write tange
n
echo " zhang: `basename $0 ` [ < message > ] "
exit 1
fi
[root@localhost ~]# echo $?
1
[root@localhost ~]# sh 20.sh tanger asdj
[root@localhost ~]# echo $?
0
---------------------------------------------------------
验证是否属于系统用户
if grep "^$username" /etc/passwd > /dev/null;then :
else
echo "not user "
exit 2
fi
~
^脱字符 模式位于文本首行开始
---------------------------------------------------------
测试用户是否在线,如何不在线,每5s联系一次
until who | grep "$username" > /dev/num;do
echo "user no login "
sleep 5
done
[root@localhost ~]# ./20.sh tange
[root@localhost ~]# vim 20.sh
[root@localhost ~]# ./20.sh zhang
user no login
user no login
[root@localhost ~]# echo "hollo" | write tange