Linux shell脚本编程(二)

Linux shell脚本编程(二)

  1  练习:求100以内所有偶数之和;
  2 使用至少三种方法实现;
  3 
  4 示例1:
  5 
  6 #!/bin/bash
  7 #
  8 declare -i sum=0        #声明一个变量求和,初始值为0
  9 
 10 for i in $(seq 0 2 100); do
 11     sum=$(($sum+$i))
 12 done
 13 
 14 echo "Even sum: $sum."
 15 
 16 示例2:
 17 
 18 #!/bin/bash
 19 #
 20 declare -i sum=0
 21 
 22 for i in {1..100}; do
 23     if [ $[$i%2] -eq 0 ]; then
 24        sum=$[$sum+$i]
 25     fi
 26 done
 27 
 28 echo "Even sum: $sum."
 29 
 30 增强型赋值:
 31   +=
 32     sum=$[$sum+$i]
 33     let sum+=$i
 34   -=,*=,/=,%=,
 35 
 36     let count=$[$conunt+1] -->let count+=1-->let count++
 37     let count=$[$conunt-1] -->let count-=1-->let count--
 38 
 39 
 40 示例:显示/etc目录下所有的每个普通文件,而后统计一共有多少个这样的文件;
 41 
 42 #!/bin/bash
 43 #
 44 declare -i count=0
 45 
 46 for file in /etc/*; do
 47     if [ -f $file ]; then
 48          let count++
 49          echo "$count $file"
 50     fi
 51 done
 52 
 53 echo "Total: $count files."
 54 
 55 
 56 测试表达式:
 57     整数测试;-gt,-lt,-ge,-le,-eq,-ne
 58     字符串测试:==,>,<,!=,-z,-n,=~
 59 
 60     注意:
 61     (1)字符串等会比较测试[ "$hostname" == 'localhost' ]
 62    (2)模式匹配测试:[[ "STRING" -~ PATTERN ]]
 63 
 64      示例:写一个脚本实现如下功能;
 65        获取当前主机的主机名:
 66            如果当前主机的主机名为空,或者为localhost,则将其修改为www.mageedu.com
 67 
 68     组合测试条件:
 69         条件间逻辑运算:
 70             与:多个条件要同时满足;
 71             或:多个条件满足其一即可;
 72             非:对指定的条件取反;
 73 
 74         表达式组合:
 75             与:[[ CONDITION -a CONDITION2 ]]
 76             或:[[ CONDITION -o CONDITION2 ]]
 77             非:[ !CONDITION ]
 78 
 79         命令组合:
 80             与:COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ]
 81             或:COMMAND1 || COMMAND2
 82             非:!COMMAND
 83 
 84             false && true = false
 85             false && false = false
 86 
 87             true && false = true
 88             true && true = true
 89 
 90             if COMMAND; then
 91                COMMAND2
 92             fi
 93          短路操作符:
 94             true || true = true
 95             true || false = true
 96 
 97             false || true = true
 98             false || false = false
 99 
100           if ! COMMAND1; then
101               COMMAND2
102           fi
103 
104           COMMAND1 && COMMAND2 || COMMAND3
105               if COMMAND1;then
106                    COMMAND2
107               else
108                    COMMAND3
109               fi
110 
111     获取当前主机的主机名:
112            如果当前主机的主机名为空,或者为localhost,则将其修改为www.mageedu.com
113 
114 #!/bin/bash
115 #
116 hostname=$(hostname)
117 
118 if [ -z "$hostname" -o "$hostname"=="localhost" ]; then
119    hostname www.magedu.com
120 fi
121 
122 练习:写一个脚本
123 (1)传递两个文本文件路径给脚本;
124 (2)显示两个文件中空白行数较多的文件及其空白行的个数;
125 (3)显示两个文件中总行数较多的文件及其总行数;
126 练习:写一个脚本
127 (1)提示用户输入一个字符串;
128 (2)判断:
129      如果输入的是quit,则退出脚本;
130      否则,则显示其输入的字符串内容;
131 
132  练习:写一个脚本,打印九九乘法表:
133     循环嵌套
134 
135 #!/bin/bash
136 #
137 for j in {1..9}; do
138    for i in $(seq 1 $j); do
139       echo -n -e "${i}X${j}=$[$i*$j]	"
140    done
141    echo
142 done
143 
144 多分支的if语句:
145      单分支:
146          if CONDITION; then
147              if-true-分支
148          fi
149      双分支:
150          if CONDITION; then
151              if-true-分支
152          else
153              if-false-分支
154          fi
155 
156     多分支:
157          if CONDITION1; then
158             if -CONDITION-true-分支
159         elif CONDITION2; then
160             if-CONDITION2-true-分支
161         ...
162         else
163             if-ALL-false-分支
164         fi
165 
166  示例:通过脚本参数传递一个文件路径给脚本,判断其类型:
167 
168  #!/bin/bash
169 #
170 if [ $# -lt 1 ]; then
171    echo "Usage: $0 <path>"
172    exit 1
173 fi
174 
175 if [ -f $1 ]; then
176    echo "Rgulat file."
177 elif [ -d $1 ]; then
178    echo "Directory."
179 elif [ -h $1 ]; then
180    echo "Symbolic link."
181 elif [ -b $1 ]; then
182    echo "Block special."
183 elif [ -c $1 ]; then
184    echo "Charactoer special."
185 elif [ -S $1 ]; then
186    echo "Socket file."
187 else
188    echo "file not exist or unknow type."
189 fi
190 
191 示例:脚本可接受四个参数
192    start:创建文件/var/lock/subsys/SCRIPT_NAME
193    stop:删除此文件
194    restatr:删除此文件并重新创建
195    status:如果文件存在,显示为“running”;否则,显示为“stopped”
196 
197    basename命令:
198       取得路径的基名:
199 示例:
200 
201 #!/bin/bash
202 #
203 prog=$(basename $0)
204 lockfile="/var/lock/subsys/$prog"
205 #echo $lockfile
206 
207 if [ $# -lt 1 ]; then
208    echo "Usage: $prog start|stop|restart|status"
209    exit 1
210 fi
211 
212 if [ "$1" == "start" ]; then
213     if [ -f $lockfile ]; then
214         echo "$prog is started yes."
215     else
216        touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."
217     fi
218 elif [ "$1" == "stop" ]; then
219     if [ -f $lockfile ]; then
220         rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."
221     else
222         echo "$prog is stopped yet."
223     fi
224 elif [ "$1" == "restart" ]; then
225     if [ -f $lockfile ]; then
226         rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."
227     else
228         touch $lockfile && echo "$prog is stopped, Starting $prog ok..."
229     fi
230 elif [ "$1" == "status" ]; then
231     if [ -f $lockfile ]; then
232         echo "Running..."
233     else
234         echo "Stopped..."
235     fi
236 else
237     echo "Usage: $prog start|stop|restart|status"
238     exit 1
239 fi
240 
241 case语句:
242     简洁版多分支if语句:
243     使用场景:判断某变量的值是否为多种情形中的一种时使用;
244 
245     语法:
246         case $VARIABLE in
247         PATTERN1)
248              分支1
249              ;;
250         PATTERN2)
251              分支2
252              ;;
253         PATTERN3
254              分支3
255              ;;
256         ...
257         *)
258              分支n
259              ;;
260         esac
261 
262         PATTERN可使用glob模式的通配符:
263            *:任意长度的任意字符;
264            ?:任意单个字符;
265            []:指定范围内的任意单个字符;
266            a|b:多选1;
267 
268 示例:提示键入任意一个字符,判断类型:
269 脚本如下:
270 #!/bin/bash
271 #
272 read -p "Plz enter a character: " char
273 
274 case $char in
275 [a-z])
276      echo "A character."
277      ;;
278 [0-9])
279      echo "A digit."
280      ;;
281 *)
282      echo "A special character."
283      ;;
284 esac
285 
286 示例:脚本可接受四个参数
287    start:创建文件/var/lock/subsys/SCRIPT_NAME
288    stop:删除此文件
289    restatr:删除此文件并重新创建
290    status:如果文件存在,显示为“running”;否则,显示为“stopped”
291 
292    脚本如下:
293 
294    #!/bin/bash
295 #
296 prog=$(basename $0)
297 lockfile="/var/lock/subsys/$prog"
298 #echo $lockfile
299 
300 if [ $# -lt 1 ]; then
301    echo "Usage: $prog start|stop|restart|status"
302    exit 1
303 fi
304 case $1 in
305 start)
306     if [ -f $lockfile ]; then
307         echo "$prog is started yes."
308     else
309        touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."
310     fi
311     ;;
312 stop)
313     if [ -f $lockfile ]; then
314         rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."
315     else
316         echo "$prog is stopped yet."
317     fi
318     ;;
319 restart)
320     if [ -f $lockfile ]; then
321         rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."
322     else
323         touch $lockfile && echo "$prog is stopped, Starting $prog ok..."
324     fi
325     ;;
326 status)
327     if [ -f $lockfile ]; then
328         echo "Running..."
329     else
330         echo "Stopped..."
331     fi
332     ;;
333 *)
334     echo "Usage: $prog start|stop|restart|status"
335     exit 1
336 esac
原文地址:https://www.cnblogs.com/hackerer/p/5229697.html