一shell脚本for循环语句
(一)for循环语句介绍
循环执行:将某代码段重复运行多次,重复运行多少次。也就是循环次数事先已知或者循环次数事先未知,有进入条件和退出条件。
循环语句有for, while, until
查看帮助文档,有两种语法
因为NAME是变量名,不加$
[root@centos7 ~]# type forfor is a shell keyword[root@centos7 ~]# help forfor: 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 casecase: 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:wangfor 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:wangfor 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.sh13579 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.sh108642 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 6616 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=wangfor 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.shfilename 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 /rootfilename 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 /rootfilename 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.shfilename 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.shthis 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=wangfor 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:wangsum=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:wangsum=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:wangsum=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:wangsum=0for i in {3..100..3}do let sum=$((sum+i))doneecho $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=wangfor 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 | tailuser91: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 | tailuser91:$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 10Ey0PRDELAhuCfw==[root@centos73 shell_scripts]# openssl rand -base64 10Th1mFK8i95hJOQ== [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 8bZ4p1m1N[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-*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=wangnet=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=wangnet=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 up192.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.1192.168.137.1 192.168.137.1
解决办法在脚本的第1行先清空文件内容?
[root@centos73 shell_scripts]# bash scan_ip.sh 192.168.137.1 is up192.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.1Starting 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 up192.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不通就执行下一次循环。 #地址输入了之后要判断是否是一个地址