5.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 [ 1 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

注:
可以接受一个或多个用户参数,检测指定用户是否已登录

[[email protected] 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”,表示文本结束符

  

  

时间: 2024-08-24 05:28:56

5.while 脚本练习的相关文章

【HTML5】用脚本控制交互元素details元素的使用

1.源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Con

AD 脚本kixtart运用之三(添加windows共享打印机)

在http://windyma.blog.51cto.com/661702/1967027文章,已做好用户脚本基础上 在脚本文件kixtart.kix里添加如下内容: --------------------------------------- IF INGROUP ("Color_Printer") If AddPrinterConnection ("\\zsprinter.nccn.int\NEO-Color-Printer") = 0 ? "Add

WEB页面,WEB环境版本,数据库,整站备份脚本

#!/bin/bash # #WEB页面,WEB环境版本,数据库,整站备份脚本 #当发生某个原因导致整个服务器无法恢复时,利用上面备份的相关数据即可重做一台一样的服务器 date_a=`date +%Y%m%d-%H%M%S` mkdir -p /web_bak/${date_a}/conf &> /dev/null mkdir -p /web_bak/${date_a}/web &> /dev/null mkdir -p /web_bak/${date_a}/mysql &a

windows PAC脚本解析的软件 pac syntax检查

参考文档: https://zhuanlan.zhihu.com/p/22166179?refer=barretlee https://github.com/pacparser/pacparser https://community.mcafee.com/thread/47557?tstart=0 动态在线检查网页测试i: http://home.thorsen.pm/proxyforurl 安装步骤参考: 环境(centos6.7 python环境默认2.6 2.7 都可以) https://

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

AD 脚本kixtart运用之四(用户桌面背景)

在http://windyma.blog.51cto.com/661702/1967027文章,已做好用户脚本基础上进行设置 首先设置用户背景桌面是微软件的Bginfo工具,而kixtart只是用来获取用户屏幕的分辨率,根据不同屏幕的分辨率再来调用Bginfo工具来设置不同分辨率的背景图片,以此保证图片不会变形. 第一,在域\\nccn.int\NETLOGON 共享下新建Bginfo目录,把Bginfo.exe工具及不同分辨率的背景图全复制到Bginfo目录下. 第二,用Bginfo.exe工

20.27分发系统介绍;20.28expect脚本远程登录;20.29expect脚本远程执行命令;20.30expect脚本传递参数

20.27 分发系统介绍 shell项目-分发系统-expect 20.28 expect脚本远程登录 1. 安装expect [[email protected] ~]# yum install -y expect 自动远程登录 2. 创建配置1.expect脚本(远程登录) [[email protected] ~]# vim 1.expect 添加内容(自动远程登录hao2机器并执行命令) #! /usr/bin/expect set host "192.168.211.129"

AD 脚本kixtart运用之六(outlook邮件批量生成签名)

基于上一编文章http://windyma.blog.51cto.com/661702/1967071里的设置 我们在Function.kix添加如下内容(备注:此outlook签名function来自网上,经过我比较大的修改): ---------------- Function GenerateOutlookSig($SignatureFileName) $EmailAccountName = @WUSERID ;----获取outlook配置profile名字(如果有多个profile名字

AD 脚本kixtart运用之一 ( 网络盘自动映射)

首先我们在Active Directory 用户和计算机工具中,在用户的配置文件下的登陆脚本里输入如下 然后我们在域共享\\nccn.int\NETLOGON\ 下新建一个NEO.bat的文件内容如下 -------------------------------------------- @echo off cmd /c %logonserver%\netlogon\KIX32.EXE %logonserver%\netlogon\kixtart.kix exit --------------