设为首页 收藏本站
查看: 886|回复: 0

15_Shell语言———for循环实例演示(二)

[复制链接]

尚未签到

发表于 2018-8-30 08:14:38 | 显示全部楼层 |阅读模式
  例6:写一个脚本,使用for循环显示用户userA、userB和userC各自的id号;
  使用 id -u 命令可以显示用户的id号,故此脚本可以写成:
  # nano showID.sh
#!/bin/bash  

  
for I in A B C; do
  
  id -u user$I
  
done
  
unset I
  —————————————执行结果—————————————
[root@localhost ~]# ./showID.sh  
3006
  
3007
  
3008
  如果能指明ID号具体属于哪个用户,用户体验会更好,故可对此脚本加以改进:
#!/bin/bash  

  
for I in A B C; do
  
  echo "user$I: `id -u user$I`"
  
done
  
unset I
  —————————————执行结果—————————————
[root@localhost ~]# ./showID.sh  
userA: 3006
  
userB: 3007
  
userC: 3008
  例7:写一个脚本,使用for循环分别统计/usr、/var、/bin、/sbin目录下各自的文件个数;
  使用ls 命令可以列出目录下的所有文件,在将结果通过管道传递给wc命令,即可以计算出文件个数,故此脚本可以写成:
  # nano countDir.sh
#!/bin/bash  

  
for Dir in /usr /var /bin /sbin;do
  
  echo -e “\t$Dir: `ls $Dir | wc -l`”
  
done
  
unset Dir
  —————————————执行结果—————————————
  
[root@localhost ~]# ./countDir.sh
  
        /usr: 12
  
        /var: 21
  
        /bin: 113
  
        /sbin: 284
  例8:写一个脚本, 使用for循环,分别将userA、userB和userC加入到testgrp组中,以其为额外组;
  testgrp这个组不存在,故需要先建立该组。建立该组应该在循环体外面,因为如果建在循环体里面,该组将被创建三次,这是不合理的,故此脚本可以写成:
  # nano testgrpAdd.sh
#!/bin/bash  
groupadd testgrp
  

  
for User in userA userB userC; do
  
  usermod -a -G testgrp $User
  
done
  
unset User
  —————————————执行结果—————————————
[root@localhost ~]# ./testgrpAdd.sh  
[root@localhost ~]# id userA
  
uid=3006(userA) gid=3006(userA) groups=3006(userA),5002(testgrp)
  
[root@localhost ~]# id userB
  
uid=3007(userB) gid=3007(userB) groups=3007(userB),5002(testgrp)
  
[root@localhost ~]# id userC
  
uid=3008(userC) gid=3008(userC) groups=3008(userC),5002(testgrp)
  例9:写一个脚本,使用for循环,将"Hello Linux","Hello World!", "GNU is Not Unix". 三行内容添加至/tmp/test.txt文件;添加完成后,显示/tmp/test.txt文件的内容;
  这里可以将要显示的内容作为变量进行循环;向已存在的文件中追加内容可以使用 >>, 故此脚本可以写成:
  # nano showHello.sh
#!/bin/bash  
for Line in "Hello Linux" "Hello World!" "GNU is Not Unix"; do
  
  echo $Line >> /tmp/test.txt
  
done
  

  
cat /tmp/test.txt
  
unset Line
  —————————————执行结果—————————————
[root@localhost ~]# ./showHello.sh  
Hello Linux
  
Hello World!
  
GNU is Not Unix
  例10:写一个脚本,使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15;
  重命名为原有名称之后加当前日期,可以使用 “date+%F”的形式,故此脚本可以写成:
  # nano cpFile.sh
#!/bin/bash  
for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do
  
  cp $File /tmp$File-`date +%F`
  
done
  
unset File
  ———————————————执行结果——————————————
[root@localhost ~]# ./cpFile.sh  
[root@localhost ~]# ll /tmp/etc
  
total 12
  
-rw-r--r--. 1 root root  860 May 12 10:41 fstab-2014-05-12
  
-rw-r--r--. 1 root root  884 May 12 10:41 inittab-2014-05-12
  
drwxr-xr-x. 3 root root 4096 May 12 10:41 rc.d
  
[root@localhost ~]# ll /tmp/etc/rc.d/init.d
  
total 20
  
-rw-r--r--. 1 root root 18586 May 12 10:41 functions-2014-05-12
  
[root@localhost ~]#
  执行上述脚本时有可能报错,因为File变量保存的是路径,复制后仍然是路径中的名字,如果 /tmp没有/etc目录及其子目录,将无法保存。如果对该脚本进行改进,在复制时加上文件的基名,就能解决这个问题
#!/bin/bash  
for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do
  
FileName=`basename $File`
  
  cp $File /tmp/$FileName-`date +%F`
  
done
  
unset FileName
  
unset File
  ———————————————执行结果——————————————
[root@localhost ~]# ./cpFile.sh  
[root@localhost ~]# ll /tmp
  
drwxr-xr-x. 3 root      root       4096 May 12 10:41 etc
  
-rw-r--r--. 1 root      root        860 May 12 10:53 fstab-2014-05-12
  
-rw-r--r--. 1 root      root      18586 May 12 10:53 functions-2014-05-12
  
-rw-r--r--. 1 root      root        884 May 12 10:53 inittab-2014-05-12
  如果只考虑/etc/fstab /etc/inittab这两个目录,可以将上述脚本简单写成以下形式:
#!/bin/bash  
for File in fstab inittab; do
  
  cp /etc/$File /tmp/$File-`date +%F`
  
done
  
unset File
  ———————————————执行结果——————————————
[root@localhost ~]# ll /tmp  
drwxr-xr-x. 3 root      root       4096 May 12 10:41 etc
  
-rw-r--r--. 1 root      root        860 May 12 10:57 fstab-2014-05-12
  
-rw-r--r--. 1 root      root        884 May 12 10:57 inittab-2014-05-12
  例11:写一个脚本,显示当前系统上所有默认shell为/bin/bash的用户名、ID号及其在/etc/passwd文件中的行号;
  使用grep -n “/bin/bash” /etc/passwd 可以带行号显示该文件的所有以/bin/bash 为默认shell的行,然后再使用cut -d: -f命令切割出相应的段。此脚本如下:
  # nano showBash.sh
#!/bin/bash  
for Bash in `grep -n "/bin/bash" /etc/passwd`;do
  
        echo $Bash >> bash_user_id_line.txt
  
done
  
#注意这里创建了一个临时文件bash_user_id_line.txt供cut命令使用
  
cut -d: -f1,2,4 bash_user_id_line.txt
  
rm bash_user_id_line.txt
  
# 当cut命令使用完临时文件后删除之
  
unset Bash
  ———————————————执行结果——————————————
[root@localhost ~]# ./showBash.sh  
1:root:0
  
34:centos:500
  
35:hbase:503
  
36:openstack:504
  
37:hadoop:506
  
38:ubuntu:1000
  
39:debian:1001
  
40:gentoo:3000
  
Distribution:/home/gentoo
  
41:slackware:1003
  
42:archlinux:2000
  
Weight
  
Distribution:/home/archlinux
  
43:sysuser:496
  
44:sysuser1:495
  
46:moregrp:2002
  
47:redis:2004
  
48:mandriva:2008
  
51:tom:3002
  
54:user2:3004
  
55:user3:3005
  
56:userA:3006
  
57:userB:3007
  
58:userC:3008
  
1:root:0
  
34:centos:500
  
35:hbase:503
  
36:openstack:504
  
37:hadoop:506
  
38:ubuntu:1000
  
39:debian:1001
  
40:gentoo:3000
  
Distribution:/home/gentoo
  
41:slackware:1003
  
42:archlinux:2000
  
Weight
  
Distribution:/home/archlinux
  
43:sysuser:496
  
44:sysuser1:495
  
46:moregrp:2002
  
47:redis:2004
  
48:mandriva:2008
  
51:tom:3002
  
54:user2:3004
  
55:user3:3005
  
56:userA:3006
  
57:userB:3007
  
58:userC:3008
  例12:写一个脚本,显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和shell;
  如果要显示具体哪一行文本,可以使用head -Num 命令选出前Num行,然后将结果传递给tail -1命令,即能显示指定的行,随后使用cut命令切割出具体的字段; 为了使用户体验更好,可以将每个用户的每个字段独立存为一个变量,分别显示,此脚本书写如下:
  # nano show_num_line.sh
for Line in 1 3 6 12; do  
UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`
  
Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`
  
Shell=`head -$Line /etc/passwd | tail -1 | cut -d: -f7`
  

  
echo "$Line User: $UserName, UID is $Uid, Shell: $shell"
  
done
  
unset UserName
  
unset Uid
  
unset Shell
  
unset Line
  ———————————————执行结果——————————————
[root@localhost ~]# ./show_num_line.sh  
1 User: root, UID is 0, Shell:
  
3 User: daemon, UID is 2, Shell:
  
6 User: sync, UID is 5, Shell:
  
12 User: games, UID is 12, Shell:
  例13:写一个脚本, 显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和基本组的组名;
  此例子和上一个例子相似,不同的是取基本组的组名,可以使用 id -gn 命令
  # nano show_user_grp.sh
#!/bin/bash  

  
for Line in 1 3 6 12; do
  
  UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`
  
  Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`
  
  GroupName=`id -gn $UserName`
  
  echo "$Line $UserName, $Uid, $GroupName"
  
done
  ———————————————执行结果——————————————
[root@localhost ~]# ./show_user_grp.sh  
1 root, 0, root
  
3 daemon, 2, daemon
  
6 sync, 5, root
  
12 games, 12, users



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558668-1-1.html 上篇帖子: Linux基础知识——常用shell命令介绍(一) 下篇帖子: Linux系统login shell和non-login shell区别与影响
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表