bash知识点:while循环和until循环

for varName in 列表; do

    循环体

done

条件测试:有以下两种

可执行命令: 命令成功,条件测试成功;否则为失败;

根据$?, 状态返回值; 

表达式(不是可执行的命令,是个表达式):

[ expression ]

` expression `

test expression

while 条件测试; do

循环体

done 

while循环:条件测试成功,则循环;失败,则退出;

如何退出?

必须有时刻:条件测试不成功

?: 条件控制变量

练习:求100以内所有正整数的和;

declare -i sum=0

declare -i i=1

while [ $i -le 100 ]; do

let sum+=$i

let i++

done

echo $sum

练习:求100以内所有偶数之和

declare -i evenSum=0

declare -i i=1

while [ $i -le 100 ]; do

if [ $[$i%2] -eq 0 ]; then

let evenSum+=$i

fi

let i++

done

echo $evenSum

declare -i evenSum=0

declare -i i=2

while [ $i -le 100 ]; do

let evenSum+=$i

let i+=2

done

echo $evenSum

如何让while循环退出:在循环体中改变测试条件中用于控制循环次数的变量的值;

练习:通过键盘提示用户输入字符,将用户输入的小写字母转换为大写,转换一次之后,再次提醒,再输再转换;但输入quit表示退出;

#!/bin/bash

read -p "Enter a word: " word

while [[ "$word" != "quit" ]]; do

echo $word | tr 'a-z' 'A-Z'

read -p "Enter a word again: " word

done

练习:显示如下菜单给用户

cpu) print cpu information;

mem) print memory information;

disk) print disk infomation;

quit) quit

Enter your option:

根据用户的选择输出相应信息;

每次执行后,不退出,而由用户再次指定新的选项;

#!/bin/bash

#

cat << EOF

cpu) print cpu information;

mem) print memory information;

disk) print disk infomation;

quit) quit

EOF

read -p "Enter your option: " option

option=`echo $option | tr 'A-Z' 'a-z'`

while [[ "$option" != "quit" ]]; do

if [[ "$option" == "cpu" ]]; then

cat /proc/cpuinfo

elif [[ "$option" == "mem" ]]; then

free -m

elif [[ "$option" == "disk" ]]; then

df -h

else 

echo "Wrong option..."

fi

read -p "Enter your option again: " option

option=`echo $option | tr 'A-Z' 'a-z'`

done

回顾:raid

md: Multi Disks

dm: Device Mapper

硬件:

BIOS

软件:

磁盘或RAID管理工具

提升性能、可用性(容错能力)

容错能力:raid1, raid4, raid5, raid6, raid10

提升写性能:raid0, raid4, raid5, raid6, raid10

mdadm

-A

-C

-a  自动创建设备文件

-l  指定级别

-x  冗余磁盘个数

-n  指定存数据磁盘个数

-c  指定chunk大小

-F  管理模式

-S  停止raid

-D  查看细节

bash循环:while

while 条件; do

循环体

done

循环体中:不断地修改控制循环次数的变量,以使得其在某一时刻导致测试条件不能满足从而退出循环;

练习:提示用户输入一个用户名,如果存在:显示用户UID和SHELL信息;否则,则显示无此用户;

 显示完成之后,提示用户再次输入;如果是quit则退出;

方法一:

#!/bin/bash

#

read -p "Enter a user name: " userName

while [[ "$userName" != "quit" ]]; do

       判断是否为空

       if [ -z "$userName" ]; then

               echo "User name null." 

       elif id $userName &> /dev/null; then

               grep "^$userName\>" /etc/passwd | cut -d: -f3,7

       else

               echo "No such user."

       fi

       read -p "Enter a user name again(quit to exit): " userName

done

        if [ -z "$userName" ]; then

                echo "User name null."

        else 

        if id $userName &> /dev/null; then

                grep "^$userName\>" /etc/passwd | cut -d: -f3,7

        else

                echo "No such user."

        fi

        fi

        read -p "Enter a user name again(quit to exit): " userName

练习:提示用户输入一个用户名,判断用户是否登录了当前系统; 

如果没有登录,则停止5秒钟之后,再次判断;直到用户登录系统,显示“用户来了”,而后退出;

方法一:

#!/bin/bash

#

read -p "Enter a user name: " userName

先判别用户名是否存在

while ! id $userName &> /dev/null; do

   read -p "Enter a user name again: " userName

done

who | grep "^$userName" &> /dev/null

retVal=$?

while [ $retVal -ne 0 ]; do

       sleep 5

       who | grep "^$userName" &> /dev/null

       retVal=$?

done

echo "$userName is on."

方法二:

#!/bin/bash

#

read -p "Enter a user name: " userName

while ! id $userName &> /dev/null; do

   read -p "Enter a user name again: " userName

done

while ! who | grep "^$userName" &> /dev/null; do

       echo "$userName is not here."

       sleep 5

done

echo "$userName is on."

方法三:

#!/bin/bash

#

read -p "Enter a user name: " userName

until [ -n "$userName" ] && id $userName &> /dev/null; do

   read -p "Enter a user name again: " userName

done

until who | grep "^$userName" &> /dev/null; do

       echo "$userName is not here."

       sleep 5

done

echo "$userName is on."

bash编程之until循环:

until 测试条件; do

循环体

done

条件不满足,则循环;否则,退出;

练习:用until循环,求100以内所有正整数之和;

#!/bin/bash

declare -i sum=0

declare -i i=1

until [ $i -gt 100 ]; do

let sum+=$i

let i++

done

echo $sum

bash编程之组合测试条件深入探讨:

逻辑与:多个条件同时满足

[ CONDITION1 ]  &&  [ CONDITION2 ] 

[ CONDITION1 -a CONDITION2 ]

[[ CONDITION1 && CONDITION2 ]] 

注意:前两个使用单或双中括号都可,但,&&不允许用于单中括号中,所以第三种只能用于双中括号中;

逻辑或:多个条件中有一个满足即为真;

[ CONDITION1 ]  ||  [ CONDITION2 ] 

[ CONDITION1 -o CONDITION2 ]

[[ CONDITION1 || CONDITION2 ]] 

注意:||不允许用于单中括号中;

德 摩根 定律

  !(条件1 或 条件2) = !条件1 并且 !条件2

  !(条件1 并且 条件2) = !条件1 或 !条件2

使用while循环一次读取文件的一行,直到文件尾部:

while read line; do

循环体

done < /path/to/somefile

练习:取出当前系统上,默认shell为bash的用户(不错)

#!/bin/bash

#

while read line; do

使用与做连续判断

[[ `echo $line | cut -d: -f7` == "/bin/bash" ]] && echo $line | cut -d: -f1

done < /etc/passwd

练习:显示所有其ID号为偶数的用户;

#!/bin/bash

#

while read line; do

       userID=`echo $line | cut -d: -f3`

       if [ $[$userID%2] -eq 0 ]; then

               echo -n "$userID: "

               echo $line | cut -d: -f1

       fi

done < /etc/passwd

练习:显示/etc/rc.d/rc.sysinit文件中,其总字符个数大于30的行;

#!/bin/bash

#

while read line; do

charCounts=`echo $line | wc -c`

if [ $charCounts -gt 30 ]; then

echo -n "$charCounts: "

echo $line

fi

done < /etc/rc.d/rc.sysinit

练习:显示所有其UID和GID均为偶数的用户;

#!/bin/bash

#

while read line; do

       userID=`echo $line | cut -d: -f3`

       groupID=`echo $line | cut -d: -f4`

       if [ $[$userID%2] -eq 0 ] && [ $[$groupID%2] -eq 0 ]; then

               echo -n "$userID, $groupID: "

               echo $line | cut -d: -f1

       fi

done < /etc/passwd

练习:显示/etc/rc.d/rc.sysinit文件中,其总字符个数大于30且非以“#”开头的行;

#!/bin/bash

#

while read line; do

charCounts=`echo $line | wc -c`

if [ $charCounts -gt 30 ] && [[ "$line" =~ ^[^#] ]] ; then

echo -n "$charCounts: "

echo $line

fi

done < /etc/rc.d/rc.sysinit