首页 > 代码库 > Linux常用Shell脚本

Linux常用Shell脚本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本。如何学好脚本,最关键的是就是大量的练习 和实践。根据以下脚本我们可以拓展,这样我们提高的很快!举一反三!
  
1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。
 
参考程序:
C代码  收藏代码
#!/bin/sh 
FILENAME= 
echo “Input file name:” 
read FILENAME 
if [ -c "$FILENAME"
then 
cp $FILENAME /dev 
fi  
  
2.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
 
参考答案:
C代码  收藏代码
#!/bin/sh 
i=1 
groupadd class1 
while [ $i -le 30 ] 
do 
if [ $i -le 9 ] ;then 
USERNAME=stu0${i} 
else 
USERNAME=stu${i} 
fi 
useradd $USERNAME 
mkdir /home/$USERNAME 
chown -R $USERNAME /home/$USERNAME 
chgrp -R class1 /home/$USERNAME 
i=$(($i+1)) 
done 
 
3.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。
  
参考程序:
C代码  收藏代码
#!/bin/sh 
i=1 
while [ $i -le 50 ] 
do 
userdel -r stud${i} 
i=$(($i+1 )) 
done 
 
4.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;
(2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;
(3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
(4)在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc);
(5)在早晨8:00前开机后启动。
 
参考答案:
解决方案:
(1)用vi创建编辑一个名为prgx的crontab文件;
(2)prgx文件的内容:
C代码  收藏代码
50 16 * * * rm -r /abc/* 
0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt 
50 17 * * * tar zcvf backup.tar.gz /data 
55 17 * * * umount /dev/hdc 
  
(3)由超级用户登录,用crontab执行 prgx文件中的内容:
root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。
 
5.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。
  
参考答案:
(1)编写shell程序fileback:
C代码  收藏代码
#!/bin/sh 
DIRNAME=`ls /root | grep bak` 
if [ -z "$DIRNAME" ] ; then 
mkdir /root/bak 
cd /root/bak 
fi 
YY=`date +%y` 
MM=`date +%m` 
DD=`date +%d` 
BACKETC=$YY$MM$DD_etc.tar.gz 
tar zcvf $BACKETC /etc 
echo “fileback finished!” 
  
(2)编写任务定时器:
C代码  收藏代码
echo “0 0 1 * * /bin/sh /usr/bin/fileback” >; /root/etcbakcron 
crontab /root/etcbakcron 
或使用crontab -e 命令添加定时任务: 
0 1 * * * /bin/sh /usr/bin/fileback 
  
6.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?
  
参考答案:
  
(1)第一种方法:
C代码  收藏代码
用户应使用crontab –e 命令创建crontab文件。格式如下: 
0 0 * * sun cp –r /user/backup /tmp 
  
(2)第二种方法:
用户先在自己目录下新建文件file,文件内容如下:
C代码  收藏代码
0 * * sun cp –r /user/backup /tmp 
然后执行 crontab file 使生效。
  
7.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。
  
参考答案: 建立程序 Pro16如下:
C代码  收藏代码
#!/bin/sh 
i=1 
while [ i -le 50 ] 
do 
if [ -d /userdata ];then 
mkdir -p /userdata/user$i 
chmod 754 /userdata/user$i 
echo “user$i” 
let “i = i + 1″ (或i=$(($i+1)) 
else 
mkdir /userdata 
mkdir -p /userdata/user$i 
chmod 754 /userdata/user$i 
echo “user$i” 
let “i = i + 1″ (或i=$(($i+1)) 
fi 
done 
  
8、mysql备份实例,自动备份mysql,并删除30天前的备份文件
C代码  收藏代码
#!/bin/sh 
   
#auto backup mysql 
#wugk  2012-07-14 
#PATH DEFINE 
   
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` 
MYSQLDB=www 
MYSQLPW=backup 
MYSQLUSR=backup 
   
if[ $UID -ne 0 ];then 
echo This script must use administrator or root user ,please exit
sleep 2 
exit
fi 
   
if[ ! -d $BAKDIR ];then 
mkdir -p $BAKDIR 
else 
echo This is $BAKDIR exists ,please exit …. 
sleep 2 
exit 
fi 
   
###mysqldump backup mysql 
   
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >/data/backup/mysql/`date +%Y-%m-%d`/www_db.sql 
   
cd $BAKDIR ; tar -czf  www_mysql_db.tar.gz *.sql 
   
cd $BAKDIR ;find  . -name “*.sql” |xargs rm -rf[ $? -eq 0 ]&&echo “This `date +%Y-%m-%d` RESIN BACKUP is SUCCESS” 
   
cd /data/backup/mysql/ ;find . -mtime +30 |xargs rm -rf 
  
9、自动安装Nginx脚本,采用case方式,选择方式,也可以根据实际需求改成自己想要的脚本
C代码  收藏代码
#!/bin/sh 
   
###nginx install shell 
###wugk 2012-07-14 
###PATH DEFINE 
   
SOFT_PATH=/data/soft/ 
NGINX_FILE=nginx-1.2.0.tar.gz 
DOWN_PATH=http://nginx.org/download/ 
   
if[ $UID -ne 0 ];then 
echo This script must use administrator or root user ,please exit
sleep 2 
exit
fi 
   
if[ ! -d $SOFT_PATH ];then 
mkdir -p $SOFT_PATH 
fi 
   
download () 
cd $SOFT_PATH ;wget $DOWN_PATH/$NGINX_FILE 
   
install () 
yum install pcre-devel -y 
cd $SOFT_PATH ;tar xzf $NGINX_FILE ;cd nginx-1.2.0/ &&./configure –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-http_ssl_module 
[ $? -eq 0 ]&&make &&make install 
   
start () 
lsof -i :80[ $? -ne 0 ]&&/usr/local/nginx/sbin/nginx 
   
stop () 
ps -ef |grep nginx |grep -v grep |awk ‘{print $2}’|xargs kill -9 
   
exit () 
echo $? ;exit 
   
###case menu ##### 
   
case $1 in 
download ) 
download 
;; 
   
install ) 
install 
;; 
   
start ) 
start 
;; 
stop ) 
stop 
;; 
   
* ) 
   
echo “USAGE:$0 {download or install or start or stop}” 
exit 
esac 
  
10、批量解压tar脚本,批量解压zip并且建立当前目录。
C代码  收藏代码
#!/bin/sh 
PATH1=/tmp/images 
PATH2=/usr/www/images 
for i in `ls ${PATH1}/*` 
do 
tar xvf  $i  -C $PATH2 
done 
  
这个脚本是针对所有tar文件在一个目录,但是实际情况中,有可能在下级或者更深的目录,我们可以使用find查找
C代码  收藏代码
#!/bin/sh 
PATH1=/tmp/images 
PATH2=/usr/www/images 
for i in `find  $PATH1  -name  ”*.tar” ` 
do 
tar xvf  $i  -C $PATH2 
done 
  
如何是zip文件,例如123189.zip 132342.zip 等等批量文件,默认unzip直接解压不带自身目录,意思是解压123189.zip完当前目录就是图片,不能创建123189目录下并解压,可以用shell脚本实现
C代码  收藏代码
#!/bin/sh 
PATH1=/tmp/images 
PATH2=/usr/www/images 
cd $PATH1 
   
for i in `find  . -name  ”*.zip”|awk  -F.  {print $2} ` 
do 
   
mkdir -p   PATH2$i 
   
unzip -o  .$i.zip  -d   PATH2$i 
done  
  
原创文章转载请注明: Linux常用Shell脚本珍藏 | 专注Unix/Linux领域
  
ssh 批量上传文件
 
上传文件大多数用的是ftp,但是用ftp有一点不好,就是本地和远程的目录要对应,这样就要在多个目录下去切换,这样挺麻烦的,如果不注意的话,很有可能传错。所以想了个办法利用scp来批量上传文件或者目录。
  
一,scp上传不要输入密码
如果要用scp来上传文件,第一步就要去掉scp上传时要输入密码。要不然就没办法批量上传了。具体请参考:ssh 不用输入密码
  
二,ssh批量上传脚本
  
1,要上传的文件列表放到一个test文件中
C代码  收藏代码
root@ubuntu:/home/zhangy# cat test   
/home/zhangy/test/aaa   
/home/zhangy/test/nginx.conf   
     
/home/zhangy/test/test.sql   
/home/zhangy/test/pa.txt   
/home/zhangy/test/password   
  
上面就要上传的文件。
  
2,批量上传的脚本
  
vim file_upload.sh
C代码  收藏代码
#!/bin/sh 
   
DATE=`date +%Y_%m_%d_%H` 
   
if [ $1 ] 
then 
  for file in $(sed ‘/^$/d‘ $1)     //去掉空行 
  do 
    if [ -f $file ]                 //普通文件 
    then 
      res=`scp $file $2:$file`      //上传文件 
      if [ -z $res ]                //上传成功 
      then 
        echo $file >> ${DATE}_upload.log   //上传成功的日志 
      fi 
    elif [ -d $file ]              //目录 
    then 
      res=`scp -r $file $2:$file` 
      if [ -z $res ] 
      then 
        echo $file >> ${DATE}_upload.log 
      fi 
    fi 
  done 
else 
  echo "no file" >> ${DATE}_error.log 
fi 
  
上传成功后,返回的是一个空行,上传不成功,什么都不返回
  
3,上传的格式
C代码  收藏代码
./file_upload.sh test 192.168.1.13   
test是上传列表文件,192.168.1.13文件要传到的地方。
0
 
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/linux/1356.html
  
1. 转换文件大小写:
A script to convert the specified filenames to lower case.
  
C代码  收藏代码
#!/bin/sh 
 # lowerit 
# convert all file names in the current directory to lower case 
# only operates on plain files--does not change the name of directories 
# will ask for verification before overwriting an existing file 
for x in `ls` 
do 
    if [ ! -f $x ]; then 
        continue 
    fi 
    lc=`echo $x  | tr ‘[A-Z]‘ ‘[a-z]‘
    if [ $lc != $x ]; then 
        mv -i $x $lc 
    fi 
done 
  
  
or
  
C代码  收藏代码
if test $# = 0 
then 
    echo "Usage $0: <files>" 1>&2 
    exit
fi 
   
for filename in "$@" 
do 
    new_filename=`echo "$filename" | tr A-Z a-z` 
    test "$filename" = "$new_filename" && continue 
    if test -r "$new_filename" 
    then 
        echo "$0: $new_filename exists" 1>&2 
    elif test -e "$filename" 
    then 
        mv "$filename" "$new_filename" 
    else 
        echo "$0: $filename not found" 1>&2 
    fi 
done 
  
  
2. 看网站 Watch a Website
  
A script to repeated download a webpage until it matches a regex then notify an e-mail address.
For example to get e-mail when Kesha tickets (not for yourself of course) go on sale you might run:
  
C代码  收藏代码
% watch_website.sh http://ticketek.com.au/ ‘Ke[sS$]+ha‘ andrewt@cse.unsw.edu.au 
   
   
repeat_seconds=300  #check every 5 minutes 
   
if test $# = 3 
then 
    url=$1 
    regexp=$2 
    email_address=$3 
else 
    echo "Usage: $0 <url> <regex>" 1>&2 
    exit
fi 
   
while true 
do 
    if wget -O- -q "$url"|egrep "$regexp" >/dev/null 
    then 
        echo "Generated by $0" | mail -s "$url now matches $regexp" $email_address 
        exit
    fi 
    sleep $repeat_seconds 
done 
  
  
3. 转GIF到PNG convert GIF files to PNG
  
This scripts converts GIF files to PNG files via the intermediate PPM format.
  
C代码  收藏代码
if [ $# -eq 0 ] 
then 
    echo "Usage: $0 files..." 1>&2 
    exit
fi 
   
if ! type giftopnm 2>/dev/null 
then 
    echo "$0: conversion tool giftopnm not found " 1>&2 
    exit
fi 
   
# missing "in ..." defaults to in "$@" 
for
do 
    case "$f" in 
    *.gif) 
        # OK, do nothing 
        ;; 
    *) 
        echo "gif2png: skipping $f, not GIF" 
        continue 
        ;; 
    esac 
   
    dir=`dirname "$f"
    base=`basename "$f" .gif` 
    result="$dir/$base.png" 
   
    giftopnm "$f" | pnmtopng > $result && echo "wrote $result" 
done 
  
  
4.  计数 Counting
  
A utility script to print the sub-range of integers specified by its arguments.
Useful to use on the command line or from other scripts
  
C代码  收藏代码
if test $# = 1 
then 
    start=1 
    finish=$1 
elif test $# = 2 
then 
    start=$1 
    finish=$2 
else 
    echo "Usage: $0 <start> <finish>" 1>&2 
    exit
fi 
   
for argument in "$@" 
do 
    if echo "$argument"|egrep -v ‘^-?[0-9]+$‘ >/dev/null 
    then 
        echo "$0: argument ‘$argument‘ is not an integer" 1>&2 
        exit
    fi 
done 
   
number=$start 
while test $number -le $finish 
do 
    echo $number 
    number=`expr $number + 1`    # or number=$(($number + 1)) 
done 
  
  
5. 字频率 Word Frequency
Count the number of time each different word occurs in the files given as arguments.
  
C代码  收藏代码
sed ‘s/ /\n/g‘ "$@"|      # convert to one word per line 
tr A-Z a-z|               # map uppercase to lower case 
sed "s/[^a-z‘]//g"|       # remove all characters except a-z and ‘   
egrep -v ‘^$‘|             # remove empty lines 
sort|                     # place words in alphabetical order 
uniq -c|                  # use uniq to count how many times each word occurs 
sort -n                   # order words in frequency of occurrance 
 For example
  
  
C代码  收藏代码
% cd /home/cs2041/public_html/lec/shell/examples 
% ./word_frequency.sh dracula.txt|tail 
   2124 it 
   2440 that 
   2486 in 
   2549 he 
   2911 a 
   3600 of 
   4448 to 
   4740 i 
   5833 and 
   7843 the 
  
  
6. Finding
  
Search $PATH for the specified programs
C代码  收藏代码
if test $# = 0 
then 
    echo "Usage $0: <program>" 1>&2 
    exit
fi 
   
for program in "$@" 
do 
    program_found=‘‘ 
    for directory in `echo "$PATH" | tr ‘:‘ ‘ ‘
    do 
        f="$directory/$program" 
        if test -x "$f" 
        then 
            ls -ld "$f" 
            program_found=1 
        fi 
    done 
    if test -z $program_found 
    then 
        echo "$program not found" 
    fi 
done 
  
Alternative implementation using while, and a cute use of grep and ||
C代码  收藏代码
if test $# = 0 
then 
    echo "Usage $0: <program>" 1>&2 
    exit
fi 
   
for program in "$@" 
do 
    echo "$PATH"
    tr ‘:‘ ‘\n‘
    while read directory 
    do 
        f="$directory/$program" 
        if test -x "$f" 
        then 
            ls -ld "$f" 
        fi 
    done| 
    egrep ‘.‘ || echo "$program not found" 
done 
  
And another implementation using while, and a cute use of grep and ||
C代码  收藏代码
if test $# = 0 
then 
    echo "Usage $0: <program>" 1>&2 
    exit
fi 
for program in "$@" 
do 
    n_path_components=`echo $PATH|tr -d -c :|wc -c` 
    index=1 
    while test $index -le $n_path_components 
    do 
        directory=`echo "$PATH"|cut -d: -f$index` 
        f="$directory/$program" 
        if test -x "$f" 
        then 
            ls -ld "$f" 
            program_found=1 
        fi 
        index=`expr $index + 1` 
    done 
    test -n $program_found || echo "$program not found" 
done 
  
来源: http://www.cse.unsw.edu.au/~cs2041/12s2/lec/shell/examples.notes.html