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 root@test.cc

   DocumentRoot $root_dir

   ServerName $host_name

   ErrorLog logs/test.cc-error_log

   CustomLog logs/test.cc-access_log common

</VirtualHost>

end

#启动服务

service httpd restart


#测试

自己完成