一、for和select循环

1.for循环语法

  1. for 变量名 in 变量取值列表
  2. do
  3. 指令...
  4. done

C语言型for循环

  1. for ((exp1; exp2; exp3))
  2. do
  3. 指令...
  4. done

示例:

  1. for ((i=1;i<=3;i++))
  2. do
  3. echo $i
  4. done

说明:

  • 第一个是变量初始化
  • 第二个是变量范围
  • 第三个是变量自增或自减

2.for循环实践

(1)打印5、4、3、2、1这5个数字

  1. [root@codis-178 ~]# cat 11_1.sh
  2. #!/bin/bash
  3. for num in 5 4 3 2 1
  4. do
  5. echo $num
  6. done
  7. [root@codis-178 ~]# sh 11_1.sh
  8. 5
  9. 4
  10. 3
  11. 2
  12. 1
  13. 其他方式:
  14. [root@codis-178 ~]# cat 11_1_1.sh
  15. #!/bin/bash
  16. for num in {5..1}
  17. do
  18. echo $num
  19. done

(2)获取当前目录下的目录或文件,并将其作为变量列表打印输出

  1. [root@codis-178 ~]# mkdir -p /test/{text.txt,oldboy.txt,oldgirl.txt}
  2. [root@codis-178 ~]# ls -l /test/
  3. total 12
  4. drwxr-xr-x 2 root root 4096 Aug 23 10:42 oldboy.txt
  5. drwxr-xr-x 2 root root 4096 Aug 23 10:42 oldgirl.txt
  6. drwxr-xr-x 2 root root 4096 Aug 23 10:42 text.txt
  7. [root@codis-178 ~]# cat 11_2.sh
  8. #!/bin/bash
  9. cd /test
  10. for filename in `ls`
  11. do
  12. echo $filename
  13. done
  14. [root@codis-178 ~]# sh 11_2.sh
  15. oldboy.txt
  16. oldgirl.txt
  17. text.txt

(3)用for循环批量修改文件扩展名(把txt改成jpg)

  1. [root@codis-178 ~]# cat 11_3.sh
  2. #!/bin/bash
  3. cd /test
  4. for filename in `ls|grep "txt$"`
  5. do
  6. mv $filename `echo $filename|cut -d . -f1`.jpg
  7. done
  8. [root@codis-178 ~]# sh 11_3.sh
  9. [root@codis-178 ~]# ls -l /test/
  10. total 12
  11. drwxr-xr-x 2 root root 4096 Aug 23 10:42 oldboy.jpg
  12. drwxr-xr-x 2 root root 4096 Aug 23 10:42 oldgirl.jpg
  13. drwxr-xr-x 2 root root 4096 Aug 23 10:42 text.jpg
  14. 简介方法:
  15. [root@codis-178 ~]# rename "jpg" "gif" /test/*.jpg
  16. [root@codis-178 ~]# ls -l /test/
  17. total 12
  18. drwxr-xr-x 2 root root 4096 Aug 23 10:42 oldboy.gif
  19. drwxr-xr-x 2 root root 4096 Aug 23 10:42 oldgirl.gif
  20. drwxr-xr-x 2 root root 4096 Aug 23 10:42 text.gif

3.企业应用

(1)批量修改文件名,去掉"_finished"

  1. sed
  2. [root@codis-178 ~]# cat 11_4.sh
  3. #!/bin/bash
  4. cd /test
  5. for file in `ls *.log`
  6. do
  7. mv $file `echo $file|sed 's/_finished//g'`
  8. done
  9. [root@codis-178 ~]# sh 11_4.sh
  10. [root@codis-178 ~]# ll /test/*.log
  11. -rw-r--r-- 1 root root 0 Aug 23 11:03 /test/sku_102999_1.log
  12. -rw-r--r-- 1 root root 0 Aug 23 11:03 /test/sku_102999_2.log
  13. -rw-r--r-- 1 root root 0 Aug 23 11:03 /test/sku_102999_3.log
  14. -rw-r--r-- 1 root root 0 Aug 23 11:03 /test/sku_102999_4.log
  15. -rw-r--r-- 1 root root 0 Aug 23 11:03 /test/sku_102999_5.log
  16. rename版
  17. rename "_finished' "' *.jpg

(2)在生产环境下,批量去掉测试数据所用的bd字符

  1. [root@codis-178 test]# ll
  2. total 0
  3. -rw-r--r-- 1 root root 0 Aug 23 11:09 bd502.html
  4. -rw-r--r-- 1 root root 0 Aug 23 11:09 bd503.html
  5. -rw-r--r-- 1 root root 0 Aug 23 11:09 bd504.html
  6. [root@codis-178 test]# rename "bd" "" *.html
  7. [root@codis-178 test]# ll
  8. total 0
  9. -rw-r--r-- 1 root root 0 Aug 23 11:09 502.html
  10. -rw-r--r-- 1 root root 0 Aug 23 11:09 503.html
  11. -rw-r--r-- 1 root root 0 Aug 23 11:09 504.html

(3)通过脚本实现仅sshd、rsyslog、crond、network、sysstat服务在开机时启动

  1. 方法一:
  2. for oldboy in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|sshd|rsyslog|sysstat"`;do chkconfig $oldboy off;done
  3. 方法二:
  4. chkconfig --list|grep -vE "crond|network|sshd|rsyslog|sysstat"|awk '{print "chkconfig " $1 " off"}'|bash

(4)打印九九乘法表

  1. [root@codis-178 ~]# cat 11_5.sh
  2. #!/bin/bash
  3. COLOR='\E[47;30m'
  4. RES='\E[0m'
  5. for num1 in `seq 9`
  6. do
  7. for num2 in `seq 9`
  8. do
  9. if [ $num1 -ge $num2 ];then
  10. if (((num1*num2)>9))
  11. then
  12. echo -en "${COLOR}${num1}x${num2}=$((num1*num2))${RES} "
  13. else
  14. echo -en "${COLOR}${num1}x${num2}=$((num1*num2))${RES} "
  15. fi
  16. fi
  17. done
  18. echo " "
  19. done
  20. [root@codis-178 ~]# sh 11_5.sh
  21. 1x1=1
  22. 2x1=2 2x2=4
  23. 3x1=3 3x2=6 3x3=9
  24. 4x1=4 4x2=8 4x3=12 4x4=16
  25. 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
  26. 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
  27. 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
  28. 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
  29. 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

(5)计算1到100之和

  1. [root@codis-178 ~]# cat 11_6.sh
  2. #!/bin/bash
  3. for ((i=1;i<=100;i++))
  4. do
  5. ((sum=sum+i))
  6. done
  7. echo $sum
  8. [root@codis-178 ~]# sh 11_6.sh
  9. 5050

4.for循环高级应用

(1)实现MySQL分库备份脚本

  1. [root@codis-178 ~]# cat 11_7.sh
  2. #!/bin/bash
  3. PATH="/app/mysql/bin:$PATH"
  4. DBPATH=/server/backup
  5. MYUSER=root
  6. MYPASS=oldboy123
  7. SOCKET=/data/3306/mysql.sock
  8. MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
  9. MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
  10. [ ! -d "$DBPATH" ] && mkdir $DBPATH
  11. for dbname in `$MYCMD -e "show databases;"|sed '1,2d'|egrep -v "mysql|schema"`
  12. do
  13. $MYDUMP $dbname|gzip >$DBPATH/${dbname}_$(date +%F).sql.gz
  14. done

(2)实现MySQL分库分表备份脚本

  1. 批量插入数据
  2. [root@codis-178 ~]# cat 11_7_1.sh
  3. #!/bin/bash
  4. PATH="/app/mysql/bin:$PATH"
  5. DBPATH=/server/backup
  6. MYUSER=root
  7. MYPASS=oldboy123
  8. SOCKET=/data/3306/mysql.sock
  9. MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
  10. MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
  11. for dbname in oldboy oldgirl xiaoting bingbing
  12. do
  13. $MYCMD -e "use $dbname;create table test(id int,name varchar(16)); insert into test values(1,'testdata');"
  14. done
  15. 备份脚本
  16. [root@codis-178 ~]# cat 11_7_2.sh
  17. #!/bin/bash
  18. PATH="/app/mysql/bin:$PATH"
  19. DBPATH=/server/backup
  20. MYUSER=root
  21. MYPASS=oldboy123
  22. SOCKET=/data/3306/mysql.sock
  23. MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
  24. MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
  25. [ ! -d "$DBPATH" ] && mkdir $DBPATH
  26. for dbname in `$MYCMD -e "show databases;"|sed '1,2d'|egrep -v "mysql|schema"`
  27. do
  28. mkdir $DBPATH/${dbname}_$(date +%F) -p
  29. for table in `$MYCMD -e "show tables from $dbname;"|sed '1d'`
  30. do
  31. $MYDUMP $dbname $table|gzip >$DBPATH/${dbname}_$(date +%F)/${dbname}_${table}.sql.gz
  32. done
  33. done

(3)批量检查Web服务是否正常,并发送相关邮件或手机报警

  1. [root@codis-178 ~]# cat 11_8.sh
  2. #!/bin/bash
  3. path=/server/scripts
  4. MAIL_GROUP="1111@qq.com 2222@qq.com"
  5. PAGER+GROUP="18600338340 18911718229"
  6. LOG_FILE="/tmp/web_check.log"
  7. [ ! -d "$path" ] && mkdir -p $path
  8. function UrlList(){
  9. cat >$path/domain.list<<EOF
  10. http://www.baidu.com
  11. http://www.163.com
  12. http://www.sina.com
  13. EOF
  14. }
  15. function CheckUrl(){
  16. FAILCOUNT=0
  17. for ((i=1;$i<=3;i++))
  18. do
  19. wget -T 5 --tries=1 --spider $1 >/dev/null 2>&1
  20. if [ $? -ne 0 ];then
  21. let FAILCOUNT+=1
  22. else
  23. break
  24. fi
  25. done
  26. return $FAILCOUNT
  27. }
  28. function MAIL(){
  29. local SUBJECT_CONTENT=$1
  30. for MAIL_USER in `echo $MAIL_FROUP`
  31. do
  32. mail -s "$SUBJECT_CONTENT " $MAIL_USER <$LOG_FILE
  33. done
  34. }
  35. function PAGER(){
  36. for PAGER_USER in `echo $PAGER_GROUP`
  37. do
  38. TITLE=$1
  39. CONTACT=$PAGER_USER
  40. HTTPGW=http://oldboy.sms.cn/smsproxy/sendsms.action
  41. curl -d cdkey=5ADF-EFA -d password=OLDBOY -d phone=$CONTACT -d message="$TITLE[$2]" $HTTPGW
  42. done
  43. }
  44. function SendMsg(){
  45. if [ $1 -ge 3 ];then
  46. RETVAL=1
  47. NOW_TIME=`date +%Y-%m-%d %H:%M:%S`
  48. SUBJECT_CONTENT="http://$2 is error,${NOW_TIME}"
  49. echo -e "$SUBJECT_CONTENT" |tee $LOG_FILE
  50. MAIL $SUBJECT_CONTENT
  51. PAGER $SUBJECT_CONTENT $NOW_TIME
  52. else
  53. echo "http://$2 is ok"
  54. RETVAL=0
  55. fi
  56. return $RETVAL
  57. }
  58. function main(){
  59. UrlList
  60. for url in `cat $path/domain.list`
  61. do
  62. CheckUrl $url
  63. SendMsg $? $url
  64. done
  65. }
  66. main

(4)批量建10个账号,并设置密码(随机数,但必须是字符和数字混合)

  1. [root@codis-178 ~]# cat 11_9.sh
  2. #!/bin/bash
  3. . /etc/init.d/functions
  4. user="xiaoda01"
  5. passfile="/tmp/user.log"
  6. for num in `seq -w 10`
  7. do
  8. pass="`echo "test$RANDOM"|md5sum|cut -c 3-11`"
  9. useradd $user$num &>/dev/null &&\
  10. echo -e "$user${num}:$pass" >>$passfile
  11. if [ $? -eq 0 ];then
  12. action "$user$num is ok" /bin/true
  13. else
  14. action "$user$num is fail" /bin/false
  15. fi
  16. done
  17. echo -------------------------------
  18. chpasswd < $passfile
  19. cat $passfile && >$passfile
  20. [root@codis-178 ~]# sh 11_9.sh
  21. xiaoda0101 is ok [ OK ]
  22. xiaoda0102 is ok [ OK ]
  23. xiaoda0103 is ok [ OK ]
  24. xiaoda0104 is ok [ OK ]
  25. xiaoda0105 is ok [ OK ]
  26. xiaoda0106 is ok [ OK ]
  27. xiaoda0107 is ok [ OK ]
  28. xiaoda0108 is ok [ OK ]
  29. xiaoda0109 is ok [ OK ]
  30. xiaoda0110 is ok [ OK ]
  31. -------------------------------
  32. xiaoda0101:1d2311ee7
  33. xiaoda0102:cfa830b4d
  34. xiaoda0103:82920ccf0
  35. xiaoda0104:c74f8c425
  36. xiaoda0105:f54760e68
  37. xiaoda0106:e6d4d939d
  38. xiaoda0107:364ca359e
  39. xiaoda0108:3d1a8afb0
  40. xiaoda0109:c7709971b
  41. xiaoda0110:6d8ab529c

二、随机数生成方法

1.系统变量$RANDOM(0~32767)

  1. [root@codis-178 ~]# echo $RANDOM
  2. 11639
  3. [root@codis-178 ~]# echo $RANDOM
  4. 26729

2.通过openssl产生

  1. [root@codis-178 ~]# openssl rand -base64 8
  2. 093jnyH8wW0=
  3. [root@codis-178 ~]# openssl rand -base64 16
  4. wbdEcXUylW09GcQZdPfumQ==
  5. [root@codis-178 ~]# openssl rand -base64 16
  6. mj2ZsMWN5kGcAxG/uvyeBw==

3.通过时间date

  1. [root@codis-178 ~]# date +%s%N
  2. 1503467625592127445
  3. [root@codis-178 ~]# date +%s%N
  4. 1503467628842171721

4.通过/dev/urandom配合cksum

  1. [root@codis-178 ~]# head /dev/urandom |cksum
  2. 3335560219 3028
  3. [root@codis-178 ~]# head /dev/urandom |cksum
  4. 1646715305 2885

说明:

/dev/urandom设备存储着系统当前运行环境的实时数据,可以看作系统在某个时候的唯一值。

5.通过UUID

  1. [root@codis-178 ~]# cat /proc/sys/kernel/random/uuid
  2. 92062c1c-ccc3-4d4d-939a-827b6f93f3d9
  3. [root@codis-178 ~]# cat /proc/sys/kernel/random/uuid
  4. 5a274f33-ad1c-4ad1-bc86-d6b472dec70a
  5. [root@codis-178 ~]# cat /proc/sys/kernel/random/uuid
  6. 7178879c-fcf7-4acb-8b43-5936bc403336

说明:

UUID码是通用唯一识别码,是一个软件建构的标准,目的是让分布式系统中的所有元素都能有唯一的辨识信息。

6.使用expect附带的mkpasswd

  1. usage: mkpasswd [args] [user]
  2. where arguments are:
  3. -l # (length of password, default = 9) 密码长度
  4. -d # (min # of digits, default = 2) 数字的数量
  5. -c # (min # of lowercase chars, default = 3) 小写字母的数量
  6. -C # (min # of uppercase chars, default = 2) 大写字母的数量
  7. -s # (min # of special chars, default = 1) 特殊字符的数量
  8. -v (verbose, show passwd interaction)
  9. -p prog (program to set password, default = passwd)
  10. [root@codis-178 ~]# mkpasswd -l 16 -d 4 -c 4 -C 4 -s 4
  11. 04r-v3"zIa5G??LC
  12. [root@codis-178 ~]# mkpasswd -l 16 -d 4 -c 4 -C 4 -s 1
  13. HHldb8zZJ%0mh00r
  14. [root@codis-178 ~]# mkpasswd -l 16 -d 4 -c 4 -C 4 -s 4
  15. \D#uC{1#17kVyjM2

总结

统一格式化:使用md5sum|cut -c 2-10

三、select循环

1.select语法

  1. select 变量名 [ in 菜单取值列表 ]
  2. do
  3. 指令...
  4. done

2.select循环的作用

创建菜单

3.实现

  1. [root@codis-178 ~]# cat 11_10.sh
  2. #!/bin/bash
  3. select name in oldboy oldgirl tingting
  4. do
  5. echo $name
  6. done
  7. [root@codis-178 ~]# sh 11_10.sh
  8. 1) oldboy
  9. 2) oldgirl
  10. 3) tingting
  11. #? 1
  12. oldboy
  13. #? 2
  14. oldgirl
  15. #? 3
  16. tingting

调整select菜单项的默认提示符及利用select变量打印数字序号

  1. [root@codis-178 ~]# cat 11_10_1.sh
  2. #!/bin/bash
  3. PS3="please select a num from menu:"
  4. select name in oldboy oldgirl tingting
  5. do
  6. echo -e "I guess you selected the menu is:\n $REPLY) $name"
  7. done
  8. [root@codis-178 ~]# sh 11_10_1.sh
  9. 1) oldboy
  10. 2) oldgirl
  11. 3) tingting
  12. please select a num from menu:1
  13. I guess you selected the menu is:
  14. 1) oldboy
  15. please select a num from menu:2
  16. I guess you selected the menu is:
  17. 2) oldgirl
  18. please select a num from menu:3
  19. I guess you selected the menu is:
  20. 3) tingting

Shell编程之for和select循环的更多相关文章

  1. shell 编程之 for while until 循环

    shell 的for循环 的格式如下: for 变量  in 列表 do ... done 列表是一组值的序列 每个值通过空格隔开 每循环一次,列表中的下一个值赋给变量 in 列表是可选的,如果不用他 ...

  2. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  3. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...

  4. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  5. shell编程之if语句

    shell编程之if判断 目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other 1.整数比较 -eq 等于,如:if [ "$ ...

  6. Shell编程之while循环和until循环

    一.当型和直到型循环 1.while循环语句 while < 条件表达式 > do 指令... done while循环执行流程对应的逻辑图 2.until循环语句 until < ...

  7. shell编程之BASH变量(2)

    变量命名规范 在bash中,变量的默认类型都是字符串型,定义 name = 'kk' 变量分类 用户自定义变量.变量自定义的 环境变量:这种变量中主要保存的是和系统操作环境相关的数据.变量可以自定义, ...

  8. Shell编程之Linux信号及信号跟踪

    一.Linux信号 1.什么是信号? Linux信号是由一个整数构成的异步消息,它可以由某个进程发给其他进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程. 2.信号列表 [root@ ...

  9. Shell编程之Shift的用法

    位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...

随机推荐

  1. Java进阶02 异常处理(转载)

    异常处理 Java的异常处理机制很大一部分来自C++.它允许程序员跳过暂时无法处理的问题,以继续后续的开发,或者让程序根据异常做出更加聪明的处理. Java使用一些特殊的对象来代表异常状况,这样对象称 ...

  2. php 获取当前域名

    #测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br> ...

  3. javascript simple MVC

    <h3>javascript simple MVC</h3> <div> <select name="" id="setAnim ...

  4. 什么是Web Services?

    什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-contained)并可自我描 ...

  5. java String去除两端的空格和空字符

    java中String有个trim()能够去掉一个字符串的前后空格.但是trim()只能去掉字符串中前后的半角空格,而无法去掉全角空格.去掉全角空格需要在trim()方法的基础上加上一些判断.Stri ...

  6. Eclipse 浏览(Navigate)菜单浏览 Eclipse 工作空间

    Eclipse 浏览(Navigate)菜单 浏览 Eclipse 工作空间 浏览(Navigate)菜单提供了多个菜单可以让你快速定位到指定资源. 上图中 Open Type, Open Type ...

  7. makefile编写---.so动态库的生成和调用

    http://blog.sina.com.cn/s/blog_559f6ffc0100fl3z.html  动静 http://blog.csdn.net/yuyunliuhen/article/de ...

  8. hdu 2460(tarjan求边双连通分量+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ...

  9. OpenCV学习笔记:opencv_core模块

    一,简介: opencv最基础的库.包含exception,point,rect,size,slice,vector,matrix,image等数据结构,和相应的操作函数,以及一些基础算法. 二,分析 ...

  10. 【BZOJ3277/3473】串/字符串 后缀数组+二分+RMQ+双指针

    [BZOJ3277]串 Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Inpu ...