当前位置: 首页 > news >正文

Shell编程(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)

本篇文章继续给大家介绍Shell编程,包括for循环、并发问题,while循环,流程控制语句,函数传参、函数变量、函数返回值,反向破解MD5等内容。

1.for循环
for 变量 in [取值列表]     取值列表可以是数字 字符串 变量 序列 命令
do                        for循环将取到的值以此赋值给变量命令即可
done[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in a b c
doecho $i
done
[root@web01 Day04]# sh test.sh
a
b
c#也可以在命令行中写for循环
[root@web01 Day04]# for i in `seq 10`;do echo $i;done
1
2
3
4
5
6
7
8
9
10[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in "a b" c
doecho $i
done
[root@web01 Day04]# sh test.sh
a b
c[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in 10 20 30
doecho $i
done
[root@web01 Day04]# sh test.sh
10
20
30[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {1..5}
doecho $i
done
[root@web01 Day04]# sh test.sh
1
2
3
4
5[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {a..d}
doecho $i
done
[root@web01 Day04]# sh test.sh
a
b
c
d
(1)探测10.0.0.1-10.0.0.254哪些ip在线,ping的通说明在线
[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {1..254}
doIP=10.0.0.$iping -c1 -W1 $IP &> /dev/nullif [ $? -eq 0 ];thenecho $IP 在线fi
done
[root@web01 Day04]# sh test.sh
10.0.0.1 在线
10.0.0.2 在线
10.0.0.4 在线
10.0.0.7 在线
10.0.0.8 在线
10.0.0.31 在线
10.0.0.51 在线
10.0.0.61 在线#可以再连接下Xshell过滤下ping
[root@web01 ~]# ps axu|grep ping
root      13760  0.0  0.1 128552  1272 pts/0    T    09:25   0:00 ping -c1 -W1 10.0.0.107
root      13897  0.0  0.1 128552  1268 pts/0    S+   09:28   0:00 ping -c1 -W1 10.0.0.109
root      13899  0.0  0.0 112808   964 pts/2    S+   09:28   0:00 grep --color=auto ping

这样速度慢,我们可以用花括号括住循环体,后面再加&,实现并发,注意并不是所有的循环都使用并发快,如果循环次数过大的情况下,并发多了会过多的占用资源,不利于处理循环体的数据,有些时候甚至比不并发还要慢。

[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {1..256}
do{IP=10.0.0.$iping -c1 -W1 $IP &> /dev/nullif [ $? -eq 0 ];thenecho $IP 在线fi} &
done
echo "在线取IP完成......"[root@web01 Day04]# sh test.sh    #由于是并发,所以出现了顺序错乱,谁先ping好就先返回谁
10.0.0.4 在线
10.0.0.2 在线
10.0.0.31 在线
10.0.0.1 在线
10.0.0.8 在线
10.0.0.7 在线
10.0.0.51 在线
10.0.0.61 在线
在线取IP完成......#用另一个Xshell过滤,可以看到有很多进程
[root@web01 ~]# ps axu|grep ping
root      13760  0.0  0.1 128552  1272 pts/0    T    09:25   0:00 ping -c1 -W1 10.0.0.107
root      13945  0.0  0.1 128552  1272 pts/0    T    09:29   0:00 ping -c1 -W1 10.0.0.155
root      13976  0.0  0.1 128552  1276 pts/0    T    09:30   0:00 ping -c1 -W1 10.0.0.26
root      14004  0.0  0.1 128552  1268 pts/0    R+   09:30   0:00 ping -c1 -W1 10.0.0.10
root      14005  0.0  0.1 128552  1272 pts/0    R+   09:30   0:00 ping -c1 -W1 10.0.0.5
root      14007  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.15
root      14008  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.16
root      14009  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.14
root      14010  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.12
root      14011  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.13
root      14012  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.17
root      14020  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.18
root      14040  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.19
root      14041  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.22
root      14042  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.24
root      14043  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.23
root      14044  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.20
root      14045  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.21
root      14075  0.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.33
root      14076  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.34
root      14077  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.36
root      14078  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.39
root      14079  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.42
root      14080  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.43
root      14081  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.32
root      14082  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.28
root      14083  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.41
root      14084  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.25
root      14085  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.26
root      14086  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.27
root      14087  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.30
root      14088  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.35
root      14089  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.37
root      14090  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.40
root      14091  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.29
root      14092  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.38
root      14093  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.69
root      14094  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.59
root      14095  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.68
root      14097  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.48
root      14098  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.50
root      14099  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.56
root      14100  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.62
root      14101  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.63
root      14102  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.53
root      14103  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.44
root      14104  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.52
root      14105  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.54
root      14106  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.58
root      14107  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.64
root      14108  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.70
root      14109  0.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.67
root      14110  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.55
root      14112  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.45
root      14113  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.46
root      14114  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.47
root      14115  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.49
root      14116  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.57
root      14117  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.60
root      14118  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.66
root      14119  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.71
root      14120  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.65
root      14126  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.74
root      14127  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.72
root      14128  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.73
root      14129  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.76
root      14130  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.75
root      14136  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.77
root      14142  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.78
root      14143  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.80
root      14144  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.79
root      14145  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.81
root      14146  1.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.83
root      14147  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.84
root      14148  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.85
root      14149  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.86
root      14150  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.82
root      14156  0.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.87
root      14157  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.88
root      14158  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.89
root      14159  0.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.90
root      14160  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.91
root      14170  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.93
root      14171  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.94
root      14172  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.95
root      14173  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.92
root      14175  0.0  0.0 112812   964 pts/2    S+   09:30   0:00 grep --color=auto ping
root      14176  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.97
root      14177  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.98
root      14178  0.0  0.1 128552  1268 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.96
root      14179  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.99
root      14180  0.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.100
root      14186  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.101
root      14187  0.0  0.1 128552  1276 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.103
root      14188  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.105
root      14189  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.104
root      14190  0.0  0.1 128552  1272 pts/0    S+   09:30   0:00 ping -c1 -W1 10.0.0.102

并发还可能出现,并发的内容没返回,但是脚本后面的语句已经执行完毕的情况,这种情况下对于有逻辑关系的语句不利,所以使用并发的时候需要考虑这种情况,这时候我们可以使用wait,解决这个问题。

#并发导致逻辑出问题
[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {1..256}
do{IP=10.0.0.$iping -c2 -W2 $IP &> /dev/nullif [ $? -eq 0 ];thenecho $IP 在线fi} &
done
echo "在线取IP完成......"
[root@web01 Day04]# sh test.sh
在线取IP完成......
[root@web01 Day04]# 10.0.0.7 在线
10.0.0.4 在线
10.0.0.8 在线
10.0.0.1 在线
10.0.0.2 在线
10.0.0.31 在线
10.0.0.51 在线
10.0.0.61 在线[root@web01 Day04]##使用wait控制逻辑 
[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {1..256}
do{IP=10.0.0.$iping -c2 -W2 $IP &> /dev/nullif [ $? -eq 0 ];thenecho $IP 在线fi} &
done
wait
echo "在线取IP完成......"
[root@web01 Day04]# sh test.sh
10.0.0.31 在线
10.0.0.2 在线
10.0.0.1 在线
10.0.0.7 在线
10.0.0.4 在线
10.0.0.8 在线
10.0.0.51 在线
10.0.0.61 在线
在线取IP完成......
(2)从1加到100
[root@web01 Day04]# cat 100.sh
#!/bin/bash
sum=0
for i in `seq 100`
do sum=`echo "$i+$sum"|bc`
done
echo $sum
[root@web01 Day04]# sh 100.sh
5050#用命令也可以
[root@web01 Day04]# seq -s + 100|bc    #-s是用什么分割
5050

(3)99乘法表
[root@web01 Day04]# cat 99x.sh
#!/bin/bash
for i in `seq 9`
dofor b in `seq $i`doprintf "$b x $i = $[i*b]\t"    #printf是格式化输出doneprintf "\n"
done
[root@web01 Day04]# sh 99x.sh
1 x 1 = 1	
1 x 2 = 2	2 x 2 = 4	
1 x 3 = 3	2 x 3 = 6	3 x 3 = 9	
1 x 4 = 4	2 x 4 = 8	3 x 4 = 12	4 x 4 = 16	
1 x 5 = 5	2 x 5 = 10	3 x 5 = 15	4 x 5 = 20	5 x 5 = 25	
1 x 6 = 6	2 x 6 = 12	3 x 6 = 18	4 x 6 = 24	5 x 6 = 30	6 x 6 = 36	
1 x 7 = 7	2 x 7 = 14	3 x 7 = 21	4 x 7 = 28	5 x 7 = 35	6 x 7 = 42	7 x 7 = 49	
1 x 8 = 8	2 x 8 = 16	3 x 8 = 24	4 x 8 = 32	5 x 8 = 40	6 x 8 = 48	7 x 8 = 56	8 x 8 = 64	
1 x 9 = 9	2 x 9 = 18	3 x 9 = 27	4 x 9 = 36	5 x 9 = 45	6 x 9 = 54	7 x 9 = 63	8 x 9 = 72	9 x 9 = 81	

(4)for循环读取文件,默认以空格取值
[root@web01 Day04]# cat for_file.sh
#!/bin/bash
for i in `cat /etc/hosts`
doecho $i
done
[root@web01 Day04]# sh for_file.sh
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6[root@web01 Day04]# cat user.txt 
zhangsan
lisi
wangwu
[root@web01 Day04]# cat for_file.sh
#!/bin/bash
for i in `cat /server/scripts/Day04/user.txt`
douseradd $i
done
[root@web01 Day04]# sh for_file.sh
[root@web01 Day04]# tail -3 /etc/passwd
zhangsan:x:1007:1007::/home/zhangsan:/bin/bash
lisi:x:1008:1008::/home/lisi:/bin/bash
wangwu:x:1009:1009::/home/wangwu:/bin/bash
(5)批量创建删除用户
[root@web01 Day04]# cat yonghu.sh
#!/bin/bash
read -p "请输入用户的前缀: " qianzhui
if ! [[ $qianzhui =~ ^[a-z] ]];thenecho 请注意前缀输入格式 exit	
fi
read -p "请输入要操作的数量: " num1
if ! [[ $num1 =~ ^[0-9]+$ ]];thenecho 请注意输入数量的格式exit
fi
echo 为您生成如下用户
shuchu=""
for i1 in $(seq $num1)
doshuchu="$shuchu $qianzhui$i1"
done
echo $shuchu
read -p "您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]" caozuo
if [ $caozuo == y ];thenfor i2 in $(seq $num1)do		id $qianzhui$i2 &> /dev/nullif [ $? -eq 0 ];thenecho "$user 已存在"elseuseradd $qianzhui$i2if [ $? -eq 0 ];thenecho "$user 创建成功"fifidone	
elif [ $caozuo == d ];thenfor i3 in $(seq $num1)doid $qianzhui$i3 &> /dev/nullif [ $? -ne 0 ];thenecho "$user 不存在不需要删除"exitelseuserdel -rf $qianzhui$i3if [ $? -eq 0 ];thenecho "$user 删除成功"fifidone
elif [ $caozuo == i ];thenfor i4 in $(seq $num1)doid $qianzhui$i4doneecho "用户查询完毕"
else echo 请输入正确的内容[y|d|i]
fi
[root@web01 Day04]# sh yonghu.sh
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1 qwer2 qwer3 qwer4 qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]d不存在不需要删除
[root@web01 Day04]# sh yonghu.sh
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1 qwer2 qwer3 qwer4 qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]y创建成功创建成功创建成功创建成功创建成功
[root@web01 Day04]# sh yonghu.sh
请输入用户的前缀: qwer
请输入要操作的数量: 5
为您生成如下用户
qwer1 qwer2 qwer3 qwer4 qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]i  uid=1010(qwer1) gid=1010(qwer1) groups=1010(qwer1)
uid=1011(qwer2) gid=1011(qwer2) groups=1011(qwer2)
uid=1012(qwer3) gid=1012(qwer3) groups=1012(qwer3)
uid=1013(qwer4) gid=1013(qwer4) groups=1013(qwer4)
uid=1014(qwer5) gid=1014(qwer5) groups=1014(qwer5)
用户查询完毕
[root@web01 Day04]# sh yonghu.sh
请输入用户的前缀: qwer   
请输入要操作的数量: 5
为您生成如下用户
qwer1 qwer2 qwer3 qwer4 qwer5
您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]d删除成功删除成功删除成功删除成功删除成功
(6)创建user1-user10,共10个用户,只有user5不创建家目录,不允许登入
[root@web01 Day04]# cat yonghu2.sh
#!/bin/bash
for i in `seq 10`
doif [ $i == 5 ];thenuseradd user$i -M -s /sbin/nologinelse	useradd user$ifi
done
[root@web01 Day04]# sh yonghu2.sh
[root@web01 Day04]# tail -10 /etc/passwd
user1:x:1013:1013::/home/user1:/bin/bash
user2:x:1014:1014::/home/user2:/bin/bash
user3:x:1015:1015::/home/user3:/bin/bash
user4:x:1016:1016::/home/user4:/bin/bash
user5:x:1017:1017::/home/user5:/sbin/nologin
user6:x:1018:1018::/home/user6:/bin/bash
user7:x:1019:1019::/home/user7:/bin/bash
user8:x:1020:1020::/home/user8:/bin/bash
user9:x:1021:1021::/home/user9:/bin/bash
user10:x:1022:1022::/home/user10:/bin/bash
[root@web01 Day04]# ls /home/|grep user
user1
user10
user2
user3
user4
user6
user7
user8
user9
[root@web01 Day04]# su - user5
su: warning: cannot change directory to /home/user5: No such file or directory
This account is currently not available.
2.while循环
while [条件表达式]    #表达式成立则执行,不成立不执行
do可执行命令
done#死循环,里面如果有read -p就会卡住
while true
doecho hehe
donewhile [ -f /etc/passwd ]
doecho hehe
done#循环1-100
i=1
while [ $i -le 100 ]
doecho $ilet i++
done
(1)while从1加到100
[root@web01 Day04]# cat test.sh 
#!/bin/bash
i=1
while [ $i -le 100 ]
dosum=$[sum+i]let i++
done
echo $sum
[root@web01 Day04]# sh test.sh 
5050

(2)while读取文件,按照行读取内容

用for也能做,用while方便些

[root@web01 Day04]# cat yonghu.txt
zs 123
ls 456
lw 789
[root@web01 Day04]# cat duqu.sh
while read line
douser=`echo $line|awk '{print $1}'`pass=`echo $line|awk '{print $2}'`useradd $userecho $pass|passwd --stdin $user
done<yonghu.txt
[root@web01 Day04]# sh duqu.sh
Changing password for user zs.
passwd: all authentication tokens updated successfully.
Changing password for user ls.
passwd: all authentication tokens updated successfully.
Changing password for user lw.
passwd: all authentication tokens updated successfully.
[root@web01 Day04]# su - zs
[zs@web01 ~]$ su - ls
Password: 
[ls@web01 ~]$ exit
logout
[zs@web01 ~]$ exit
logout

用for来操作,需要新设个变量除以2判断奇数还是偶数,奇数是用户名,偶数是密码

[root@web01 Day04]# cat duqu_for.sh
#!/bin/bash
for i in `cat yonghu.txt`
do	let q++re=`echo $q%2|bc`if [ "$re" == 1 ];thenuser=$iuseradd $userelsepass=$iecho $pass|passwd --stdin $userfi
done
[root@web01 Day04]# sh duqu_for.sh
Changing password for user zs.
passwd: all authentication tokens updated successfully.
Changing password for user ls.
passwd: all authentication tokens updated successfully.
Changing password for user lw.
passwd: all authentication tokens updated successfully.
[root@web01 Day04]# tail -3 /etc/passwd
zs:x:1023:1023::/home/zs:/bin/bash
ls:x:1024:1024::/home/ls:/bin/bash
lw:x:1025:1025::/home/lw:/bin/bash
(3)while统计行数
[root@web01 Day04]# cat hangshu.sh
#!/bin/bash
wenjian=/etc/passwd
while read line
dolet i++
done<$wenjian
echo "$wenjian 中总共 $i 行"
[root@web01 Day04]# sh hangshu.sh
/etc/passwd 中总共 34 行
3. 流程控制语句
exit,break,continueexit                    退出脚本break                 跳出循环continue            忽略当前剩余代码,从头继续执行
(1)exit
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
doecho 1exitecho 2
done
echo 3
[root@web01 Day04]# sh liucheng.sh
1
(2)break
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
doecho 1breakecho 2
done
echo 3
[root@web01 Day04]# sh liucheng.sh
1
3
(3)continue
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
doecho 1continueecho 2
done
echo 3
[root@web01 Day04]# sh liucheng.sh
1
1
1
......#continu使用示例
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
doread -p "请输入密码: " passif ! [ $pass == 123456 ];thenecho "密码输入错误"continueelseecho "密码输入正确"break;fi
done
echo "登录成功"
[root@web01 Day04]# sh liucheng.sh
请输入密码: 1
密码输入错误
请输入密码: 123456
密码输入正确
登录成功
4.函数
1、完成特定功能的代码块2、可以复用3、函数类似变量,先定义再调用,区别是变量不调用也会执行,但是函数不调用不执行
(1)函数定义
[root@web01 Day04]# cat fun.sh
#!/bin/bash
fun1(){echo "第一种函数定义方法"	
}
function fun2 {                    #注意不加括号有空格echo "第二种函数定义方法"
}
function fun3(){echo "第三种函数定义方法"
}
fun1
fun2
fun3
[root@web01 Day04]# sh fun.sh
第一种函数定义方法
第二种函数定义方法
第三种函数定义方法

与变量不同,函数不调用不执行,变量不调用也执行

[root@web01 Day04]# cat fun.sh
#!/bin/bash
name=koten
fun1(){echo "第一种函数定义方法"	
}
function fun2 {echo "第二种函数定义方法"
}
function fun3(){echo "第三种函数定义方法"
}
[root@web01 Day04]# sh -x fun.sh
+ name=koten

想在当前shell执行,直接source脚本或者. 脚本即可,跟变量同理

[root@web01 Day04]# source fun.sh 
[root@web01 Day04]# echo $name
koten
[root@web01 Day04]# fun1
第一种函数定义方法
(2)函数传参

与脚本传参不同,函数中不能直接接受shell的传参

错误方式

[root@web01 Day04]# cat chuancan.sh
#!/bin/bash
fun1(){if [ -f $1 ];thenecho 文件存在else	echo 文件不存在fi
}
fun1
[root@web01 Day04]# sh chuancan.sh /etc/passwd  #虽然显示存在 
文件存在
[root@web01 Day04]# sh -x chuancan.sh /etc/passwd  #但是看流程,函数中并没有显示
+ fun1
+ '[' -f ']'
+ echo 文件存在
文件存在

正确用法,直接写到调用名称后面

[root@web01 Day04]# cat chuancan.sh
#!/bin/bash
fun1(){if [ -f $1 ];thenecho 文件存在else	echo 文件不存在fi
}
fun1 $1
[root@web01 Day04]# sh chuancan.sh /etc/passwd
文件存在

注意区分脚本中的参数与函数中的参数

[root@web01 Day04]# cat chuancan.sh
#!/bin/bash
fun1(){if [ -f $1 ];then        #这个是调用函数的传参echo $1 文件存在else	echo $1 文件不存在fi
}
fun1 $2 $1    #这个是执行脚本时候的传参
[root@web01 Day04]# sh chuancan.sh /etc/hosts /etc/passwd
/etc/passwd 文件存在

也可以通过变量的方式传参,一开始定义好变量

[root@web01 Day04]# cat chuancan.sh
#!/bin/bash
file=$1
fun1(){if [ -f $file ];thenecho $file 文件存在else	echo $file 文件不存在fi
}
fun1
[root@web01 Day04]# sh chuancan.sh /etc/passwd
/etc/passwd 文件存在
(3)函数变量

函数中可以调用shell脚本的变量

在函数中定义的变量可以只在函数体中生效,在shell中不生效

#正常是在函数体内外都会生效
[root@web01 Day04]# cat bianliang.sh
#!/bin/bash
fun1(){name=bossecho $name
}
fun1
echo $name
[root@web01 Day04]# sh bianliang.sh
boss
boss#只在函数体中生效
[root@web01 Day04]# cat bianliang.sh
#!/bin/bash
fun1(){local name=bossecho $name
}
fun1
echo $name
[root@web01 Day04]# sh bianliang.sh
boss[root@web01 Day04]# 
(4)函数返回值

exit和return都可以定义

[root@web01 Day04]# cat fanhuizhi.sh 
#!/bin/bash
if [ -f $1 ];thenecho "$1 存在"exit 100
else	echo "$1 不存在"exit 50
fi
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
/etc/passwd 存在
[root@web01 Day04]# echo $?
100[root@web01 Day04]# cat fanhuizhi.sh
#!/bin/bash
fun1(){if [ -f $1 ];thenecho "存在" return 100elseecho "不存在"return 99fi
}
fun1 $?
echo $?
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
不存在
99

使用返回值的时候容易出错,我们要时刻注意返回值是否有因为执行了新的命令而刷新

如下所示的错误写法!

[root@web01 Day04]# cat fanhuizhi.sh
#!/bin/bash
fun1(){
if [ -f $1 ];thenreturn 100
else	return 50
fi
}
fun1 $1
[ $? -eq 50 ] && echo 文件不存在
[ $? -eq 100 ] && echo 文件存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwdd
文件不存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
[root@web01 Day04]# 

由于在执行完函数后又执行了$?与50的判断,所以判断后$?刷新成了其他数值,所以永远不会echo出文件存在,这种情况一般有两种解决办法。 

[root@web01 Day04]# cat fanhuizhi.sh 
#!/bin/bash
fun1(){
if [ -f $1 ];thenreturn 100
else	return 50
fi
}
fun1 $1
[ $? -eq 50 ] && echo 文件不存在
echo $?
[ $? -eq 100 ] && echo 文件存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
1

一种是将两个条件表达式写成一个,在使用函数的返回值之前不执行其他命令。

[root@web01 Day04]# cat fanhuizhi.sh 
#!/bin/bash
fun1(){
if [ -f $1 ];thenreturn 100
else	return 50
fi
}
fun1 $1
[ $? -eq 50 ] && echo 文件不存在 || echo 文件存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
文件存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwdddd
文件不存在

另一种也是系统中常做的操作,就是当我们的函数体执行完毕后给一个变量,后面用变量去判断,这样$?有变化也没有关系,反正变量不会有变化。

[root@web01 Day04]# cat fanhuizhi.sh
#!/bin/bash
fun1(){[ -f $1 ];thenreturn 100
else	return 50
fi
}
fun1 $1
re=$?
[ $re -eq 50 ] && echo 文件不存在 
[ $re -eq 100 ] && echo 文件存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
文件存在
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwdddd
文件不存在
5.反向破解MD5

下面是随机数的md5值,4个取了前8位,2两个取了前7位,通过脚本反向破解出随机数

echo $((RANDOM))|md5sum|cut -c1-8
0b364f36
7f1e6feb
c5b795e2
5f8b9f68
echo $((RANDOM))|md5sum|cut -c1-7
081691c
76728eb

我们的思路就是利用for循环反向破解,优化就是尽可能少的操作,加快遍历速度,更快的破解出来

[root@web01 Day04]# cat fanxiang.sh 
#!/bin/bash
for i in `seq 32767`
domd5=`echo $i|md5sum`md5_7=`echo $md5|cut -c1-7`md5_8=`echo $md5|cut -c1-8`if [ "$md5_7" == 081691c ];thenecho $i $md5_7elif [ "$md5_7" == 76728eb ];thenecho $i $md5_7elif [ "$md5_8" == 0b364f36 ];thenecho $i $md5_8elif [ "$md5_8" == 7f1e6feb ];thenecho $i $md5_8elif [ "$md5_8" == c5b795e2 ];thenecho $i $md5_8elif [ "$md5_8" == 5f8b9f68 ];thenecho $i $md5_8  fi
done
[root@web01 Day04]# sh fanxiang.sh
691 c5b795e2
5343 081691c
11902 7f1e6feb
21364 76728eb
25375 5f8b9f68
30458 0b364f36

相关文章:

Shell编程(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)

本篇文章继续给大家介绍Shell编程&#xff0c;包括for循环、并发问题&#xff0c;while循环&#xff0c;流程控制语句&#xff0c;函数传参、函数变量、函数返回值&#xff0c;反向破解MD5等内容。 1.for循环 for 变量 in [取值列表] 取值列表可以是数字 字符串 变量 序列…...

强化学习数学原理(三)——值迭代

一、值迭代过程 上面是贝尔曼最优公式&#xff0c;之前我们说过&#xff0c;f(v)v&#xff0c;贝尔曼公式是满足contraction mapping theorem的&#xff0c;能够求解除它最优的策略和最优的state value&#xff0c;我们需要通过一个最优v*&#xff0c;这个v*来计算状态pi*&…...

Day27-【13003】短文,什么是栈?栈为何用在递归调用中?顺序栈和链式栈是什么?

文章目录 第三章栈和队列总览第一节栈概览栈的定义及其基本操作如何定义栈和栈的操作&#xff1f;合理的出栈序列个数如何计算&#xff1f;栈的两种存储方式及其实现&#xff1f;顺序栈及其实现&#xff0c;还有对应时间复杂度*、清空栈&#xff0c;初始化栈5、栈空&#xff0c…...

[JMCTF 2021]UploadHub

题目 上传.htaccess就是修改配置文件 <FilesMatch .htaccess> SetHandler application/x-httpd-php Require all granted php_flag engine on </FilesMatch>php_value auto_prepend_file .htaccess #<?php eval($_POST[md]);?>SetHandler和ForceType …...

C++学习——认识和与C的区别

目录 前言 一、什么是C 二、C关键字 三、与C语言不同的地方 3.1头文件 四、命名空间 4.1命名空间的概念写法 4.2命名空间的访问 4.3命名空间的嵌套 4.4命名空间在实际中的几种写法 五、输入输出 5.1cout 5.2endl 5.3cin 总结 前言 开启新的篇章&#xff0c;这里…...

为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约

本文要点 要点 AI操作系统处理的是 疑问&#xff08;信念问题&#xff09;、缺省&#xff08;逻辑问题&#xff09;和异常(不可控因素 ) 而 内核 的三大功能 &#xff08;资源分配/进程管理/任务调度&#xff09;以及外围的三类接口&#xff08; CLI、GUI和表面模型的 运行时…...

基于SpringBoot的网上摄影工作室开发与实现 | 含论文、任务书、选题表

随着互联网技术的不断发展&#xff0c;摄影爱好者们越来越需要一个在线平台来展示和分享他们的作品。基于SpringBoot的网上摄影工作室应运而生&#xff0c;它不仅为用户提供了一个展示摄影作品的平台&#xff0c;还为管理员提供了便捷的管理工具。本文幽络源将详细介绍该系统的…...

Flutter子页面向父组件传递数据方法

在 Flutter 中&#xff0c;如果父组件需要调用子组件的方法&#xff0c;可以通过以下几种方式实现。以下是常见的几种方法&#xff1a; 方法 1&#xff1a;使用 GlobalKey 和 State 调用子组件方法 这是最直接的方式&#xff0c;通过 GlobalKey 获取子组件的 State&#xff0c…...

回顾Maven

Maven Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 管理jar包管理jar包之间的依赖关系&#xff08;其中一个jar包可能同时依赖多个…...

除了layui.js还有什么比较好的纯JS组件WEB UI?在谷歌浏览上显示

以下是一些比较好的纯JS组件WEB UI&#xff0c;可以在谷歌浏览器上良好显示&#xff1a; 1. Sencha 特点&#xff1a;提供超过140个高性能UI组件&#xff0c;用于构建现代应用程序。支持与Angular和React集成&#xff0c;提供企业级网格解决方案。 适用场景&#xff1a;适用于…...

力扣111二叉树的最小深度(DFS)

Problem: 111. 二叉树的最小深度 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲望求出最短的路径&#xff0c;先可以记录一个变量minDepth&#xff0c;同时记录每次当前节点所在的层数currentDepth 2.在递的过程中&#xff0c;每次递一层&#xff0c;也即使当前又往下走…...

c++学习第十三天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、vector 1.介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空…...

zookeeper-3.8.3-基于ACL的访问控制

ZooKeeper基于ACL的访问控制 ZooKeeper 用ACL控制对znode的访问&#xff0c;类似UNIX文件权限&#xff0c;但无znode所有者概念&#xff0c;ACL指定ID及对应权限&#xff0c;且仅作用于特定znode&#xff0c;不递归。 ZooKeeper支持可插拔认证方案&#xff0c;ID格式为scheme…...

Java定时任务实现方案(四)——Spring Task

Spring Task 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第四个方案&#xff0c;使用Spring Task&#xff0c;以及该方案的优点和缺点。 ​ Spring Task是Spring框架提供的一个轻量级任务调度框架&#xff0c;用于简化任务调度的开放&#xff0c;通过注解或XML配置的…...

WGCLOUD运维工具从入门到精通 - 如何设置主题背景

需要升级到WGCLOUD的v3.5.7或者以上版本&#xff0c;才会支持自定义设置主题背景色 WGCLOUD下载&#xff1a;www.wgstart.com 我们登录后&#xff0c;在右上角点击如下的小图标&#xff0c;就可以设置主题背景色了&#xff0c;包括&#xff1a;经典白&#xff08;默认&#x…...

Babylon.js 中的 setHardwareScalingLevel和getHardwareScalingLevel:作用与配合修改内容

在 Babylon.js 中&#xff0c;Engine类提供了setHardwareScalingLevel和getHardwareScalingLevel方法&#xff0c;用于管理和调整渲染分辨率与屏幕分辨率的比例。这些方法在优化性能和提升画质方面非常有用。尤其是在某些平台不支持硬件反锯齿时&#xff0c;可以考虑使用setHar…...

Qwen2-VL:在任何分辨率下增强视觉语言模型对世界的感知 (大型视觉模型 核心技术 分享)

摘要 我们推出了Qwen2-VL系列,这是对之前Qwen-VL模型的高级升级,重新定义了视觉处理中的常规预设分辨率方法。Qwen2-VL引入了Naive Dynamic Resolution机制,使模型能够动态地将不同分辨率的图像转换为不同的视觉令牌数量。这种方法允许模型生成更高效和准确的视觉表示,紧密…...

Docker——入门介绍

目录 1.初识 Docker1.1.什么是 Docker1.1.1.应用部署的环境问题1.1.2.Docker 解决依赖兼容问题1.1.3.Docker 解决操作系统环境差异1.1.4.小结 1.2.Docker 和虚拟机的区别1.3.Docker 架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker 架构1.3.4.小结 1.4.安装 Docker1.4.1.概述…...

02数组+字符串+滑动窗口+前缀和与差分+双指针(D2_字符串(D2_刷题练习))

目录 1. 最长公共前缀 1.1. 题目描述 1.2. 解题方案 方案一&#xff1a;纵向对比 方案二&#xff1a;横向对比 方案三&#xff1a;最值对比 方案四&#xff1a;分治 方案五&#xff1a;二分 1.3. 知识归纳 2. 左旋转字符串&#xff08;简单&#xff09; 2.1. 题目描述…...

【redis进阶】集群 (Cluster)

目录 一、基本概念 二、数据分片算法 2.1 哈希求余 2.2 一致性哈希算法 3.3 哈希槽分区算法 (Redis 使用) 三、集群搭建 (基于 docker) 3.1 创建目录和配置 3.2 编写 docker-compose.yml 3.3 启动容器 3.4 构建集群 四、主节点宕机 4.1 处理流程 五、集群扩容 六、集群缩容 (选…...

Python案例--100到200的素数

一、问题描述 素数&#xff08;Prime Number&#xff09;是指在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数的数。判断一个数是否为素数是计算机科学和数学中的一个经典问题。本实例的目标是找出101到200之间的所有素数&#xff0c;并统计它们的数量。 二、…...

C语言,无法正常释放char*的空间

问题描述 #include <stdio.h> #include <stdio.h>const int STRSIZR 10;int main() {char *str (char *)malloc(STRSIZR*sizeof(char));str "string";printf("%s\n", str);free(str); } 乍一看&#xff0c;这块代码没有什么问题。直接书写…...

重回C语言之老兵重装上阵(十五)C语言错误处理

C语言错误处理 在C语言中&#xff0c;错误处理是非常重要的一部分。C语言没有像高级语言&#xff08;例如Python、Java&#xff09;那样内建的异常处理机制&#xff08;如try-catch&#xff09;&#xff0c;但它提供了几种方法来捕捉和处理错误。正确的错误处理可以提高程序的稳…...

基于微信的课堂助手小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Effective C++ 规则50:了解 new 和 delete 的合理替换时机

1、背景 在 C 中&#xff0c;new 和 delete 是动态分配内存的核心操作符。然而&#xff0c;直接使用它们有时会增加程序的复杂性&#xff0c;甚至导致内存泄漏和其他问题。因此&#xff0c;了解何时替换 new 和 delete 并选择更适合的内存管理策略&#xff0c;是编写高效、健壮…...

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 Alfresco Content Services&#xff08;简称ACS&#xff09;是一款功能完备的企业内容管理&#xff08;ECM&#xff09;解决方案&#xff0c;主要面向那些对企业级内容管理有高要求的组织。具体…...

学习第七十六行

提高github下载速度方法 1.github转码云 2.https://github.com.cnpmjs.org com后面加东西 对于面试笔试&#xff0c;最好方法刷力扣&#xff0c;1000题包进大厂的...

YOLOv11改进,YOLOv11检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等任务

摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价&#xff0c;可以直接输出excel&#xff0c;并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode&#xff1a; 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目&#xff0c;实现了…...

【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接&#xff1a; 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…...