sh5.while 脚本练习
脚本编程:
顺序结构
选择结构
if, case
循环结构
for,while,until
while循环:适用于循环次数未知的场景
语法:
while CONDITION;do statement .... done
while 练习:
1. 计算1到100正整数和
1 一.while 2 #/bin/bash 3 sum=0 4 i=1 5 while [ $i le 100 ];do 6 let sum+=i # let sum=sum+i 等于 let sum+=i 7 i++ 8 done 9 echo $sum 10 11 二.for 12 #/bin/bash 13 sum=0 14 for i in {1..10};do # for ((i=1;1<=100;i++ 15 let sum+=i # sum=`expr $sum + $i` #expr 运算注意空格 16 done 17 echo $sum 18 19 三.seq 20 #/bin/bash 21 sum=0 22 for i in `seq 1100`;do 23 sum=`expr $sum + $i` 24 done 25 echo $sum 26 27 四. seq 28 seq -s"+" 1 100|bc 29 30 五. for II 31 #/bin/bash 32 echo -e "\t${!#}" #显示脚本名,路径 33 for (( i=0;i<=100;i++ ));do 34 sum=$[ ${sun} + ${i} ] 35 done 36 echo $sum 37 38 六. sed 39 echo {1..100}|sed 's/ /+/g' | bc 40 41 42 整数比较: 43 -eq : 测试两个整数是否相等;比如 [ $A -ep $B ] 44 -ne : 测试两个整数是否不等,不等为真,相等为假 45 -gt : > 46 -lt : < 47 -ge : >= 48 -le : <= 49 命令间逻辑关系: 50 逻辑与 : && 51 逻辑或 : ||
总结一下整型变量自增的方法:
整形变量自增; 1. i=`expr $i+1`; 2. let i+=1; 3. ((i++)); 4. i=$[$i+1]; 5. i=$(($i + 1 )) #!/bin/bash i=0; while [ $i -lt 4 ];do echo $i; #i=`expr $i + 1`; let i+=1; # ((i++)); # i=$[$i+1]; # i=$(( $i + 1 )) done 另外 ,对于对于固定次数的循环,可以通过sep命令来实现,就不需要变量的处境了,实例如下 : #!/bin/bash for j in $(seq 1 5);do echo $j done
练习2:
写 一个脚本,如果输入小写字母自动转换成大写显示 ,quit 退出
#/bin/bash # read -p "Input something:" STRING while [ $STRING != 'quit' ];do echo $STRING | tr 'a-z' 'A-Z' read -p "Input someting:" STRING done read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) -p: 由于read命令提供了-p参数,允许在read命令行中直接指定一个提示。 #!/bin/bash read -p "Enter your name:" name echo "hello $name, welcome to my program" exit 0 在上面read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给最后一个变量。 -t: 使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。 -t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态; 例1,: #!/bin/bash if read -t 5 -p "please enter your name:" name ;then echo "hello $name ,welcome to my script" else echo "sorry,too slow" fi exit 0 例2: -n #!/bin/bash read -n1 -p "Do you want to continue [Y/N]?" answer case $answer in Y | y) echo "fine ,continue";; N | n) echo "ok,good bye";; *) echo "error choice";; esac exit 0 该例子使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即 接受输入并将其传给变量。无需按回车键。 -s 输入不显示 有时会需要脚本用户输入,但不希望输入的数据显示在监视器上。典型的例子就是输入密码,当然还有很多其他需要隐藏的数据。 -s选项能够使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色) #!/bin/bash read -s -p "Enter your password:" pass echo "your password is $pass" exit 0
练习3:
检测用户是否登录脚本,每5秒检测一次,如登录即退出脚本。
#/bin/bash # if [ $# -lt 1 ];then echo "Input a,b,c.. user" exit 8 fi for i in `echo $1 | sed 's/,/ /g'`;do if id $i &> /dev/null;then who | grep "$i" &> /dev/null RET=$? while [ $RET -ne 0 ];do echo "`date`,$i is not log." sleep 5 who | grep "$i" &> /dev/null RET=$? done echo " $i is loging ..`date`" else echo "No such $i" fi done 注: 可以接受一个或多个用户参数,检测指定用户是否已登录 [root@beary test]# ./login.sh root,bb root is loging ..Mon Nov 21 14:40:31 CST 2016 Mon Nov 21 14:40:31 CST 2016,bb is not log. Mon Nov 21 14:40:36 CST 2016,bb is not log. ....
练习4.
写一个脚本查看硬盘空间,内存,swap使用信息
1 1,显示一个菜单给用户 2 d|D) show disk usager. 3 m|M) show memory usagers. 4 s|S) show swap usages. 5 *) quit. 6 2.当用户给定选项后显示相应的内容; 7 扩展: 当用户选择完成,显示相应信息后,不退出,而让用户再一次选择,再次显示相应信息,直到输入’quit' 退出 8 9 #/bin/bash 10 # 11 cat << EOF 12 d|D) show disk usages. 13 m|M) show memory usages. 14 s|S) show swap usages. 15 *)quit. 16 EOF 17 18 read -p "Your choice:" CHOICE 19 while [ $CHOICE != 'quit' ];do 20 case $CHOICE in 21 d|D) 22 echo "Disk usages." 23 df -Ph;; 24 m|M) 25 echo "Memory usages." 26 free -m | grep "Mem" ;; 27 s|S) 28 echo "Swap usages." 29 free -m | grep "Swap" ;; 30 *) 31 echo "Unknown." 32 esac 33 34 read -p "Again, your choice:" CHOICE 35 done 36 37 38 cat 用于显示文本文件内容,全部输出 39 EOF “end of file”,表示文本结束符