shell学习笔记二

循环语句

for  a  in var1,var2,var3

do
  
  command

done

当a为var1时执行do中的语句,执行完后,在将var2赋值给a,再一次执行do中的语句,知道结束

#
for b in `seq 20` <--------------产生一组序列0-20

do
 
   echo "step:$b"

done

#
for c in `seq 80 100`<----------产生一组序列80-100

do

 echo "step:$b"

done

#
for (( i=0;i<10;i++ )) 
do
        echo $i
done
i=0 ->初始化了循环时候使用的变量i=0,仅仅是第一次进去循环的时候才有用
i<10  ->  继续循环的条件(结束循环的条件)
i++  ->每一次循环,变量i的值的变化


i=7  -e tmp.log.6 ;mv tmp.log.6  tmp.log.7
i=6  -e tmp.log.5 ;mv tmp.log.5  tmp.log.6
....
i=2  -e tmp.log.1  ; mv tmp.log.1 tmp.log.2

i=1 退出循环

思考:
 每次进去循环的时候变量的值是多少,什么时候满足条件继续循环,什么时候退出循环

 
for循环的特点: 一般来说,都是确定循环的次数

 

 

例子:
 1、输入一个网段,批量判断网段下的所有机器的状态 (ping 。。。)
#!/bin/bash

#输入一个网段,批量判断网段下的所有机器的状态 (ping 。。。)
file1=/df/shell/201004071/down
file2=/df/shell/201004071/up

[ ! -f "$file1" ] && touch "$file1" || echo > "$file1"
[ ! -f "$file2" ] && touch "$file2" || echo > "$file2"

for a in `seq 1 254`

do
     ip=$1.$a
     ping -c 2 $ip 2>/dev/null 1>/dev/null
     [ $? -eq 0 ] && echo "$ip" >> "$file2" || echo "$ip" >> "$file1"

done

echo "server is up:"&& cat "$file2"

echo "server is down" && cat "$file1"


 2、把系统中所有帐号都分类

===================Administrator=================
root
===================System Users==================
bin
.....
===================Normal Users==================
tom
mary
.....

#!/bin/bash


for a in $( cat /etc/passwd | cut -d: -f1,3  ) # bin:1 ....
do
        name=$( echo $a | cut -d: -f1 )
        uid=`echo $a | cut -d: -f2`
#echo  $uid
sleep 1
        [ $uid -eq 0 ] && echo -ne "$name\t" >> /tmp/admin_user.txt
        [ $uid -gt 0 -a $uid -lt 500 ] && echo -ne "$name\t" >> /tmp/system_users.txt
        [ $uid -ge 500 ] && echo -ne "$name\t" >> /tmp/normal_users.txt
done

clear
echo "===================Administrator================="
cat /tmp/admin_user.txt && rm -f /tmp/admin_user.txt
echo
echo "===================System Users=================="
cat /tmp/system_users.txt && rm -f /tmp/system_users.txt
echo
echo "===================Normal Users=================="
cat /tmp/normal_users.txt && rm -f /tmp/normal_users.txt
echo

 


 3、批量建立用户 user1 ~ user10

----------------------------------------

while [ condition ]
do
 command
done

while (( condition ))
do
 command
done

while true  # 死循环
do
 command
done

 

break  终止循环体

-----------------------------------------

#!/bin/bash

#控制循环的流程
# break continue exit


for (( i=0 ; i<10 ; i++ ))
do
 echo $i
 [ $i -eq 8 ] && break  # 当i=8的时候,就退出整个循环,执行循环之后的代码
 echo "$i After break " #当break之后,就不再执行本句代码
done

echo "Out of Cycle: Can you see me?"

echo "=============================="
j=0
while true
do
 echo $j
 let j++
 [ $j -eq 8 ] && continue  # 结束本次循环,不继续执行循环体剩下的代码,而是继续进去下一次循环
 echo "@_@"
 [ $j -eq 12 ] &&  break
done

echo "Out of while"
-----------------------------------------

#!/bin/bash


# 添加了流程控制的猜数字


answer=99

while true
do
 read -p "Input your guest:" guest
 if [ $guest -lt $answer ];then
  echo "Your guest is too small"
  continue
 fi

 echo "Step1: Can you See me?"

 if [ $guest -gt $answer ];then
  echo "Your answer is too big"
  continue
 fi
 
 echo "Step2: Can you see me?"
  
 if [ $guest -eq $answer ];then
  echo "You are right! "
  break
 fi

 echo "Step3: Can you see me?"

done

echo "Out of while"

--------------------------------------------

#!/bin/bash

# script.sh  16:00:00
time=$1  # 16:00:00

while true
do
 now=$(date +%H:%M:%S)
 clear
 echo $now 
 if [ "$now" == $time ];then
  for (( i=0;i<10;i++ ))
  do
   echo -en "\a"
   sleep 1
  done
  break
 fi

done

 

-------------------------------------------

#!/bin/bash

#画规律图形


#1
#12
#123
#1234
#12345


a=1  # 用来记录当前打印的行号

while [ $a -le 5 ]
do
 for (( c=1;c<=$a;c++ ))
 do
  echo -n "$c"
 done
 let a++
 echo
done

echo -e "==========================\n\n"
#1
#23
#456
#78910

a=1 # 用来记录当前打印的行号
b=1 # 记录上次打印到的哪个数字

while [ $a -lt 5 ]
do
 for (( c=1;c<=$a;c++,b++ ))
 do
  echo -n $b
 done
 let a++
 echo
done

----------------------------------------

#1
#23
#345
#4567
#56789

--------------------------------------------------------------------
#!/bin/bash


echo $RANDOM

# 产生一个到0-99范围内的随机数字
ran=`expr $RANDOM % 100`
echo $ran


# 产生一个50-100范围内的随机数字

ran2=`expr $RANDOM % 51 + 50`
echo $ran2
---------------------------------------------------------------------

作业:
 1、编写一个脚本把当前目录下的所有空文件都删除,最后输出删除的文件的个数

 2、创建一个/tmp/test目录,里面有3个文件,名字分别为111,222,333。写一个脚本,可以每个10秒钟循环对这3个文件进行改名,把111改成222,把222改成333,把333改成111。

 3、找到/usr/share/doc目录下的所有文件名字为index.html的文件,包括子目录里的。把他们集中复制一份放到/tmp/index目录中,文件名按找到的先后顺序更改,第一个找到的index.html命名为index.html.1 ,第二个找到的为index.html.2。如此类推。

 4、备份前24小时被修改过的文件,要求把文件都放到一个tar包里,tar包的命名为YYYYMMDD.tar (如:20091110.tar),最终的tar包存放在/tmp/backup目录下

 5、编写一个猜数字游戏:要求脚本随机产生一个 0 到 100的数字,然后交互模式要求你进行猜测,每次猜测都会根据你的判断缩小范围,如: 随机数字为 88
你进行第一次猜测,输入 50,那么脚本会提示你答案就在 50-100的范围里,然后要求继续猜
第二次猜测,输入90,那么脚本会提示你答案就在50 - 90的范围内,如此类推,直到你猜中为止。

 6、时间允许的话,最后做本题,画三角形
直角三角形
x
xx
xxx
xxxx
xxxxx
xxxxxx
xxxxxxx
xxxxxxxx
xxxxxxxxx
=======================================
直角空心三角形
x
xx
x x
x  x
x   x
x    x
x     x
x      x
x       x
xxxxxxxxxx
=======================================
等腰三角形
         x
        xxx
       xxxxx
      xxxxxxx
     xxxxxxxxx
    xxxxxxxxxxx
   xxxxxxxxxxxxx
  xxxxxxxxxxxxxxx
 xxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
=======================================
等腰空心三角形
         x
        x x
       x   x
      x     x
     x       x
    x         x
   x           x
  x             x
 x               x
xxxxxxxxxxxxxxxxxxx
 

你可能感兴趣的:(shell)