过程式编程语言的代码执行顺序:

顺序执行:逐条运行;

选择执行:

代码存在一个分支,条件满足时才执行;

两个或以上的分支,只会执行其中一个满足条件的分支

循环执行:

代码片段(循环体)要执行0,1,或多个来回


选择执行的格式:

 1.&&,||

 2.if 语句

 3.case语句

 

if语句格式:

 单分支的if语句

 

if 测试条件 then; 或  if 测试条件 

  then

代码分支 代码分支

fi   fi

双分支的if语句:

if 测试条件;then

条件为真时执行的分支

else

条件为假时执行的分支

fi

多分支if语句

if  CONDITION1;then 

条件1为真分支

elif   CONDITION2;then

条件2为真分支

elif  CONDITION3;then

条件3为真分支

....

else

 所有条件均不满足时的分支

fi

 

练习:

  1.通过命令行参数给定两个数字,输出其中较大的数值

  2.通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数;

  3.通过命令行参数给定两个文本文件名,如果某文件不存在,则结束脚本执行;都存在时返回每个文件的行数,并说明其中行数较多的文件;


read命令:

用户交互:通过键盘输入数据

 read [option]....[name...]

    -p 'format'

-t timeout

eg: read -t 5 -p "please echo a passwd: " passwd(这个是变量名)

         注意read赋值的对应关系:

   [root@]localhost ~] # read a b

tom jerry

[root@]localhost ~] # echo $a $b

tom jerry

[root@]localhost ~] # read a b c

tom jerry

[root@]localhost ~] # echo $a $b $c

tom jerry

[root@]localhost ~] # read a b 

tom jerry jenny

[root@]localhost ~] # echo $a $b 

tom jerry jenny

                

if  语句可嵌套if语句,也可嵌套其他语法结构

各结构都可相互嵌套

循环执行: 将一段代码重复执行0,1或多次

进入条件: 条件满足才进入循环

退出条件:每个循环都应该有退出条件,否则可能进入死循环

bash脚本:

for 循环 

while 循环体

until 循环 

for 循环: 


     for循环的结构模式:

for  VARIABLE  in  LIST;do

循环体

done

  两种格式:

1.遍历列表,

       进入条件:只要列表有元素,就进入循环

退出条件:列表中的元素遍历完成

 

LIST的生成方式:

1.直接给出

2.整数列表

        a.{start,end}

b.seq  [start]  [步长] end

3.返回列表的命令,比如ls

4.glob,ls  /var/lib/a*

5.变量引用  $@,$*

2.控制变量

                       eg:

#!/bin/bash

#

for  filename  in 1 3 5 7 ;do

touch /tmp/fench$filename  会创建出fench1,fench3。这里可以直接将变量的结果和fench组合其他

       done

     

练习:

1、分别求100以内所有偶数的和,以及所有奇数的和

[root@localhost scripts]# cat qiuhe.sh 

#!/bin/bash

#

declare -i sum_ou

declare -i sum_ji


for I in {1..100};do

 u=$[$I%2]

 if [ "$u" -eq "0" ];then

sum_ou+=$I

 else 

sum_ji+=$I

 fi

done

echo $sum_ou

echo $sum_ji

2、计算当前系统上所有用户的id之和

[root@localhost scripts]# cat id_sum.sh 

#!/bin/bash

#

declare -i sum


for I in `cut -d: -f3 /etc/passwd`;do

sum+=$I

done

echo $sum

3、通过脚本参数传递一个目录给脚本,然后计算此目录下所有文本文件的行数之和,并说明此类文件的总数

[root@localhost scripts]# cat linesum.sh 

#!/bin/bash

#

declare -i sum

declare -i sum2

for I in `find $1 -type f`;do

sum+=`wc -l $I |cut -d' ' -f1`

sum2+=1

done

echo $sum

echo $sum2

4、写一个脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数

#!/bin/bash

#

if [[ $1 =~ ^0*[1-9][0-9]*$ ]] ;then   注意此处正整数的写法

echo "you have input a zhengshu"

else 

echo "wrong"

fi

2、while循环语句


while CONDITION1;do

循环体

循环控制变量修正表达式

done

条件进入:CONDITION测试为真


条件退出:CONDITION测试为假

  这个循环会一直进行,直到遇到break。

while(true){  

String aa=in.readLine();

}

while(true) ... break 结构有其等价的格式

 

for(;;){

  //todo:do something

  ... break;

}

3、until循环语句


until CONDITION;do

循环体

循环控制变量修正表达式

done

条件进入:CONDITION测试为假


条件退出:CONDITION测试为真


4、case选择执行语法,    注意各分支的顺序,如果一个条件可以同时被两个分支匹配到,那么会应用第一个匹配到的分支的效果


case $variable in

pattern1)

分支1

;;

pattern2)

分支2

;;

pattern3)

分支3

;;

*)

分支N

esac

case支持glob网络的通配符:


 * :任意长度任意字符

 ?:任意单个字符

 []:指定范围内的任意单个字符        

  eg:

 [1-3]、[a-c]等

错误[23-43]   1[2]-2[1]  

 a|b :a或者b

 

    eg:当用户输入y,Y,yes,YEs等大小写都可以匹配

     1 #!/bin/bash

 2 read -p "Please enter your choice:(yes):" choice

 3 change=`echo $choice |tr A-Z a-z`

 4 case $change in

 5 yes|y)

 6     echo -e "\033[33mthe script continues to run\033[0m"

 7     ;;

 8 no|n)

 9     echo -e "\033[32mthe script is exit\033[0m"

10     ;;

11 *)

12     echo -e "\033[34mPlease enter yes or no\033[0m"

13     ;;

14 esac  

第二种方法:

  case $1 in

[yY]|[yY][eE][Ss])

echo "you  put a $1"

 ;;

 [nN]|[nN][Oo])

      echo "you put a $1"

          ;;

*)

  echo "ukown"

  ;;

  esca

十五、在循环中控制循环的方法

1、continue


表示提前结束本轮循环,而直接进入下一轮循环的条件测试


while CONDITION1;do

COMMNAD1

if CONDITION2;then

continue

fi

COMMNAD N 

done

示例 : 求100以内的所有偶数之和


 #!/bin/bash

 declare  -i evensum=0

 declare -i i=0

 while [ $i -le 100 ];do

 let i++

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

 continue

 fi

 let evensum+=$i

 done    

2、break


表示提前跳出循环


示例:100以内所有奇数之和


 #!/bin/bash

 declare  -i evensum=0

 declare -i i=1

 while true;do

 let $oddsum+=$i

 let i+=2

 if [ $i -gt 100 ];then

 break

 fi

 done

3、while的特殊用法之遍历文件的行


while read VARIABLE;do

循环休

done < /path/form/somefile

4、for循环的特殊用法


for ((控制变量初始化;条件判断表达式;控制变量的修正语句));do

循环体

done

控制变量初始化:仅在循环代码开始运行时,执行一次


控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做判断


1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户centos登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。
   #!/bin/bash
#
until [[ -z /var/log/login.log ]]   ;do
   a=$(w|grep "centos"|awk '{print $2,$3}')
   b=$(w|grep "centos"|awk '{print $2}')
    echo "$a" > /var/log/login.log 
   echo "please outlog" | write centos $b && echo "success" && exit  
  sleep 3   
done
  


2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
#!/bin/bash
#
pan() {
    if [  $[RANDOM%11] -$1 5  ] ;then
      echo " congritulation,you win."
      echo "$[RANDOM%11]"
   elif [ $[RANDOM%11] -$2 5 ];then
      echo "sorry ,you lose."
      echo "$[RANDOM%11]"
   else
      echo "$[RANDOM%11]"
        exit
   fi
}
read -p "plesae guess big or small: " daxiao
case $daxiao in
big)
   pan gt le
   ;;
small)
   pan le gt
   ;;
*)
   echo "please input a small or big"
  
  ;;
esac
 
5、编写脚本,打印九九乘法表
#!/bin/bash
for i in `seq 1 9`;do
	for j in `seq 1 $i`;do
          echo -ne "${j}X${i}=$[i*j]\t"
	done
        echo 
done
6、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者
#!/bin/bash
#
min=$1
max=0
for M in {1..10};do
   magic=$magic" "$(echo $[RANDOM%$1])
 let M++
done

for  I in `echo $magic` ;do
     if [ $min -ge $I ];then
        min=$I
     elif [ $max -lt $I ];then
         max=$I
     fi
done
echo $min
echo $max
echo -e "---the random list ----\n$magic"
7、编写脚本,实现打印国际象棋棋盘
		#!/bin/bash
		#
		for i in `seq 1 $1`;do
			for j in `seq 1 $2`;do
						total=$[i+j]
						 rev=$[total%2]
						if [[ "$rev" -eq 0 ]];then
					 echo -en "\033[41m  \033[0m"
				else
						 echo -en "\033[47m  \033[0m"
						fi
				 done
			 echo 
		done
8、打印等腰三角形
#!/bin/bash
#
declare -i i 
i=1
until [ $i -gt $1 ];do
 
       for j in `seq 1 $[$1-i]`;do
         echo -ne " "
         let j++
       done
 
    for m in `seq  $[$1-i+1] $[$1+i-1]`;do
       echo -ne "*"
    done
    echo
    let i++
done
9、安装centos6.7,用centos6.8kernel升级