linux编程基础(三)

1.1 for循环语句

     在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行。     它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数。这使得for循环能够知道在迭代过程中的执行顺序。

1.1.1 shell中的for循环

shell中的for 循环与在c中不同,它包含三种形式:第一种结构是列表for 循环;第二种结构就是不带列表的for循环;第三种就类似于C语言。

①   列表for循环(常用)

#!/bin/bash

for i in 取值列表

do循环主体/命令

done

②   不带列表for循环(示例)

#!/bin/absh

echo "linux的blog:"

for i

do

echo "$i"

done   

脚本执行结果

[[email protected] for]# sh for2.sh http://blog.george.comlinux的blog:

http://blog.george.com

 

③   类似C语言的风格(这种用法常在C语语言中使用)

for((exp1;exp2;exp3))

do

指令...

done

编写类似C语言风格脚本

for((i=0;i<=3;i++))

do

echo $i

done

1.1.2 不同语言的For循环

Shell中的两种样式

# 样式一:

for i in 1 2 3

do

echo $i

done

# 样式二:

for i in 1 2 3;do echo $i;done

JAVA

for(int i = 0; i < 5; i++){

//循环语句;

}  

PHP

for ($i = 0; $i < 5; $i++) {

# statements;

}

VB

For i = 1 To 5

===PASCAL===

for not i=1 do

begin

i=0;

writeln('Go on!');

end.

‘循环语句

Next i

swift

var x = 0for i in 1...100{

x += i

}

print(x)

//

5050for _ in 1...100{

x += 1

}print(x)

// 100

var box = [1,2,3,4,5]

for i in box{

print(i)

}

/*

1

2

3

4

5

*/---

1.2 for循环相关练习题

1.2.1 【练习题1】批量生成随机字符文件名案例

使用for循环在/kai目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串kai,名称示例如下:[[email protected] C19]# ls /kai

apquvdpqbk_kai.html mpyogpsmwj_kai.html txynzwofgg_kai.html

bmqiwhfpgv_kai.html udrzobsprf_kai.html vjxmlflawa_kai.html

jhjdcjnjxc_kai.html qeztkkmewn_kai.html jpvirsnjld_kai.html

ruscyxwxai_kai.html

脚本内容

方法一:

生成全字母随机数的方法:uuidgen|tr '0-9-' 'a-z'

[ -d /kai ] || mkdir -p /kai

cd /kai && \

for i in {1..10}

do

suiji=`uuidgen|tr '0-9-' 'a-z'|cut -c 1-10`

touch ${suiji}_kai.html

done

方法二:

12 [ -d /kai ] || mkdir -p /kai

13 rpm -qa |grep pwgen &>/dev/null14 if [ $? -eq 1 ]

15 then

16 yum install pwgen -y &>/dev/null17 fi18

19 cd /kai &&\

20 for i in {1..10}

21 do

22 #File_Name=`uuidgen |tr "0-9-" "a-z"|cut -c 1-10`

23 File_Name2=`pwgen -1A0 10`

24 touch ${File_Name2}_kai.html

25 done

脚本执行结果

[[email protected] for]# ls -l /kai

-rw-r--r-- 1 root root 0 12月 8 19:41 aegheiriek_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 aifohxique_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 caexahween_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 ciefaivaib_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 eixongooph_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 foozaivedo_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 ireeteethu_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 ohmeebivae_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 oiceehahth_kai.html

-rw-r--r-- 1 root root 0 12月 8 19:41 sheewaehoo_kai.html

1.2.2 【练习题2】批量改名特殊案例

【练习题1】中结果文件名中的kai字符串全部改成znix(最好用for循环实现),并且将扩展名html全部改成大写。

jpvirsnjld_kai.html ===> jpvirsnjld_znix.HTML

脚本内容:

1 [[email protected] for2]# cat rename_file.sh

2 #!/bin/bash

3 #############################################################

4 # File Name: rename_file.sh

5 # Version: V1.0

6 # Author: kai

7 # Organization: http://blog.george.com

8 # Created Time : 2017-12-08 11:31:56

9 # Description:

10 #############################################################

11

12 cd /kai &&\

13 File_name=`ls |sed -r 's#(.*)_kai.html#\1#g'`

14

15 for i in $File_name

16 do

17 if [ -f ${i}_kai.html ]

18 then

19 mv ${i}_kai.html ${i}_znix.HTML

20 else

21 echo "文件修改完成."

22 exit

23 fi

24 done

方法二:

切随机字符串:echo ls |cut -c 1-10

查看结果

[[email protected] for2]# ls /kai/

aeyaesughi_znix.HTML caireasipi_znix.HTML uahahnieli_znix.HTML

aifaepheeb_znix.HTML eathixoong_znix.HTML zalipageen_znix.HTML

akuipheeye_znix.HTML ietoothaik_znix.HTML

apheikieno_znix.HTML lachohtaif_znix.HTML

1.2.2.1  批量改名其他方式

  rename 方式(最方便,专业改名)

rename txt jpg *
rename html html-$(date +%F) *

#批量改文件名  

非 for 循环方式批量改名(使用sed命令进行拼接,然后交给bash执行)

ls *jpg|sed -r 's#(.*).jpg#mv & \1.mp4#'|bash

1.2.3 【练习题3】批量创建特殊要求用户案例

  批量创建10个系统帐号kai01-kai10并设置密码(密码为随机数,要求字符和数字等混合)。

脚本内容:

1 [[email protected] for2]# cat add_user.sh

2 #!/bin/bash

3 #############################################################

4 # File Name: add_user.sh 5 # Version: V1.0 6 # Author: kai

7 # Organization: http://blog.george.com 8 # Created Time : 2017-12-08 11:52:21 9 # Description:

10 #############################################################

11

12 Passwd_File=/tmp/`uuidgen`.txt

13 >$Passwd_File

14 chmod 400 $Passwd_File

15

16 for i in kai{01..10}

17 do

18 userdel -r "$i" &>/dev/null

19 id $i &>/dev/null

20 if [ $? -ne 0 ]

21 then22 useradd $i

23 PassWd=`uuidgen`

24 echo $PassWd |passwd --stdin $i &>/dev/null25 echo "用户名:$i 密码:$PassWd" >>$Passwd_File

26 echo -e "\033[32m $i 用户创建成功!\033[0m"27 else28 echo "$i 用户已存在"29 fi30 if [ "$i" == "kai10" ]

31 then32 echo "用户密码请查看文件 $Passwd_File"33 fi34 done

查看成的密码文件

[[email protected] for2]# cat /tmp/3e5c18d9-f878-4d06-931e-

5bbcc810c3dc.txt

用户名:kai01 密码:3d4644d0-9cf4-49db-8928-1a8346972c32

用户名:kai02 密码:70798c3a-c8e3-42a0-9942-d4011ce4b4b3

用户名:kai03 密码:db2a0f1d-2e49-44f5-a5b2-69b352b30120

用户名:kai04 密码:62d2e0c6-b755-4b00-ad2d-c98f9ca9f258

用户名:kai05 密码:eaa3471b-d04f-4d7c-8b7e-3d75172a483b

用户名:kai06 密码:fb260a11-cd47-4b97-ab49-0cae7a755262

用户名:kai07 密码:16ee7a1f-8aac-4537-b1aa-7fc75beb8754

用户名:kai08 密码:0dde8823-b97d-4c88-9258-3a68a3b53eba

用户名:kai09 密码:daf14ec4-ba9f-4593-9773-1557fdf605dc

用户名:kai10 密码:6f1b452c-00b2-44a1-9f43-5f658d3a9124

注:修改字符集:localerctl set-locale.utf8

方法二:

1.2.3.1  批量创建用户并设置随机密码(不使用shell循环)

  方法一

echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& echo

\1 >>/tmp/passwd.txt \&\& echo $RANDOM |md5sum |cut -c 1-

5>>/tmp/passwd.txt \&\& echo `tail -1 /tmp/passwd.txt`|passwd

--stdin \1#g'|bash  

方法二

echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\&

pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo $pass

|passwd --stdin \1 \&\& echo \1

$pass>>/tmp/user_passwd.txt#g'|bash  

方法三

echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\&

pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo

\1:$pass>>/tmp/user_passwd.txt \&\&

chpasswd</tmp/user_passwd.txt#g'|bash

1.2.4 【练习题4】扫描网络内存活主机案例

  写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?

脚本内容:

1 [[email protected] for]# cat scan_ip2.sh

2 #!/bin/bash

3 #############################################################

4 # File Name: scan_ip.sh

5 # Version: V1.0

6 # Author: kai

7 # Organization: http://blog.george.com

8 # Created Time : 2017-12-07 21:58:47

9 # Description:

10 #############################################################

11

12 Ip_File=/tmp/scan_ip.txt

13 >$Ip_File

14

15 for i in 10.0.0.{1..254}

16 do

17 ping -c 1 -W 1 $i &>/dev/null && \

18 if [ $? -eq 0 ] ;then

19 echo "存活主机: $i" &>>$Ip_File

20 fi &

21 done

22 echo "使用 cat $Ip_File 查看扫描结果"

脚本执行结果

[[email protected] for]# time sh scan_ip2.sh

使用 cat /tmp/scan_ip.txt 查看扫描结果

real 0m0.290s

user 0m0.001

ssys 0m0.039s

[[email protected] for]# cat /tmp/scan_ip.txt

存活主机: 10.0.0.180

存活主机: 10.0.0.254

方法二:nmap(推荐使用)

snmp -sT 10.0.0.254    #扫描10.0.0.254网段存活的主机及打开的端口

方法三:shell并发(不建议用,消耗系统资源很大)

{ ... } &:将{ }中的所有命令都放到后台

for i in 10.0.0.{1..254}

do

{ ping -c 1 -W 1 $i &>/dev/null

if [ $? -eq 0 ];then

echo "survavil_host: $i"

sleep 10
    fi } &

done

小伙伴们可以关注我的微信公众号:linux运维菜鸟之旅

关注“中国电信天津网厅”公众号,首次绑定可免费领2G流量,为你的学习提供流量! 

原文地址:http://blog.51cto.com/13055758/2104619

时间: 2024-11-05 20:41:32

linux编程基础(三)的相关文章

linux编程基础汇总贴

linux编程基础汇总贴http://newzol.cn/forum.php?mod=viewthread&tid=67&fromuid=3(出处: newzol) 1.管道 http://newzol.cn/forum.php?mod=viewthread&tid=15&extra=page%3D2 2.基于管道的简单服务器 http://newzol.cn/forum.php?mod=viewthread&tid=14&extra=page%3D2 3.

Linux编程基础

一.Linux编程环境 1. 程序编辑器: 命令模式: i(insert):插入 a(after):之后插入 x():删除字符 dd:删除一行 :行号进行指定 :/字符串:搜索字符串 :q,退去 :wq ndd:删除n行 yy:复制当前行 p:粘贴 ny:从当前航开始复制 2. gcc gcc -s  text.c gcc  -c text.c gcc -o text  text.c gcc -o text test1.o text2.o 二.调试工具 1. gdb 执行调试命令:gdb tes

Scala 中的函数式编程基础(三)

主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. 3. Data and Abstraction 3.1 Class Hierarchies 这一集字幕不同步-,-,听得有点费力! 类的概念和其他语言里面很相似,基类,子类,父类啥的叫法差不多.在 Scala 中,所有用户自定义的类都是另外一个类的子类,如果没有显式给定父类,java 里面默认继承 java.

Linux编程基础-emacs简单配置

最近笔者又回到了Linux~浪了一圈又回来了 不过emacs确实不错,看起来也高大上(哈哈),今天就把我的配置文件贴上吧 要修改.emacs配置文件的话,只需要在emacs界面中按住control+X,松开后再按Control+F, 然后输入路径~/.emacs就好了,使底部命令行显示成这样: Find File: ~/.emacs,按回车就可以了 ;; 指针颜色设置为白色 (set-cursor-color "white") ;; 鼠标颜色设置为白色 (set-mouse-color

Linux编程-回忆录三

====系统环境====#include <unistd.h>pid_t getpid(void);得到当前进程的进程ID号,永远成功 #include <stdlib.h>char *getenv(const char *name);得到给定环境变量名称的值,如果没有该变量,返回NULL值 #include <stdlib.h>int putenv(char *string);添加一个新的环境变量,传入的字符串格式为: "name=value"传入

linux编程基础--什么是I/O

I/O是input/output的缩写,即输入输出端口.每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息.CPU与外部设备.存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O接口,而后者则被称为存储器接口.存储器通常在CPU的同步控制下工作,接口电路比较简单:而I/O设备品种繁多,其相应的接口电路也各不相同,因此,习惯上说到接口只是指I/O接口. 1接口分类编辑 I/O接口的功能是负责实现CPU通过系统总线把I/O电路和外围设备联系在一起,按照电路和设备的复杂程度,I

第十一章:Python の 网络编程基础(三)

本課主題 多线程的创建和使用 消息队列的介绍 Python 操作 memached 和 redis 实战 本周作业 消息队列的介绍 对列是在内存中创建的,如果程序运行完毕之后被清空了,消息就清空了. 先进先出队列 class Queue: '''Create a queue object with a given maximum size. If maxsize is <= 0, the queue size is infinite. ''' def __init__(self, maxsize

Linux编程基础——GDB(设置断点)(转:TianFang,cnblog: http://www.cnblogs.com/TianFang/archive/2013/01/20/2868889.html)

启动GDB后,首先就是要设置断点,程序中断后才能调试.在gdb中,断点通常有三种形式: 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种.设置断点的命令是break,它通常有如下方式: break <function>    在进入指定函数时停住 break <linenum>    在指定行号停住. break +/-offset    在当前行号的前面或后面的offset行停住.offiset为自然数. break filename:linenum

Linux编程基础——GDB(设置断点)

启动GDB后,首先就是要设置断点,程序中断后才能调试.在gdb中,断点通常有三种形式: 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种.设置断点的命令是break,它通常有如下方式: break <function>    在进入指定函数时停住 break <linenum>    在指定行号停住. break +/-offset    在当前行号的前面或后面的offset行停住.offiset为自然数. break filename:linenum