for循环语句 一shell脚本for循环语句 (一)for循环语句介绍 (1)第1种语法——变量取值型 (2)第2种语法——C语言for循环语句 (二)列表生成方式 (1)直接给出列表元素 (2)整数列表 (3)使用seq生成数字序列 (4)返回列表的命令$(COMMAND) (5)使用使用通配符glob生成列表,如:*.sh (6)变量引用:$@, $* 二for循环示例 (一)求和1-100的偶数 (二)求1到100被3整除的数字相加的和 (三)求1到100不能被3整除的数字相加的和 (四)添加10个用户user91-user100,密码为8位随机字符 (五)定义网段的IP地址,测试其在是否开机启动
(一)for循环语句介绍
循环执行:将某代码段重复运行多次,重复运行多少次。也就是循环次数事先已知或者循环次数事先未知,有进入条件和退出条件。
循环语句有for, while, until
查看帮助文档,有两种语法
因为NAME是变量名,不加$
[root@centos7 ~]# type for
for is a shell keyword
[root@centos7 ~]# help for
for: for NAME变量名 [in WORDS ... ] ; do COMMANDS; done
0420变量值就是列表中的某个值。有几个单词就会执行几遍
Execute commands for each member in a list.
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
Exit Status:
Returns the status of the last command executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Arithmetic for loop.
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
Exit Status:
Returns the status of the last command executed.
对比case,如果name是变量名,要加$
[root@centos7 ~]# help case
case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
Execute commands based on pattern matching.
Selectively execute COMMANDS based upon WORD matching PATTERN. The
`|' is used to separate multiple patterns.
Exit Status:
Returns the status of the last command executed.
(1)第1种语法——变量取值型
for 变量名 in 列表;do
循环体
done
执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
(2)第2种语法——C语言for循环语句
(二)列表生成方式
(1)直接给出列表元素
[root@centos73 shell_scripts]# vim for.sh
[root@centos73 shell_scripts]# bash for.sh
num is 1
num is 2
num is 3
num is 4
[root@centos73 shell_scripts]# cat for.sh
#!/bin/bash
#Author:wang
for num in 1 2 3 4
#写完4个数就会执行4次循环
do
echo "num is $num"
done
(2)整数列表
{start..end},{start..end..step}
利用大括号{ }生成数字序列
[root@centos73 shell_scripts]# vim for1.sh
[root@centos73 shell_scripts]# bash for1.sh
num is 1
num is 2
num is 3
num is 4
[root@centos73 shell_scripts]# cat for1.sh
#!/bin/bash
#Author:wang
for num in {1..4}
#写完4个数就会执行4次循环
do
echo "num is $num"
done
[root@centos73 shell_scripts]# cat for1.sh
#!/bin/bash
#Author:wang
for num in {a..g}
do
echo "num is $num"
done
[root@centos73 shell_scripts]# bash for1.sh
num is a
num is b
num is c
num is d
num is e
num is f
num is g
{start..end..step}
[root@centos73 shell_scripts]# cat for1.sh
#!/bin/bash
#Author:wang
for num in {10..2..1}从10到2递减,步长是1
do
echo "num is $num"
done
[root@centos73 shell_scripts]# vim for1.sh
[root@centos73 shell_scripts]# bash for1.sh
num is 10
num is 9
num is 8
num is 7
num is 6
num is 5
num is 4
num is 3
num is 2
(3)使用seq生成数字序列
$(seq [start [step]] end)
[root@centos73 shell_scripts]# bash for_seq.sh
1
3
5
7
9
11
13
15
17
[root@centos73 shell_scripts]# cat for_seq.sh
#!/bin/bash
#Author=wang
for i in `seq 1 2 18`
do
echo $i
done
[root@centos73 shell_scripts]#
注意如果是倒序,那么步长前面要加上-
[root@centos73 shell_scripts]# bash for_seq_1.sh
10
8
6
4
2
0
[root@centos73 shell_scripts]# cat for_seq_1.sh
#!/bin/bash
#Author=wang
for i in `seq 10 -2 0`
do
echo $i
done
[root@centos73 shell_scripts]# seq 1 5 66
1
6
11
16
21
26
31
36
41
46
51
56
61
66
注意如果是倒序显示步长要加负号
[root@centos73 shell_scripts]# seq 66 5 1
[root@centos73 shell_scripts]# seq 66 -5 1
66
61
56
51
46
41
36
31
26
21
16
11
6
1
[root@centos73 shell_scripts]#
bash for_3sum.sh 3367 [root@centos73 shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ $[i%3] -ne 0 ]; then let sum+=i fi done echo $sum [root@centos73 shell_scripts]# vim for_3sum.sh [root@centos73 shell_scripts]# bash for_3sum.sh 3367 [root@centos73 shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ "$[i%3]" -ne 0 ]; then let sum+=i fi done echo $sum
(4)返回列表的命令$(COMMAND)
注意要加上反引号
[root@centos73 shell_scripts]# cat for_command.sh
#!/bin/bash
#Author=wang
for i in `ls /etc`;do
echo $i
done
[root@centos73 shell_scripts]# bash for_command.sh | wc
188 188 1803
[root@centos73 shell_scripts]# bash for_command.sh | head
adjtime
aliases
aliases.db
alternatives
anacrontab
asound.conf
at.deny
audisp
audit
bash_completion.d
[root@centos73 shell_scripts]# bash for_command.sh | tail
vmware-tools
vsftpd
wpa_supplicant
X11
xdg
xinetd.d
yum
yum.conf
yum.repos_bak
yum.repos.d
[root@centos73 shell_scripts]# bash command1.sh
filename is /root/shell_scripts/1.sh
filename is /root/shell_scripts/2.sh
filename is /root/shell_scripts/backup1.sh
filename is /root/shell_scripts/backup.sh
filename is /root/shell_scripts/case1.sh
filename is /root/shell_scripts/case.sh
filename is /root/shell_scripts/command1.sh
filename is /root/shell_scripts/for1.sh
filename is /root/shell_scripts/for_3sum.sh
filename is /root/shell_scripts/for.sh
filename is /root/shell_scripts/for_sum.sh
[root@centos73 shell_scripts]# cat command1.sh
#!/bin/bash
#Author:wang
for filename in `ls /root/shell_scripts/*.sh`;do
echo filename is $filename
done
[root@centos73 shell_scripts]# bash command1.sh
filename is /root
filename is /root/shell_scripts/1.sh
filename is /root/shell_scripts/2.sh
filename is /root/shell_scripts/backup1.sh
filename is /root/shell_scripts/backup.sh
filename is /root/shell_scripts/case1.sh
filename is /root/shell_scripts/case.sh
filename is /root/shell_scripts/command1.sh
filename is /root/shell_scripts/for1.sh
filename is /root/shell_scripts/for_3sum.sh
filename is /root/shell_scripts/for.sh
filename is /root/shell_scripts/for_sum.sh
[root@centos73 shell_scripts]# cat command1.sh
#!/bin/bash
#Author:wang
for filename in ~ /root/shell_scripts/*.sh;do
echo filename is $filename
done
(5)使用使用通配符glob生成列表,如:*.sh
[root@centos73 shell_scripts]# bash command1.sh
filename is /root
filename is /root/shell_scripts/1.sh
filename is /root/shell_scripts/2.sh
filename is /root/shell_scripts/backup1.sh
filename is /root/shell_scripts/backup.sh
filename is /root/shell_scripts/case1.sh
filename is /root/shell_scripts/case.sh
filename is /root/shell_scripts/command1.sh
filename is /root/shell_scripts/for1.sh
filename is /root/shell_scripts/for_3sum.sh
filename is /root/shell_scripts/for.sh
filename is /root/shell_scripts/for_sum.sh
[root@centos73 shell_scripts]# cat command1.sh
#!/bin/bash
#Author:wang
for filename in ~ /root/shell_scripts/*.sh;do
echo filename is $filename
done
[root@centos73 shell_scripts]# bash command1.sh
filename is /root/shell_scripts/1.sh
filename is /root/shell_scripts/2.sh
filename is /root/shell_scripts/backup1.sh
filename is /root/shell_scripts/backup.sh
filename is /root/shell_scripts/case1.sh
filename is /root/shell_scripts/case.sh
filename is /root/shell_scripts/command1.sh
filename is /root/shell_scripts/for1.sh
filename is /root/shell_scripts/for_3sum.sh
filename is /root/shell_scripts/for.sh
filename is /root/shell_scripts/for_sum.sh
[root@centos73 shell_scripts]# cat command1.sh
#!/bin/bash
#Author:wang
for filename in `ls /root/shell_scripts/*.sh`;do
echo filename is $filename
done
[root@centos73 shell_scripts]# cat for_*sh.sh
#!/bin/bash
#Author=wang
for i in "*.sh";do
echo this is $i
done
[root@centos73 shell_scripts]# bash for_*sh.sh
this is 100sum_100.sh 19_1.1.sh 19_1.sh 19_2.sh 1.sh 2.sh 33.sh 34.sh 5.sh argsnum1.sh argsnum.sh array.sh a.sh backup.sh break.sh case_1.sh case1.sh case.sh checkdisk.sh checkint.sh color_black.sh color_brown.sh color_green.sh color_rad.sh color.sh color_yellow.sh command1.sh continue.sh copy_cmd.sh crack_passwords.sh create_user1.sh createuser_1.sh createuser2.sh create_user.sh createuser.sh dadengyao.sh dengyao.sh diskcheck.sh equicrural_triangle.sh excute.sh factorial.sh file_KS.sh filetype.sh for1.sh for_3sum.sh for_command.sh for_seq_1.sh for_seq.sh for.sh for_*sh.sh for_sum.sh func1.sh func2.sh func3.sh gecos.sh guess_digit_endlessloop1.sh guess_digit_endlessloop.sh guess_digit.sh host_online.sh isoscelestriangle_2.sh isoscelestriangle.sh killcrackers.sh killcrackers_while.sh login.sh log.sh matrix.sh monitor_connections1.sh monitor_connections.sh nine_nine_multiplication_table.sh nine*nine_multiplication_table.sh nologin.sh randhtml_sedway.sh randhtml.sh randhtml_trmethod.sh rand_max_min1.sh rand_max_min.sh random_for.sh random_while.sh rectangle.sh scan_ip1.sh scan_ip_for.sh scan_ip.sh scan_ip_while.sh score.sh select_quit1.sh select_quit.sh sum_100_1.sh sum_100.sh sum.sh trap_9signal.sh trap.sh triangle1.sh triangle.sh triangle_tree.sh use_exp.sh user_passwd.sh while_read_users.sh yesorno_case.sh yesorno_if.sh yesorno.sh
(6)变量引用:$@, $*
[root@centos73 shell_scripts]# cat for2.sh
#!/bin/bash
#Author=wang
for i in `ls $@`;do
echo $i
done
[root@centos73 shell_scripts]# bash for2.sh | wc
117 118 1589
[root@centos73 shell_scripts]# bash for2.sh | head
100sum_100.sh
19_1.1.sh
19_1.sh
19_2.sh
1.sh
2.sh
33.sh
34.sh
5.sh
argsnum1.sh
[root@centos73 shell_scripts]# bash for2.sh | tail
trap.sh
triangle1.sh
triangle.sh
triangle_tree.sh
use_exp.sh
user_passwd.sh
while_read_users.sh
yesorno_case.sh
yesorno_if.sh
yesorno.sh
二for循环示例
(一)求和1-100的偶数
完整脚本
[root@centos73 shell_scripts]# cat for_sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {2..100..2}
do
let sum+=i
done
echo $sum
执行结果
[root@centos73 shell_scripts]# bash for_sum.sh
2550
脚本解析
sum=0 对变量进行定义,初始值为0
let sum+=i 表示变量进行自增,相当于sum=sum+i
下面是更容易理解的写法
[root@centos73 shell_scripts]# cat for_sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {2..100..2}
do
let sum=sum+i
done
echo $sum
[root@centos73 shell_scripts]# bash for_sum.sh
2550
因为是一个整体,要使用中括号
[root@centos73 shell_scripts]# bash for_sum.sh
2550
[root@centos73 shell_scripts]# cat for_sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {2..100..2}
do
let sum=$[sum+i]
done
echo $sum
表示使用双括号括起来
[root@centos73 shell_scripts]# cat for_sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {2..100..2}
do
let sum=$((sum+i))
done
echo $sum
[root@centos73 shell_scripts]# bash for_sum.sh
2550
(二)求1到100被3整除的数字相加的和
把奇数偶数都加起来
求1到100被3整除的数字相加的和
和上面的脚本使用同样的套路
[root@centos73 shell_scripts]# echo {3..100..3} 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 [root@centos73 shell_scripts]# cp for_sum.sh for_3sum.sh [root@centos73 shell_scripts]# vim for_3sum.sh [root@centos73 shell_scripts]# bash for_3sum.sh 1683 [root@centos73 shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in {3..100..3} do let sum=$((sum+i)) done echo $sum
(三)求1到100不能被3整除的数字相加的和
判断对3取余数。
不等于有两种写法:
1[ ! "$yu" -eq 0 ]
2 [ "$yu" -ne 0 ]
法1:
[root@centos73 shell_scripts]# bash for_3sum.sh
3367
[root@centos73 shell_scripts]# cat for_3sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {1..100};do
yu=$[i%3]
if [ ! "$yu" -eq 0 ]; then
#注意这里是变量值最好加上双引号,不加也可以的。
let sum+=i
fi
done
echo $sum
法2:
[root@centos73 shell_scripts]# bash for_3sum.sh
3367
[root@centos73 shell_scripts]# cat for_3sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {1..100};do
yu=$[i%3]
if [ "$yu" -ne 0 ]; then
let sum+=i
fi
#注意写脚本要养成良好的习惯,比如缩进要美观。
done
echo $sum
[root@centos73 shell_scripts]# bash for_3sum.sh
3367
[root@centos73 shell_scripts]# cat for_3sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {1..100};do
yu=$[i%3]
if [ $yu -ne 0 ]; then
let sum+=i
fi
#注意写脚本要养成良好的习惯,比如缩进要美观。
done
echo $sum
法3
[root@centos73 shell_scripts]# bash for_3sum.sh
3367
[root@centos73 shell_scripts]# cat for_3sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in `seq 1 100`;do
if [ $[i%3] -ne 0 ]; then
let sum+=i
fi
done
echo $sum
[root@centos73 shell_scripts]# vim for_3sum.sh
[root@centos73 shell_scripts]# bash for_3sum.sh
3367
[root@centos73 shell_scripts]# cat for_3sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in `seq 1 100`;do
if [ "$[i%3]" -ne 0 ]; then
let sum+=i
fi
done
echo $sum
(四)添加10个用户user91-user100,密码为8位随机字符
创建用户,并且每个用户设置初始口令,口令是随机的,并且放到文件里面。
具体问题可以表现为添加10个用户user91-user100,密码为8位随机字符
完整脚本
[root@centos73 shell_scripts]# cat user_add.sh
#!/bin/bash
#Author=wang
for i in `seq 91 100` ; do
username=user$i
useradd $username
echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null
done
echo "finished"
执行结果
[root@centos73 shell_scripts]# bash user_add.sh
finished
[root@centos73 shell_scripts]# cat /etc/passwd | tail
user91:x:1038:1038::/home/user91:/bin/bash
user92:x:1039:1039::/home/user92:/bin/bash
user93:x:1040:1040::/home/user93:/bin/bash
user94:x:1041:1041::/home/user94:/bin/bash
user95:x:1042:1042::/home/user95:/bin/bash
user96:x:1043:1043::/home/user96:/bin/bash
user97:x:1044:1044::/home/user97:/bin/bash
user98:x:1045:1045::/home/user98:/bin/bash
user99:x:1046:1046::/home/user99:/bin/bash
user100:x:1047:1047::/home/user100:/bin/bash
[root@centos73 shell_scripts]#
[root@centos73 shell_scripts]# cat /etc/shadow | tail
user91:$6$YCyBiaF/$vovuieWrGWXwhHpRwsuJc85JOlFwvrUG/hNiPyLsJkHgWQG2v4oTE.B/CRANjcOhDkHlylH3iBG4bggmzstO40:18076:0:99999:7:::
user92:$6$mxAMFuM1$.PqkWeHq231BmmnYcglitPkK/b4KOTcwLkO.S7isn9TA6ToN/sFR5ASwVF9HCHilEArql5R1Z4md6.auRaYj..:18076:0:99999:7:::
user93:$6$Ga0/IYjR$TfriwLrqxYsdTlfoRRDNDn8gFwajOkxc5McuxTwoIKGAgWrI8NiKA6ASi4IdYuI7iQ/c2LL4mAte/JCj8juS0.:18076:0:99999:7:::
user94:$6$E9mnyuH7$HS/TqWuhn8E8DX/ghu2SSOohcJU4LfACYg/hmrW9KIc4wZlsN5e.1.Q1ezNSY/w7WyRYYV2c6A2ofUBau/Csj1:18076:0:99999:7:::
user95:$6$J.ljQLDk$6NvXXxx58y7487X0yMIQneF0dZKaqswiWigTu9xwJ1njIQmijvrhCkpxPL6ITJGdMB/j8.tYddIzMcUwWGnUv0:18076:0:99999:7:::
user96:$6$uomIKnzW$9Llzo.qKU9rwcOpU68B7Sml28HUkM1AY06D1k7q7dpITxCdY3IFWWrK11tpwa6SVv4Z.lOiZ.0qgwaq/MNrnz0:18076:0:99999:7:::
user97:$6$NRvTnViz$11cdhUq/9eVRj2SX85HrA/pNyYwqNsNOSObShmBljygjb9wzEZaJ8nPim8ZIGum.DUgG1ni2N3OgukKJmXYbI.:18076:0:99999:7:::
user98:$6$40KBqdzU$.zsRi7sIxmVd4NAH7v5UYiQmvTxNlBMjKrddE3li/dtMxoS6TUHq0mK7XQRu.j6p7WjIxhkOZRmJULDssvEwB0:18076:0:99999:7:::
user99:$6$y2efTk7A$4e4IX9muy30fO6Vv2Q75sAPCrY1XDZecEqxV6f7ZJJPg4V6FpVvIV/lamVaAiSnMQtL1LtGPbSYOu3KWReVFZ1:18076:0:99999:7:::
user100:$6$tlPd3FrP$74gH4aqmlZ3xvp3TbaHSlWMkuDHDVJpr2XARz0n46Wf7Ni3zk9Eei83NhZISw64NvjI/a.YaM5y7d0ypPrrDw.:18076:0:99999:7:::
脚本解析
生成随机口令并且作为创建用户的口令
把改口令成功的提示放到黑洞里面去。
echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null
[root@centos73 shell_scripts]# openssl rand -base64 10
Ey0PRDELAhuCfw==
[root@centos73 shell_scripts]# openssl rand -base64 10
Th1mFK8i95hJOQ==
[root@centos73 shell_scripts]# openssl rand -base64
Usage: rand [options] num
where options are
-out file - write to file
-engine e - use engine e, possibly a hardware device.
-rand file:file:... - seed PRNG from files
-base64 - base64 encode output
-hex - hex encode output
提示符和命令都打印出来了
head -c 8表示获取前几个字节
[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8
bZ4p1m1N[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8
4z3GSMHZ[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8
W2c+6e/b[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo
qBPnSsJt
只显示命令的结果,在命令后面加上echo就可以了
[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo
cQJIkYwR
[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo
W+EX9dLc
[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo
id5+GUME
[root@centos73 shell_scripts]# cat for1.sh -A
#!/bin/bash$
#Author:wang$
for num in {10..2..1}$
#M-eM-^FM-^YM-eM-.M-^L4M-dM-8M-*M-fM-^UM-0M-eM-0M-1M-dM-<M-^ZM-fM-^IM-'M-hM-!M-^L4M-fM-,M-!M-eM->M-*M-gM-^NM-/$
$
do $
echo "num is $num"$
done$
[root@centos73 shell_scripts]# cat for1.sh
#!/bin/bash
#Author:wang
for num in {10..2..1}
#写完4个数就会执行4次循环
do
echo "num is $num"
done
(五)定义网段的IP地址,测试其在是否开机启动
完整脚本
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
net=192.168.137
for i in {1..6};do
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up
echo $net.$i >> /app/ip.log
else
echo $net.$i is down
fi
done
#如果ping通了就显示其为开机的,并且放到文件里面去。
#如果ping不通就执行下一次循环。
执行结果
[root@centos73 shell_scripts]# vim scan_ip.sh
[root@centos73 shell_scripts]# bash scan_ip.sh
192.168.137.1 is up
192.168.137.2 is down
192.168.137.3 is down
192.168.137.4 is down
192.168.137.5 is down
192.168.137.6 is down
脚本解析
net=192.168.137表示网络位,子网掩码是24
主机位for i in {1..6};do,我只选取了几台主机
ping -c1 -w1 $net.$i 因为涉及两个变量,都要加上$
在运行的其实是网关
[root@centos73 shell_scripts]# cat /app/ip.log
192.168.137.1
bug1:
脚本的执行效率不高,解决办法就是在后台执行
[root@centos73 shell_scripts]# ping 192.168.137.1 -c3 &
[1] 1288
[root@centos73 shell_scripts]# PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data.
64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.190 ms
64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.091 ms
64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.158 ms
--- 192.168.137.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.091/0.146/0.190/0.042 ms
bug2:
在后台执行不回车不会退出来,在脚本里面也是一样的
[root@centos73 shell_scripts]# ping 192.168.137.1 -c3 & wait
[1] 1319
PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data.
64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.529 ms
64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.131 ms
64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.111 ms
--- 192.168.137.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.111/0.257/0.529/0.192 ms
[1]+ Done ping 192.168.137.1 -c3
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
net=192.168.137
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up
echo $net.$i >> /app/ip.log
else
echo $net.$i is down
fi }&
done
[root@centos73 shell_scripts]# 192.168.137.1 is up
192.168.137.2 is down
192.168.137.3 is down
192.168.137.6 is down
192.168.137.5 is down
192.168.137.4 is down
^C
解决办法加上wait
现在执行效率提高了并且会退出
[root@centos73 shell_scripts]# bash scan_ip.sh
192.168.137.1 is up
192.168.137.2 is down
192.168.137.4 is down
192.168.137.3 is down
192.168.137.5 is down
192.168.137.6 is down
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
net=192.168.137
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up
echo $net.$i >> /app/ip.log
else
echo $net.$i is down
fi }&
done
wait
#如果ping通了就显示其为开机的,并且放到文件里面去。
#如果ping不通就执行下一次循环。
bug3:
因为前面多次执行了脚步,在文件里面会生成重复的内容
[root@centos73 shell_scripts]# cat /app/ip.log
192.168.137.1
192.168.137.1
192.168.137.1
解决办法在脚本的第1行先清空文件内容?
[root@centos73 shell_scripts]# bash scan_ip.sh
192.168.137.1 is up
192.168.137.6 is down
192.168.137.5 is down
192.168.137.2 is down
192.168.137.4 is down
192.168.137.3 is down
[root@centos73 shell_scripts]# cat /app/ip.log
192.168.137.1
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
> /app/ip.log
net=192.168.137
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up
echo $net.$i >> /app/ip.log
else
echo $net.$i is down
fi }&
done
wait
#如果ping通了就显示其为开机的,并且放到文件里面去。
#如果ping不通就执行下一次循环。
查看开机运行的主机的信息
[root@centos73 shell_scripts]# nmap -v -A 192.168.137.1
Starting Nmap 6.40 ( http://nmap.org ) at 2019-02-09 23:35 CST
NSE: Loaded 110 scripts for scanning.
NSE: Script Pre-scanning.
Initiating ARP Ping Scan at 23:35
Scanning 192.168.137.1 [1 port]
Completed ARP Ping Scan at 23:35, 0.01s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 23:35
Completed Parallel DNS resolution of 1 host. at 23:35, 0.08s elapsed
Initiating SYN Stealth Scan at 23:35
Scanning 192.168.137.1 [1000 ports]
Discovered open port 53/tcp on 192.168.137.1
Completed SYN Stealth Scan at 23:35, 0.14s elapsed (1000 total ports)
Initiating Service scan at 23:35
Scanning 1 service on 192.168.137.1
Completed Service scan at 23:35, 1.24s elapsed (1 service on 1 host)
Initiating OS detection (try #1) against 192.168.137.1
Retrying OS detection (try #2) against 192.168.137.1
NSE: Script scanning 192.168.137.1.
Initiating NSE at 23:35
Completed NSE at 23:35, 5.17s elapsed
Nmap scan report for 192.168.137.1
Host is up (0.047s latency).
Not shown: 999 closed ports
PORT STATE SERVICE VERSION
53/tcp open tcpwrapped
MAC Address: 00:50:56:E2:3D:B6 (VMware)
Aggressive OS guesses: Microsoft Windows 7 Enterprise (93%), Microsoft Windows XP SP3 (93%), DD-WRT v24-sp2 (Linux 2.4.37) (91%),
DVTel DVT-9540DW network camera (91%), Linux 3.2 (90%), BlueArc Titan 2100 NAS device (89%), Brother HL-5170DN printer (88%),
Pirelli DP-10 VoIP phone (88%), Aethra Starvoice 1042 ADSL router (87%), Brother HL-1870N printer (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=257 (Good luck!)
IP ID Sequence Generation: Incremental
TRACEROUTE
HOP RTT ADDRESS
1 46.57 ms 192.168.137.1
NSE: Script Post-scanning.
Read data files from: /usr/bin/../share/nmap
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.12 seconds
Raw packets sent: 1044 (49.132KB) | Rcvd: 1036 (42.012KB)
法2:
把网段写死了,设置要扫描的网段是变化的,或者说是交互式的。
如果用户不是输入IP地址,那就要温馨提示请输入正确的地址
判断是否是IP地址可以使用正则表达式
[root@centos73 shell_scripts]# bash scan_ip.sh
192.168.137.1 is up
192.168.137.4 is down
192.168.137.2 is down
192.168.137.6 is down
192.168.137.3 is down
192.168.137.5 is down
[root@centos73 shell_scripts]# cat /app/ip.log
192.168.137.1 is up
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
> /app/ip.log
net=192.168.137
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up | tee -a /app/ip.log
else
echo $net.$i is down
fi }&
done
wait
#如果ping通了就显示其为开机的,并且放到文件里面去。
#如果ping不通就执行下一次循环。
ip="114.122.2.255";[[ "$ip" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] && echo true ||echo false
[root@centos73 shell_scripts]# bash scan_ip.sh
please input the network(eg:192.168.137.0):1.1.1.1
scan_ip.sh: line 8: syntax error near unexpected token `||'
scan_ip.sh: line 8: `|| { echo "please input a legal IP";exit 1 ;}'
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
> /app/ip.log
net=192.168.137
read -p "please input the network(eg:192.168.137.0):" network
[[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
|| { echo "please input a legal IP";exit 1 ;}
#||是不能写在开头的
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up | tee -a /app/ip.log
else
echo $net.$i is down
fi }&
done
wait
[root@centos73 shell_scripts]# bash scan_ip.sh
please input the network(eg:192.168.137.0):1
please input a legal IP
[root@centos73 shell_scripts]# bash scan_ip.sh
please input the network(eg:192.168.137.0):1.1.1.1
192.168.137.1 is up
192.168.137.5 is down
192.168.137.3 is down
192.168.137.6 is down
192.168.137.2 is down
192.168.137.4 is down
[root@centos73 shell_scripts]# cat /app/ip.log
192.168.137.1 is up
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
> /app/ip.log
net=192.168.137
read -p "please input the network(eg:192.168.137.0):" network
[[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
]] || { echo "please input a legal IP";exit 1 ;}
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up | tee -a /app/ip.log
else
echo $net.$i is down
fi }&
done
wait
#如果ping通了就显示其为开机的,并且放到文件里面去。
#如果ping不通就执行下一次循环。
#地址输入了之后要判断是否是一个地址,使用正则表达式
只要前3段
[root@centos73 shell_scripts]# bash scan_ip.sh
please input the network(eg:192.168.137.0):192.168.137.4
192.168.137.1 is up
192.168.137.5 is down
192.168.137.3 is down
192.168.137.6 is down
192.168.137.2 is down
192.168.137.4 is down
[root@centos73 shell_scripts]# bash scan_ip.sh
please input the network(eg:192.168.137.0):3
please input a legal IP
[root@centos73 shell_scripts]# bash scan_ip.sh
please input the network(eg:192.168.137.0):1.1.1.1
1.1.1.1 is up
1.1.1.2 is down
1.1.1.4 is down
1.1.1.5 is down
1.1.1.3 is down
1.1.1.6 is down
[root@centos73 shell_scripts]# cat /app/ip.log
1.1.1.1 is up
[root@centos73 shell_scripts]# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=128 time=11.2 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=128 time=9.84 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=128 time=12.7 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=128 time=11.2 ms
64 bytes from 1.1.1.1: icmp_seq=5 ttl=128 time=10.0 ms
64 bytes from 1.1.1.1: icmp_seq=6 ttl=128 time=10.8 ms
64 bytes from 1.1.1.1: icmp_seq=7 ttl=128 time=11.5 ms
64 bytes from 1.1.1.1: icmp_seq=8 ttl=128 time=9.92 ms
^C
--- 1.1.1.1 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7015ms
rtt min/avg/max/mdev = 9.847/10.923/12.709/0.912 ms
[root@centos73 shell_scripts]# cat scan_ip.sh
#!/bin/bash
#Author=wang
> /app/ip.log
net=192.168.137
#这行是可以不要的,但是因为后面的变量会覆盖的,所以保留也不影响的。
read -p "please input the network(eg:192.168.137.0):" network
[[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
]] || { echo "please input a legal IP";exit 1 ;}
net=`echo $network | cut -d. -f1-3`
for i in {1..6};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up | tee -a /app/ip.log
else
echo $net.$i is down
fi }&
done
wait
#如果ping通了就显示其为开机的,并且放到文件里面去。
#如果ping不通就执行下一次循环。
#地址输入了之后要判断是否是一个地址