for var in {list}
do
done
for var in var1 var2 var3
do
done
for((expr1;expr2;expr3))
do
done
for var
do
done
until expr [] (())
do
done
while expr [] (())
do
done
随机数:
bash中默认有一个变量 RANDOM 范围0~32767 set|grep RANDOM
echo $RANDOM
产生0~1之间的随机数
echo $[$RANDOM%2]
产生0~2之间的随机数
echo $[$RANDOM%3]
....
产生0~9之间的随机数
echo $[$RANDOM%10]
产生0~100之间的随机数
echo $[$RANDOM%101]
产生50~100之间的随机数
echo $[$RANDOM%51+50]
产生三位随机数
echo $[$RANDOM%900+100]
demo1:写一个脚本,产生一个phonenum.txt,文件中以139开头的1000个电话号码。
#!/bin/bash
for i in `seq 1000`
do
n1=$[$RANDOM%10]
n2=$[$RANDOM%10]
n3=$[$RANDOM%10]
n4=$[$RANDOM%10]
n5=$[$RANDOM%10]
n6=$[$RANDOM%10]
n7=$[$RANDOM%10]
n8=$[$RANDOM%10]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >>phonenum.txt
done
demo2:从上面的文件中,随机抽出5位幸运观众,幸运观众只显示前三位和后四位,中间用*代替
方法一:每个幸运观众不限制次数
#!/bin/bash
file=phonenum.txt
for i in `seq 5`
do
line=`cat $file|wc -l`
luckline=$[$RANDOM%$line+1]
lucknum=`head -$luckline $file|tail -1`
echo "幸运观众为:${lucknum:0:3}****${lucknum:7:4}"
done
方法二:抽取出一次就删掉
#!/bin/bash
file=phonenum.txt
for i in `seq 5`
do
line=`cat $file|wc -l`
luckline=$[$RANDOM%$line+1]
lucknum=`head -$luckline $file|tail -1`
sed -i "/$lucknum/d" $file
echo "幸运观众为:${lucknum:0:3}****${lucknum:7:4}"
done
嵌套循环:
1
12
123
1234
12345
for循环:
for y in {1..5}
do
for((x=1;$x<=$y;x++))
do
echo -n $x
done
echo
done
for ((y=1;y<=5;y++))
do
for((x=1;$x<=$y;x++))
do
echo -n $x
done
echo
done
#!/bin/bash
y=1
while [ $y -le 5 ]
do
x=1
while [ $x -le $y ]
do
echo -n $x
let x++
done
echo
let y++
done
y=1
until (( $y > 5 ))
do
x=1
until (( $x > $y ))
do
echo -n $x
let x++
done
echo
let y++
done
课堂练习:
打印
5
54
543
5432
54321
打印乘法口诀表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
case 打印菜单 使用case选择
语法:
case var in 定义变量
pattern1) 模式1)模式中可以用|分割代表或or
command... 需要执行的命令
;;
pattern2)
command2.
;;
*) default,默认情况下
command3
;;
esac
demo1:当给程序传递start时,提示service is running;stop时,提示service stoped;reload|restart,提示service restart...
vim case1.sh
#!/bin/bash
case $1 in
start)
echo "service is running..."
;;
stop)
echo "service stoped"
;;
reload|restart)
echo "service restart...."
;;
*)
echo "usage:`basename $0` [start|stop|reload|restart]"
;;
esac
demo2:
vim case2.sh
#!/bin/bash
read -p "你到底爱不爱我?(爱、喜欢、不爱):" love
case $love in
"爱")
echo "我也爱你,哈哈哈"
;;
"喜欢")
echo "这样啊,喜欢是深爱的前提"
;;
"不爱")
read -p "啊!!那你到底爱谁?" who
case $who in
"小红")
echo "小红是我的闺蜜,你你你。。。。"
;;
"小名")
echo "我好像不认识你了,,,拜拜"
;;
*)
echo "拜拜,永不相见!!!"
;;
esac
;;
*)
echo "你哑巴了??"
;;
esac
demo3:模拟一个多任务维护界面
#!/bin/bash
echo "*******************"
echo "***欢迎进入总菜单****"
echo "***请选择操作类型****"
echo "*** 1——系统 *******"
echo "*** 2——程序 *******"
echo "*** 3——数据库*******"
echo "*** 0——退出 *******"
read -p "请输入操作类型:" choose
case $choose in
1)
echo system
;;
2)
echo chengxu
;;
3)
clear
echo "***欢迎进入子菜单****"
echo "***请选择操作类型****"
echo "*** 1——备份 *******"
echo "*** 2——优化 *******"
echo "*** 0——退出 *******"
read -p "请选择操作类型:" var
case $var in
1|a)
echo backup
;;
2|b)
echo youhua
;;
0)
echo "请联系管理员"
;;
esac
;;
0)
echo "拜拜"
;;
*)
echo xxxxx
;;
esac
要求:
1、对性别进行判断,如果不输入男或者女,则显示“你是泰国来的码?”如果是男的则对年龄判断:
1>男的年龄大于18岁则显示“某某先生,你结婚了码?”;如果对方回答yes或者结了,则显示“那你来着凑什么热闹?”;如果对方回答no或者没结,则再次询问“那你有房有车吗?”;如果既不说结了也不说没结,则显示“你到底有没有结婚??”
2>问有房有车吗,对方回答有,则显示“咱们去民政局领证吧,正好今天是七夕!”;如果对发回答没有,则显示“不好意思,我去下洗手间...”;如果即不回答有也不回答没有,则显示“请正面回答我的问题??”
3>男的年龄如果小于18岁,则显示“你个小猫孩来着干啥,不好好读书”
4>如果是女的,并且年龄大于18岁,则显示“某某女士,您好”;否则显示“某某小姐,您好”
#!/bin/bash
read -p "请输入名字:" name
read -p "请输入性别:" sex
case $sex in
男 | man )
read -p "你的年龄多大?" age
if [ $age -ge 18 ];then
read -p "$name先生,你结婚了吗?" status
case $status in
结了 |yes)
echo "那你来这凑什么热闹?"
;;
没结 | no | 没有)
read -p "那你有房有车吗?" money
case $money in
有)
echo "咱们去民政局领证吧,正好今天是七夕!"
;;
没有)
echo "不好意思,我去下洗手间。。。"
;;
* )
echo "请正面回答我的问题??"
;;
esac
;;
* )
echo "你到底有没有结婚,请正面回答!!!"
;;
esac
elif [ $age -le 18 -a $age -gt 0 ];then
echo "你个小毛孩来这干啥,不好好读书!"
else
echo "拜拜!"
fi
;;
女 |lady)
read -p "你的年龄多大?" age
if [ $age -gt 18 ];then
echo "$name女士,您好!"
elif [ $age -le 18 -a $age -gt 0 ];then
echo "$name小姐,您好!"
else
echo "拜拜!"
fi
;;
* )
echo "你是泰国来的吗?"
;;
esac
2、输入一个等级(A—E),查看每个等级的成绩,如:输入A,则显示“90~100分”,依次类推
函数:
语法:
function_name(){
command...
}
function name(){
command
}
demo1:
vim fun1.sh
#!/bin/bash
hello(){
echo "this is hello function"
echo "hello $1"
return
}
function world(){
echo "this is world function"
echo "hi $1"
return
}
return:
作用:
1、结束函数
2、用来返回一个值给函数
换数调用:
1、直接在终端掉用
source fun1.sh
. fun1.sh
# hello 666
# world 777
注意:只在当前终端当前用户生效
2、将函数放到环境变量里
vim /etc/profile
...
hello(){
echo "this is hello function"
echo "hello $1"
return
}
需要退出当前用户重新登录
3、在脚本中调用
#!/bin/bash
world (){
echo hahahahh
echo $1
return
}
case $1 in
start)
world hellolllll;
echo "service is running..."
;;
stop)
world;echo "service stoped"
;;
reload|restart)
world
echo "service restart...."
;;
*)
echo "usage:`basename $0` [start|stop|reload|restart]"
;;
esac
demo2:批量创建5个用户stu1~stu5
#!/bin/bash
group=admin
user(){
for i in {1..5}
do
useradd -G $group stu$i
echo 123|passwd --stdin stu$i
done
}
group(){
groupadd $group
}
cat /etc/group|grep -w admin &>/dev/null
[ $? -eq 0 ] && user
[ $? -ne 0 ] && group && user
或者
[ $? -eq 0 ] && user || group && user
课后练习:
写一个自动搭建web服务的脚本,要求如下:
1、要求外部输入你的IP地址、主机名以及数据根目录,如果不输一直提示输入,直到输入为止
2、搭建好后直接用脚本测试验证,如果ok就提示web服务已经搭建ok;否则没有搭建成功
思路:
1、数据根目录以及首页文件——>需要数据根目录——>判断是否存在——>授权
2、需要将主机名和IP地址一一对应写在hosts——>需要IP地址和主机名
3、修改配置文件——>发布虚拟主机
#!/bin/bash
conf=/etc/httpd/conf/httpd.conf
#该函数循环输入相应变量,变量不能为空字符串
fun_web(){
input_var=""
output_var=$1
while [ -z $input_var ]
do
read -p "$output_var:" input_var
done
echo $input_var
}
#定义三个变量(IP|hostname|webroot)
ip=$(fun_web "Input server IP[192.168.1.1]:")
host_name=$(fun_web "Input server hostname[www.test.cc]:")
root_dir=$(fun_web "Input server webroot[/var/www/html]:")
#判断数据根目录是否存在
[ ! -d $root_dir ] && mkdir -p $root_dir
chown apache.apache -R $root_dir && chmod 755 $root_dir
echo "this is $host_name test page" > $root_dir/index.html
#将IP和hostname对应绑定到hosts文件中,方便域名解析
echo "$ip $host_name" >> /etc/hosts
#发布虚拟主机
cat >> $conf <<end
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot $root_dir
ServerName $host_name
ErrorLog logs/test.cc-error_log
CustomLog logs/test.cc-access_log common
</VirtualHost>
end
#启动服务
service httpd restart
#测试
自己完成