当前位置:   article > 正文

【运维知识高级篇】超详细的Shell编程讲解4(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)_shell 调用文件传参 循环

shell 调用文件传参 循环

本篇文章继续给大家介绍Shell编程,包括for循环、并发问题,while循环,流程控制语句,函数传参、函数变量、函数返回值,反向破解MD5等内容。

目录

for循环

一、探测10.0.0.1-10.0.0.254哪些IP在线,ping的通则在线

二、从1加到100

三、99乘法表

四、for循环读取文件,默认以空格取值

五、批量创建用户和删除用户

六、创建user1-user10,共10个用户,只有user5不创建家目录,不允许登录

while循环

一、while从1加到100

二、while读取文件,按照行读取内容

三、while统计行数

流程控制语句

一、exit

二、break

三、continue

函数

一、函数定义

二、函数传参

三、函数变量

四、函数返回值

扩展:反向破解MD5


for循环

  1. for 变量 in [取值列表] 取值列表可以是数字 字符串 变量 序列 命令
  2. do for循环将取到的值以此赋值给变量
  3. 命令即可
  4. done
  5. [root@LB00 Day04]# cat test.sh
  6. #!/bin/bash
  7. for i in a b c
  8. do
  9. echo $i
  10. done
  11. [root@LB00 Day04]# sh test.sh
  12. a
  13. b
  14. c
  15. #也可以在命令行中写for循环
  16. [root@LB00 Day04]# for i in `seq 10`;do echo $i;done
  17. 1
  18. 2
  19. 3
  20. 4
  21. 5
  22. 6
  23. 7
  24. 8
  25. 9
  26. 10
  27. [root@LB00 Day04]# cat test.sh
  28. #!/bin/bash
  29. for i in "a b" c
  30. do
  31. echo $i
  32. done
  33. [root@LB00 Day04]# sh test.sh
  34. a b
  35. c
  36. [root@LB00 Day04]# cat test.sh
  37. #!/bin/bash
  38. for i in 10 20 30
  39. do
  40. echo $i
  41. done
  42. [root@LB00 Day04]# sh test.sh
  43. 10
  44. 20
  45. 30
  46. [root@LB00 Day04]# cat test.sh
  47. #!/bin/bash
  48. for i in {1..5}
  49. do
  50. echo $i
  51. done
  52. [root@LB00 Day04]# sh test.sh
  53. 1
  54. 2
  55. 3
  56. 4
  57. 5
  58. [root@LB00 Day04]# cat test.sh
  59. #!/bin/bash
  60. for i in {a..d}
  61. do
  62. echo $i
  63. done
  64. [root@LB00 Day04]# sh test.sh
  65. a
  66. b
  67. c
  68. d

一、探测10.0.0.1-10.0.0.254哪些IP在线,ping的通则在线

  1. [root@LB00 Day04]# cat test.sh
  2. #!/bin/bash
  3. for i in {1..254}
  4. do
  5. IP=10.0.0.$i
  6. ping -c1 -W1 $IP &> /dev/null
  7. if [ $? -eq 0 ];then
  8. echo $IP 在线
  9. fi
  10. done
  11. [root@LB00 Day04]# sh test.sh
  12. 10.0.0.1 在线
  13. 10.0.0.2 在线
  14. 10.0.0.4 在线
  15. 10.0.0.7 在线
  16. 10.0.0.8 在线
  17. 10.0.0.31 在线
  18. 10.0.0.51 在线
  19. 10.0.0.61 在线
  20. #可以再连接下Xshell过滤下ping
  21. [root@LB00 ~]# ps axu|grep ping
  22. root 13760 0.0 0.1 128552 1272 pts/0 T 09:25 0:00 ping -c1 -W1 10.0.0.107
  23. root 13897 0.0 0.1 128552 1268 pts/0 S+ 09:28 0:00 ping -c1 -W1 10.0.0.109
  24. root 13899 0.0 0.0 112808 964 pts/2 S+ 09:28 0:00 grep --color=auto ping

这样速度慢,我们可以用花括号括住循环体,后面再加&,实现并发,注意并不是所有的循环都使用并发快,如果循环次数过大的情况下,并发多了会过多的占用资源,不利于处理循环体的数据,有些时候甚至比不并发还要慢。

  1. [root@LB00 Day04]# cat test.sh
  2. #!/bin/bash
  3. for i in {1..256}
  4. do
  5. {
  6. IP=10.0.0.$i
  7. ping -c1 -W1 $IP &> /dev/null
  8. if [ $? -eq 0 ];then
  9. echo $IP 在线
  10. fi
  11. } &
  12. done
  13. echo "在线取IP完成......"
  14. [root@LB00 Day04]# sh test.sh #由于是并发,所以出现了顺序错乱,谁先ping好就先返回谁
  15. 10.0.0.4 在线
  16. 10.0.0.2 在线
  17. 10.0.0.31 在线
  18. 10.0.0.1 在线
  19. 10.0.0.8 在线
  20. 10.0.0.7 在线
  21. 10.0.0.51 在线
  22. 10.0.0.61 在线
  23. 在线取IP完成......
  24. #用另一个Xshell过滤,可以看到有很多进程
  25. [root@LB00 ~]# ps axu|grep ping
  26. root 13760 0.0 0.1 128552 1272 pts/0 T 09:25 0:00 ping -c1 -W1 10.0.0.107
  27. root 13945 0.0 0.1 128552 1272 pts/0 T 09:29 0:00 ping -c1 -W1 10.0.0.155
  28. root 13976 0.0 0.1 128552 1276 pts/0 T 09:30 0:00 ping -c1 -W1 10.0.0.26
  29. root 14004 0.0 0.1 128552 1268 pts/0 R+ 09:30 0:00 ping -c1 -W1 10.0.0.10
  30. root 14005 0.0 0.1 128552 1272 pts/0 R+ 09:30 0:00 ping -c1 -W1 10.0.0.5
  31. root 14007 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.15
  32. root 14008 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.16
  33. root 14009 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.14
  34. root 14010 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.12
  35. root 14011 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.13
  36. root 14012 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.17
  37. root 14020 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.18
  38. root 14040 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.19
  39. root 14041 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.22
  40. root 14042 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.24
  41. root 14043 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.23
  42. root 14044 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.20
  43. root 14045 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.21
  44. root 14075 0.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.33
  45. root 14076 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.34
  46. root 14077 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.36
  47. root 14078 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.39
  48. root 14079 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.42
  49. root 14080 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.43
  50. root 14081 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.32
  51. root 14082 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.28
  52. root 14083 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.41
  53. root 14084 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.25
  54. root 14085 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.26
  55. root 14086 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.27
  56. root 14087 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.30
  57. root 14088 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.35
  58. root 14089 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.37
  59. root 14090 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.40
  60. root 14091 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.29
  61. root 14092 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.38
  62. root 14093 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.69
  63. root 14094 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.59
  64. root 14095 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.68
  65. root 14097 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.48
  66. root 14098 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.50
  67. root 14099 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.56
  68. root 14100 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.62
  69. root 14101 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.63
  70. root 14102 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.53
  71. root 14103 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.44
  72. root 14104 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.52
  73. root 14105 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.54
  74. root 14106 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.58
  75. root 14107 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.64
  76. root 14108 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.70
  77. root 14109 0.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.67
  78. root 14110 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.55
  79. root 14112 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.45
  80. root 14113 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.46
  81. root 14114 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.47
  82. root 14115 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.49
  83. root 14116 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.57
  84. root 14117 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.60
  85. root 14118 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.66
  86. root 14119 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.71
  87. root 14120 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.65
  88. root 14126 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.74
  89. root 14127 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.72
  90. root 14128 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.73
  91. root 14129 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.76
  92. root 14130 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.75
  93. root 14136 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.77
  94. root 14142 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.78
  95. root 14143 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.80
  96. root 14144 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.79
  97. root 14145 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.81
  98. root 14146 1.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.83
  99. root 14147 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.84
  100. root 14148 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.85
  101. root 14149 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.86
  102. root 14150 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.82
  103. root 14156 0.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.87
  104. root 14157 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.88
  105. root 14158 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.89
  106. root 14159 0.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.90
  107. root 14160 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.91
  108. root 14170 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.93
  109. root 14171 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.94
  110. root 14172 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.95
  111. root 14173 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.92
  112. root 14175 0.0 0.0 112812 964 pts/2 S+ 09:30 0:00 grep --color=auto ping
  113. root 14176 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.97
  114. root 14177 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.98
  115. root 14178 0.0 0.1 128552 1268 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.96
  116. root 14179 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.99
  117. root 14180 0.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.100
  118. root 14186 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.101
  119. root 14187 0.0 0.1 128552 1276 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.103
  120. root 14188 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.105
  121. root 14189 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.104
  122. root 14190 0.0 0.1 128552 1272 pts/0 S+ 09:30 0:00 ping -c1 -W1 10.0.0.102

并发还可能出现,并发的内容没返回,但是脚本后面的语句已经执行完毕的情况,这种情况下对于有逻辑关系的语句不利,所以使用并发的时候需要考虑这种情况,这时候我们可以使用wait,解决这个问题。

  1. #并发导致逻辑出问题
  2. [root@LB00 Day04]# cat test.sh
  3. #!/bin/bash
  4. for i in {1..256}
  5. do
  6. {
  7. IP=10.0.0.$i
  8. ping -c2 -W2 $IP &> /dev/null
  9. if [ $? -eq 0 ];then
  10. echo $IP 在线
  11. fi
  12. } &
  13. done
  14. echo "在线取IP完成......"
  15. [root@LB00 Day04]# sh test.sh
  16. 在线取IP完成......
  17. [root@LB00 Day04]# 10.0.0.7 在线
  18. 10.0.0.4 在线
  19. 10.0.0.8 在线
  20. 10.0.0.1 在线
  21. 10.0.0.2 在线
  22. 10.0.0.31 在线
  23. 10.0.0.51 在线
  24. 10.0.0.61 在线
  25. [root@LB00 Day04]#
  26. #使用wait控制逻辑
  27. [root@LB00 Day04]# cat test.sh
  28. #!/bin/bash
  29. for i in {1..256}
  30. do
  31. {
  32. IP=10.0.0.$i
  33. ping -c2 -W2 $IP &> /dev/null
  34. if [ $? -eq 0 ];then
  35. echo $IP 在线
  36. fi
  37. } &
  38. done
  39. wait
  40. echo "在线取IP完成......"
  41. [root@LB00 Day04]# sh test.sh
  42. 10.0.0.31 在线
  43. 10.0.0.2 在线
  44. 10.0.0.1 在线
  45. 10.0.0.7 在线
  46. 10.0.0.4 在线
  47. 10.0.0.8 在线
  48. 10.0.0.51 在线
  49. 10.0.0.61 在线
  50. 在线取IP完成......

二、从1加到100

  1. [root@LB00 Day04]# cat 100.sh
  2. #!/bin/bash
  3. sum=0
  4. for i in `seq 100`
  5. do
  6. sum=`echo "$i+$sum"|bc`
  7. done
  8. echo $sum
  9. [root@LB00 Day04]# sh 100.sh
  10. 5050
  11. #用命令也可以
  12. [root@LB00 Day04]# seq -s + 100|bc #-s是用什么分割
  13. 5050

三、99乘法表

  1. [root@LB00 Day04]# cat 99x.sh
  2. #!/bin/bash
  3. for i in `seq 9`
  4. do
  5. for b in `seq $i`
  6. do
  7. printf "$b x $i = $[i*b]\t" #printf是格式化输出
  8. done
  9. printf "\n"
  10. done
  11. [root@LB00 Day04]# sh 99x.sh
  12. 1 x 1 = 1
  13. 1 x 2 = 2 2 x 2 = 4
  14. 1 x 3 = 3 2 x 3 = 6 3 x 3 = 9
  15. 1 x 4 = 4 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16
  16. 1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
  17. 1 x 6 = 6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36
  18. 1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49
  19. 1 x 8 = 8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64
  20. 1 x 9 = 9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81

f42b41e865424056bb9860d5269055ac.png

四、for循环读取文件,默认以空格取值

  1. [root@LB00 Day04]# cat for_file.sh
  2. #!/bin/bash
  3. for i in `cat /etc/hosts`
  4. do
  5. echo $i
  6. done
  7. [root@LB00 Day04]# sh for_file.sh
  8. 127.0.0.1
  9. localhost
  10. localhost.localdomain
  11. localhost4
  12. localhost4.localdomain4
  13. ::1
  14. localhost
  15. localhost.localdomain
  16. localhost6
  17. localhost6.localdomain6
  18. [root@LB00 Day04]# cat user.txt
  19. zhangsan
  20. lisi
  21. wangwu
  22. [root@LB00 Day04]# cat for_file.sh
  23. #!/bin/bash
  24. for i in `cat /server/scripts/Day04/user.txt`
  25. do
  26. useradd $i
  27. done
  28. [root@LB00 Day04]# sh for_file.sh
  29. [root@LB00 Day04]# tail -3 /etc/passwd
  30. zhangsan:x:1007:1007::/home/zhangsan:/bin/bash
  31. lisi:x:1008:1008::/home/lisi:/bin/bash
  32. wangwu:x:1009:1009::/home/wangwu:/bin/bash

五、批量创建用户和删除用户

  1. [root@LB00 Day04]# cat yonghu.sh
  2. #!/bin/bash
  3. read -p "请输入用户的前缀: " qianzhui
  4. if ! [[ $qianzhui =~ ^[a-z] ]];then
  5. echo 请注意前缀输入格式
  6. exit
  7. fi
  8. read -p "请输入要操作的数量: " num1
  9. if ! [[ $num1 =~ ^[0-9]+$ ]];then
  10. echo 请注意输入数量的格式
  11. exit
  12. fi
  13. echo 为您生成如下用户
  14. shuchu=""
  15. for i1 in $(seq $num1)
  16. do
  17. shuchu="$shuchu $qianzhui$i1"
  18. done
  19. echo $shuchu
  20. read -p "您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]" caozuo
  21. if [ $caozuo == y ];then
  22. for i2 in $(seq $num1)
  23. do
  24. id $qianzhui$i2 &> /dev/null
  25. if [ $? -eq 0 ];then
  26. echo "$user 已存在"
  27. else
  28. useradd $qianzhui$i2
  29. if [ $? -eq 0 ];then
  30. echo "$user 创建成功"
  31. fi
  32. fi
  33. done
  34. elif [ $caozuo == d ];then
  35. for i3 in $(seq $num1)
  36. do
  37. id $qianzhui$i3 &> /dev/null
  38. if [ $? -ne 0 ];then
  39. echo "$user 不存在不需要删除"
  40. exit
  41. else
  42. userdel -rf $qianzhui$i3
  43. if [ $? -eq 0 ];then
  44. echo "$user 删除成功"
  45. fi
  46. fi
  47. done
  48. elif [ $caozuo == i ];then
  49. for i4 in $(seq $num1)
  50. do
  51. id $qianzhui$i4
  52. done
  53. echo "用户查询完毕"
  54. else
  55. echo 请输入正确的内容[y|d|i]
  56. fi
  57. [root@LB00 Day04]# sh yonghu.sh
  58. 请输入用户的前缀: qwer
  59. 请输入要操作的数量: 5
  60. 为您生成如下用户
  61. qwer1 qwer2 qwer3 qwer4 qwer5
  62. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]d
  63. 不存在不需要删除
  64. [root@LB00 Day04]# sh yonghu.sh
  65. 请输入用户的前缀: qwer
  66. 请输入要操作的数量: 5
  67. 为您生成如下用户
  68. qwer1 qwer2 qwer3 qwer4 qwer5
  69. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]y
  70. 创建成功
  71. 创建成功
  72. 创建成功
  73. 创建成功
  74. 创建成功
  75. [root@LB00 Day04]# sh yonghu.sh
  76. 请输入用户的前缀: qwer
  77. 请输入要操作的数量: 5
  78. 为您生成如下用户
  79. qwer1 qwer2 qwer3 qwer4 qwer5
  80. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]i uid=1010(qwer1) gid=1010(qwer1) groups=1010(qwer1)
  81. uid=1011(qwer2) gid=1011(qwer2) groups=1011(qwer2)
  82. uid=1012(qwer3) gid=1012(qwer3) groups=1012(qwer3)
  83. uid=1013(qwer4) gid=1013(qwer4) groups=1013(qwer4)
  84. uid=1014(qwer5) gid=1014(qwer5) groups=1014(qwer5)
  85. 用户查询完毕
  86. [root@LB00 Day04]# sh yonghu.sh
  87. 请输入用户的前缀: qwer
  88. 请输入要操作的数量: 5
  89. 为您生成如下用户
  90. qwer1 qwer2 qwer3 qwer4 qwer5
  91. 您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]d
  92. 删除成功
  93. 删除成功
  94. 删除成功
  95. 删除成功
  96. 删除成功

六、创建user1-user10,共10个用户,只有user5不创建家目录,不允许登录

  1. [root@LB00 Day04]# cat yonghu2.sh
  2. #!/bin/bash
  3. for i in `seq 10`
  4. do
  5. if [ $i == 5 ];then
  6. useradd user$i -M -s /sbin/nologin
  7. else
  8. useradd user$i
  9. fi
  10. done
  11. [root@LB00 Day04]# sh yonghu2.sh
  12. [root@LB00 Day04]# tail -10 /etc/passwd
  13. user1:x:1013:1013::/home/user1:/bin/bash
  14. user2:x:1014:1014::/home/user2:/bin/bash
  15. user3:x:1015:1015::/home/user3:/bin/bash
  16. user4:x:1016:1016::/home/user4:/bin/bash
  17. user5:x:1017:1017::/home/user5:/sbin/nologin
  18. user6:x:1018:1018::/home/user6:/bin/bash
  19. user7:x:1019:1019::/home/user7:/bin/bash
  20. user8:x:1020:1020::/home/user8:/bin/bash
  21. user9:x:1021:1021::/home/user9:/bin/bash
  22. user10:x:1022:1022::/home/user10:/bin/bash
  23. [root@LB00 Day04]# ls /home/|grep user
  24. user1
  25. user10
  26. user2
  27. user3
  28. user4
  29. user6
  30. user7
  31. user8
  32. user9
  33. [root@LB00 Day04]# su - user5
  34. su: warning: cannot change directory to /home/user5: No such file or directory
  35. This account is currently not available.

while循环

  1. while [条件表达式] #表达式成立则执行,不成立不执行
  2. do
  3. 可执行命令
  4. done
  5. #死循环,里面如果有read -p就会卡住
  6. while true
  7. do
  8. echo hehe
  9. done
  10. while [ -f /etc/passwd ]
  11. do
  12. echo hehe
  13. done
  14. #循环1-100
  15. i=1
  16. while [ $i -le 100 ]
  17. do
  18. echo $i
  19. let i++
  20. done

一、while从1加到100

  1. [root@LB00 Day04]# cat test.sh
  2. #!/bin/bash
  3. i=1
  4. while [ $i -le 100 ]
  5. do
  6. sum=$[sum+i]
  7. let i++
  8. done
  9. echo $sum
  10. [root@LB00 Day04]# sh test.sh
  11. 5050

二、while读取文件,按照行读取内容

用for也能做,用while方便些

  1. [root@LB00 Day04]# cat yonghu.txt
  2. zs 123
  3. ls 456
  4. lw 789
  5. [root@LB00 Day04]# cat duqu.sh
  6. while read line
  7. do
  8. user=`echo $line|awk '{print $1}'`
  9. pass=`echo $line|awk '{print $2}'`
  10. useradd $user
  11. echo $pass|passwd --stdin $user
  12. done<yonghu.txt
  13. [root@LB00 Day04]# sh duqu.sh
  14. Changing password for user zs.
  15. passwd: all authentication tokens updated successfully.
  16. Changing password for user ls.
  17. passwd: all authentication tokens updated successfully.
  18. Changing password for user lw.
  19. passwd: all authentication tokens updated successfully.
  20. [root@LB00 Day04]# su - zs
  21. [zs@LB00 ~]$ su - ls
  22. Password:
  23. [ls@LB00 ~]$ exit
  24. logout
  25. [zs@LB00 ~]$ exit
  26. logout

用for来操作,需要新设个变量除以2判断奇数还是偶数,奇数是用户名,偶数是密码

  1. [root@LB00 Day04]# cat duqu_for.sh
  2. #!/bin/bash
  3. for i in `cat yonghu.txt`
  4. do
  5. let q++
  6. re=`echo $q%2|bc`
  7. if [ "$re" == 1 ];then
  8. user=$i
  9. useradd $user
  10. else
  11. pass=$i
  12. echo $pass|passwd --stdin $user
  13. fi
  14. done
  15. [root@LB00 Day04]# sh duqu_for.sh
  16. Changing password for user zs.
  17. passwd: all authentication tokens updated successfully.
  18. Changing password for user ls.
  19. passwd: all authentication tokens updated successfully.
  20. Changing password for user lw.
  21. passwd: all authentication tokens updated successfully.
  22. [root@LB00 Day04]# tail -3 /etc/passwd
  23. zs:x:1023:1023::/home/zs:/bin/bash
  24. ls:x:1024:1024::/home/ls:/bin/bash
  25. lw:x:1025:1025::/home/lw:/bin/bash

三、while统计行数

  1. [root@LB00 Day04]# cat hangshu.sh
  2. #!/bin/bash
  3. wenjian=/etc/passwd
  4. while read line
  5. do
  6. let i++
  7. done<$wenjian
  8. echo "$wenjian 中总共 $i 行"
  9. [root@LB00 Day04]# sh hangshu.sh
  10. /etc/passwd 中总共 34

流程控制语句

exit,break,continue

exit                    退出脚本

break                 跳出循环

continue            忽略当前剩余代码,从头继续执行

一、exit

  1. [root@LB00 Day04]# cat liucheng.sh
  2. #!/bin/bash
  3. while true
  4. do
  5. echo 1
  6. exit
  7. echo 2
  8. done
  9. echo 3
  10. [root@LB00 Day04]# sh liucheng.sh
  11. 1

二、break

  1. [root@LB00 Day04]# cat liucheng.sh
  2. #!/bin/bash
  3. while true
  4. do
  5. echo 1
  6. break
  7. echo 2
  8. done
  9. echo 3
  10. [root@LB00 Day04]# sh liucheng.sh
  11. 1
  12. 3

三、continue

  1. [root@LB00 Day04]# cat liucheng.sh
  2. #!/bin/bash
  3. while true
  4. do
  5. echo 1
  6. continue
  7. echo 2
  8. done
  9. echo 3
  10. [root@LB00 Day04]# sh liucheng.sh
  11. 1
  12. 1
  13. 1
  14. ......
  15. #continu使用示例
  16. [root@LB00 Day04]# cat liucheng.sh
  17. #!/bin/bash
  18. while true
  19. do
  20. read -p "请输入密码: " pass
  21. if ! [ $pass == 123456 ];then
  22. echo "密码输入错误"
  23. continue
  24. else
  25. echo "密码输入正确"
  26. break;
  27. fi
  28. done
  29. echo "登录成功"
  30. [root@LB00 Day04]# sh liucheng.sh
  31. 请输入密码: 1
  32. 密码输入错误
  33. 请输入密码: 123456
  34. 密码输入正确
  35. 登录成功

函数

1、完成特定功能的代码块

2、可以复用

3、函数类似变量,先定义再调用,区别是变量不调用也会执行,但是函数不调用不执行

一、函数定义

  1. [root@LB00 Day04]# cat fun.sh
  2. #!/bin/bash
  3. fun1(){
  4. echo "第一种函数定义方法"
  5. }
  6. function fun2 { #注意不加括号有空格
  7. echo "第二种函数定义方法"
  8. }
  9. function fun3(){
  10. echo "第三种函数定义方法"
  11. }
  12. fun1
  13. fun2
  14. fun3
  15. [root@LB00 Day04]# sh fun.sh
  16. 第一种函数定义方法
  17. 第二种函数定义方法
  18. 第三种函数定义方法

与变量不同,函数不调用不执行,变量不调用也执行

  1. [root@LB00 Day04]# cat fun.sh
  2. #!/bin/bash
  3. name=koten
  4. fun1(){
  5. echo "第一种函数定义方法"
  6. }
  7. function fun2 {
  8. echo "第二种函数定义方法"
  9. }
  10. function fun3(){
  11. echo "第三种函数定义方法"
  12. }
  13. [root@LB00 Day04]# sh -x fun.sh
  14. + name=koten

想在当前shell执行,直接source脚本或者. 脚本即可,跟变量同理

  1. [root@LB00 Day04]# source fun.sh
  2. [root@LB00 Day04]# echo $name
  3. koten
  4. [root@LB00 Day04]# fun1
  5. 第一种函数定义方法

二、函数传参

与脚本传参不同,函数中不能直接接受shell的传参

错误方式

  1. [root@LB00 Day04]# cat chuancan.sh
  2. #!/bin/bash
  3. fun1(){
  4. if [ -f $1 ];then
  5. echo 文件存在
  6. else
  7. echo 文件不存在
  8. fi
  9. }
  10. fun1
  11. [root@LB00 Day04]# sh chuancan.sh /etc/passwd #虽然显示存在
  12. 文件存在
  13. [root@LB00 Day04]# sh -x chuancan.sh /etc/passwd #但是看流程,函数中并没有显示
  14. + fun1
  15. + '[' -f ']'
  16. + echo 文件存在
  17. 文件存在

正确用法,直接写到调用名称后面

  1. [root@LB00 Day04]# cat chuancan.sh
  2. #!/bin/bash
  3. fun1(){
  4. if [ -f $1 ];then
  5. echo 文件存在
  6. else
  7. echo 文件不存在
  8. fi
  9. }
  10. fun1 $1
  11. [root@LB00 Day04]# sh chuancan.sh /etc/passwd
  12. 文件存在

注意区分脚本中的参数与函数中的参数

  1. [root@LB00 Day04]# cat chuancan.sh
  2. #!/bin/bash
  3. fun1(){
  4. if [ -f $1 ];then #这个是调用函数的传参
  5. echo $1 文件存在
  6. else
  7. echo $1 文件不存在
  8. fi
  9. }
  10. fun1 $2 $1 #这个是执行脚本时候的传参
  11. [root@LB00 Day04]# sh chuancan.sh /etc/hosts /etc/passwd
  12. /etc/passwd 文件存在

也可以通过变量的方式传参,一开始定义好变量

  1. [root@LB00 Day04]# cat chuancan.sh
  2. #!/bin/bash
  3. file=$1
  4. fun1(){
  5. if [ -f $file ];then
  6. echo $file 文件存在
  7. else
  8. echo $file 文件不存在
  9. fi
  10. }
  11. fun1
  12. [root@LB00 Day04]# sh chuancan.sh /etc/passwd
  13. /etc/passwd 文件存在

三、函数变量

函数中可以调用shell脚本的变量

在函数中定义的变量可以只在函数体中生效,在shell中不生效

  1. #正常是在函数体内外都会生效
  2. [root@LB00 Day04]# cat bianliang.sh
  3. #!/bin/bash
  4. fun1(){
  5. name=koten
  6. echo $name
  7. }
  8. fun1
  9. echo $name
  10. [root@LB00 Day04]# sh bianliang.sh
  11. koten
  12. koten
  13. #只在函数体中生效
  14. [root@LB00 Day04]# cat bianliang.sh
  15. #!/bin/bash
  16. fun1(){
  17. local name=koten
  18. echo $name
  19. }
  20. fun1
  21. echo $name
  22. [root@LB00 Day04]# sh bianliang.sh
  23. koten
  24. [root@LB00 Day04]#

四、函数返回值

exit和return都可以定义

  1. [root@LB00 Day04]# cat fanhuizhi.sh
  2. #!/bin/bash
  3. if [ -f $1 ];then
  4. echo "$1 存在"
  5. exit 100
  6. else
  7. echo "$1 不存在"
  8. exit 50
  9. fi
  10. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwd
  11. /etc/passwd 存在
  12. [root@LB00 Day04]# echo $?
  13. 100
  14. [root@LB00 Day04]# cat fanhuizhi.sh
  15. #!/bin/bash
  16. fun1(){
  17. if [ -f $1 ];then
  18. echo "存在"
  19. return 100
  20. else
  21. echo "不存在"
  22. return 99
  23. fi
  24. }
  25. fun1 $?
  26. echo $?
  27. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwd
  28. 不存在
  29. 99

使用返回值的时候容易出错,我们要时刻注意返回值是否有因为执行了新的命令而刷新

如下所示的错误写法!

  1. [root@LB00 Day04]# cat fanhuizhi.sh
  2. #!/bin/bash
  3. fun1(){
  4. if [ -f $1 ];then
  5. return 100
  6. else
  7. return 50
  8. fi
  9. }
  10. fun1 $1
  11. [ $? -eq 50 ] && echo 文件不存在
  12. [ $? -eq 100 ] && echo 文件存在
  13. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwdd
  14. 文件不存在
  15. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwd
  16. [root@LB00 Day04]#

由于在执行完函数后又执行了$?与50的判断,所以判断后$?刷新成了其他数值,所以永远不会echo出文件存在,这种情况一般有两种解决办法。 

  1. [root@LB00 Day04]# cat fanhuizhi.sh
  2. #!/bin/bash
  3. fun1(){
  4. if [ -f $1 ];then
  5. return 100
  6. else
  7. return 50
  8. fi
  9. }
  10. fun1 $1
  11. [ $? -eq 50 ] && echo 文件不存在
  12. echo $?
  13. [ $? -eq 100 ] && echo 文件存在
  14. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwd
  15. 1

一种是将两个条件表达式写成一个,在使用函数的返回值之前不执行其他命令。

  1. [root@LB00 Day04]# cat fanhuizhi.sh
  2. #!/bin/bash
  3. fun1(){
  4. if [ -f $1 ];then
  5. return 100
  6. else
  7. return 50
  8. fi
  9. }
  10. fun1 $1
  11. [ $? -eq 50 ] && echo 文件不存在 || echo 文件存在
  12. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwd
  13. 文件存在
  14. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwdddd
  15. 文件不存在

另一种也是系统中常做的操作,就是当我们的函数体执行完毕后给一个变量,后面用变量去判断,这样$?有变化也没有关系,反正变量不会有变化。

  1. [root@LB00 Day04]# cat fanhuizhi.sh
  2. #!/bin/bash
  3. fun1(){
  4. [ -f $1 ];then
  5. return 100
  6. else
  7. return 50
  8. fi
  9. }
  10. fun1 $1
  11. re=$?
  12. [ $re -eq 50 ] && echo 文件不存在
  13. [ $re -eq 100 ] && echo 文件存在
  14. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwd
  15. 文件存在
  16. [root@LB00 Day04]# sh fanhuizhi.sh /etc/passwdddd
  17. 文件不存在

扩展:反向破解MD5

下面是随机数的md5值,4个取了前8位,2两个取了前7位,通过脚本反向破解出随机数

  1. echo $((RANDOM))|md5sum|cut -c1-8
  2. 0b364f36
  3. 7f1e6feb
  4. c5b795e2
  5. 5f8b9f68
  6. echo $((RANDOM))|md5sum|cut -c1-7
  7. 081691c
  8. 76728eb

我们的思路就是利用for循环反向破解,优化就是尽可能少的操作,加快遍历速度,更快的破解出来

  1. [root@LB00 Day04]# cat fanxiang.sh
  2. #!/bin/bash
  3. for i in `seq 32767`
  4. do
  5. md5=`echo $i|md5sum`
  6. md5_7=`echo $md5|cut -c1-7`
  7. md5_8=`echo $md5|cut -c1-8`
  8. if [ "$md5_7" == 081691c ];then
  9. echo $i $md5_7
  10. elif [ "$md5_7" == 76728eb ];then
  11. echo $i $md5_7
  12. elif [ "$md5_8" == 0b364f36 ];then
  13. echo $i $md5_8
  14. elif [ "$md5_8" == 7f1e6feb ];then
  15. echo $i $md5_8
  16. elif [ "$md5_8" == c5b795e2 ];then
  17. echo $i $md5_8
  18. elif [ "$md5_8" == 5f8b9f68 ];then
  19. echo $i $md5_8
  20. fi
  21. done
  22. [root@LB00 Day04]# sh fanxiang.sh
  23. 691 c5b795e2
  24. 5343 081691c
  25. 11902 7f1e6feb
  26. 21364 76728eb
  27. 25375 5f8b9f68
  28. 30458 0b364f36

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/304558
推荐阅读
相关标签
  

闽ICP备14008679号