Linux shell脚本编程

--------------------------------------------------------------------
注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895817687
--------------------------------------------------------------------
1 流程控制:
  2        循环语句:for,while,until
  3 
  4        while循环:
  5 
  6            while CONDITION; do
  7                循环体
  8             done
  9 
 10             进入条件:当CONDITION为“真”;
 11             退出条件:当CONDITION为“假”;
 12 
 13             while CONDITION; do
 14                 循环体
 15                 控制变量的修正表达式
 16             done
 17 
 18             示例:求100以内所有正整数之和;
 19                         #!/bin/bash
 20                         #
 21                         declare -i sum=0
 22                         declare -i i=1
 23 
 24                         while [ $i -le 100 ]; do
 25                               let sum+=$i
 26                               let i++
 27                         done
 28 
 29                         echo "Sum: $sum."
 30 
 31         练习:分别求100以内所有奇数之和,及所有偶数之和;
 32 
 33         示例:打印九九乘法表;
 34                   #!/bin/bash
 35                   #
 36                   declare -i i=1
 37                   declare -i j=1
 38 
 39                   while [ $j -le 9 ]; do
 40                        while [ $i -le $j ]; do
 41                             echo -e -n "${i}X${j}=$[$i*$j]\t"
 42                             let i++
 43                        done
 44                        echo
 45                        let i=1
 46                        let j++
 47                   done
 48 
 49         until循环:
 50              until CONDITION; do
 51                    循环体
 52                    循环控制变量的修正表达式
 53               done
 54 
 55               进入条件:当CONDITION为“假”时
 56               退出条件:当CONDITION为“真”时
 57 
 58               示例:求100以内正整数之和;
 59               #!/bin/bash
 60               #
 61               declare -i sum=0
 62               declare -i i=1
 63 
 64               until [ $i -gt 100 ]; do
 65                    let sum+=$i
 66                    let i++
 67               done
 68 
 69               echo "Sum:$sum."
 70         练习1:分别求100以内所有偶数之和,以及所有奇数之和;
 71         练习2:实现九九乘法表;
 72         练习3:分别使用while和until循环实现添加10个用户:user-user10;
 73 
 74       循环控制:
 75            continue:提前结束本轮循环,而直接进入下一轮;
 76            break [n]:提前结束循环;
 77           
 78            while CONDTION;do
 79               .......
 80                if CONDITION; then
 81                    break [n]
 82                fi
 83            done
 84 
 85            while CONDTION;do
 86               .......
 87                if CONDTION2; then
 88                    continue [n]
 89                fi
 90                .......
 91 
 92                示例:求100以内所有偶数之和;
 93                 #!/bin/bash
 94                 #
 95                 declare -i sum=0
 96                 declare -i i=0
 97 
 98                 while [ $i -le 100 ]; do
 99                      let i++
100                      if [ $[$i%2] -eq 1 ]; then
101                          echo "$i is a odd."
102                          continue
103                      fi
104                      let sum+=$i
105                 done
106 
107                 echo "Sum:$sum."
108 
109           死循环:
110               while true; do
111                    循环体
112                    if CONDITION; then
113                       break
114                    fi
115                 done
116 
117                 until false; do
118                    循环体
119                    if CONDITION; then
120                       break
121                    fi
122                 done
123 
124             示例;每隔3秒钟查看当前系统是否有名为'gentoo'的用户登录;
125                如果其次查看gentoo登录了,则显示gentoo已经登录;
126                如果未登录,就显示仍然未开始,并显示这是已经是第多少次查看了;
127 
128                 #!/bin/bash
129                 #
130                 username=$1
131                 declare -i count=0
132 
133                 while true; do
134                    if  who | grep "^$username" &> /dev/null; then
135                          echo "$username is logged."
136                          break
137                    else
138                        let count++
139                        echo "$count $username is not login."
140                    fi
141                    sleep 3
142                 done
143 
144             示例:2
145 
146                 #!/bin/bash
147                 #
148                 declare -i count=0
149                 username=$1
150 
151                 if [ $# -lt 1 ]; then
152                     echo "At lease one argument."
153                     exit 1
154                 fi
155 
156                 if ! id $username &> /dev/null; then
157                     echo "No such user."
158                     exit 2
159                 fi
160 
161                 until who | grep "^$username" &> /dev/null; do
162                     let count++
163                     echo "$count $username is not login."
164                     sleep 3
165                 done
166                 echo "$username is logged on."
167 
168 
169         while循环的特殊用法:
170             遍历文件的每一行:
171                 while read VARIABLE; do
172                     循环体
173                 done < /PATH/FROM/SOME_FILE
174 
175             示例:找出UID为偶数的所有用户显示其用户名和ID号;
176             #!/bin/bash
177             #
178             while read line; do
179                 userid=$(echo $line | cut -d: -f3)
180                 if [ $[$userid%2] -eq 0 ]; then
181                   echo $line | cut -d: -f1,3
182                 fi
183             done < /etc/passwd
184 
185 
186         for循环的特殊用法:
187            for((expr1;expr2;expr3)); do
188                循环体
189            done
190 
191            expr1:定义控制变量,并初始赋值;
192            expr2:循环控制条件;
193                 进入条件:控制条件为“真”
194                 退出条件:控制条件为“假”
195 
196            expr3:修正控制变量
197 
198             示例:求100以内所有正整数之和;
199 
200       练习1:打印九九乘法表:
201       练习2:传递一个文本文件为参数给脚本,取出此文件的所有的偶数行给予显示,行前要显示行号;
202 
203     函数:
204        function:功能
205           把一段具有独立功能代码封装在一起,并给予命名;后续用到时,可直接通过给定函数名来调用整体代码;
206 
207           函数作用:
208               代码重用:
209               模块化编程:
210 
211         函数的使用方法:
212             先定义:编写函数代码
213             后调用:给出函数名,还可以按需传递参数;
214 
215         定义方法:
216         (1)function f_name {
217                  函数体
218              }
219          (2)f_name() {
220                  函数体
221              }
222 
223         调用函数:
224             f_name [argu1,argu2,...]
225 
226         自定义函数状态返回值:
227              return [#]
228                   0:成功
229                   1-255:失败
230                   注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;
231         示例:此前的服务脚本
232 
233         #!/bin/bash
234         #
235         prog=$(basename $0)
236         lockfile="/var/lock/subsys/$prog"
237         #echo $lockfile
238 
239         if [ $# -lt 1 ]; then
240            echo "Usage: $prog start|stop|restart|status"
241            exit 1
242         fi
243 
244         start() {
245             if [ -f $lockfile ]; then
246                 echo "$prog is started yes."
247             else
248                touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."
249             fi
250         }
251         stop() {
252             if [ -f $lockfile ]; then
253                 rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."
254             else
255                 echo "$prog is stopped yet."
256             fi
257         }
258         restart() {
259             if [ -f $lockfile ]; then
260                 rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."
261             else
262                 touch $lockfile && echo "$prog is stopped, Starting $prog ok..."
263             fi
264         }
265         status() {
266             if [ -f $lockfile ]; then
267                 echo "Running..."
268             else
269                 echo "Stopped..."
270             fi
271         }
272 
273         case $1 in
274         start)
275              start
276              ;;
277         stop)
278             stop
279              ;;
280         restart)
281              restart
282              ;;
283         status)
284              status
285              ;;
286 
287         *)
288             echo "Usage: $prog start|stop|restart|status"
289             exit 1
290         esac
291     示例:判断用户ID号的奇偶性
292 
293     #!/bin/bash
294     #
295     evenid() {
296        if [ $# -lt 1 ]; then
297            return 1
298        fi
299        
300        if ! id $1 &> /dev/null; then
301            return 2
302        fi
303       
304        userid=$(id -u $1)
305        if [ $[$userid%2] -eq 0 ]; then
306           echo "$1,Even user ID."
307        else
308           echo "$1,Odd user ID."
309        fi
310     }
311 
312     evenid root
313 
314     evenid
315     echo $?
316 
317     evenid rooooooot
318     echo $?
319 
320    模块化编程
321        示例:
322           架设/root/bin/srv目录有两个文件:
323            (1)函数文件
324            (2)脚本文件
325 
326     为脚本使用配置文件
327         一个文件中只定义变量
328         脚本文件source此变量定义的文件
329 
330     变量的作用域:
331          局部变量:
332             local VARIABLE=value
333 
334          存活时间:
335             函数执行开始,至函数返回结束;