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

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 [取值列表] 取值列表可以是数字 字符串 变量 序列…...

深入 Rollup:从入门到精通(三)Rollup CLI命令行实战

准备阶段&#xff1a;初始化项目 初始化项目&#xff0c;这里使用的是pnpm&#xff0c;也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…...

CycleGAN模型解读(附源码+论文)

CycleGAN 论文链接&#xff1a;Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 官方链接&#xff1a;pytorch-CycleGAN-and-pix2pix 老规矩&#xff0c;先看看效果 总体流程 先简单过一遍流程&#xff0c;细节在代码里说。CycleGAN有…...

线程配置经验

工作时&#xff0c;时常会遇到&#xff0c;线程相关的问题与解法&#xff0c;本人会持续对开发过程中遇到的关于线程相关的问题及解决记录更新记录在此篇博客中。 目录 一、线程基本知识 1. 线程和进程 二、问题与解法 1. 避免乘法级别数量线程并行 1&#xff09;使用线程池…...

动态规划DP 数字三角形模型 传纸条(题目分析+C++完整代码)

传纸条 原题链接 AcWing 275. 传纸条 题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。 一次素质拓展活动中&#xff0c;班上同学安排坐成一个 m行 n 列的矩阵&#xff0c;而小渊和小轩被安排在矩阵对角线的两端&#xff0c;因此&#x…...

Ubuntu二进制部署K8S 1.29.2

本机说明 本版本非高可用&#xff0c;单Master&#xff0c;以及一个Node 新装的 ubuntu 22.04k8s 1.29.3使用该文档请使用批量替换 192.168.44.141这个IP&#xff0c;其余照着复制粘贴就可以成功需要手动 设置一个 固定DNS&#xff0c;我这里设置的是 8.8.8.8不然coredns无法…...

第05章 10 地形梯度场模拟显示

在 VTK&#xff08;Visualization Toolkit&#xff09;中&#xff0c;可以通过计算地形数据的梯度场&#xff0c;并用箭头或线条来表示梯度方向和大小&#xff0c;从而模拟显示地形梯度场。以下是一个示例代码&#xff0c;展示了如何使用 VTK 和 C 来计算和显示地形数据的梯度场…...

全程Kali linux---CTFshow misc入门

图片篇(基础操作) 第一题&#xff1a; ctfshow{22f1fb91fc4169f1c9411ce632a0ed8d} 第二题 解压完成后看到PNG&#xff0c;可以知道这是一张图片&#xff0c;使用mv命令或者直接右键重命名&#xff0c;修改扩展名为“PNG”即可得到flag。 ctfshow{6f66202f21ad22a2a19520cdd…...

[ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025

文章目录 IntroduceProject StructureDeclare Plugins and ModulesApply Plugins and Add DependenciesSender PropertiesSender ApplicationSender ControllerReceiver PropertiesReceiver ApplicationReceiver Message HandlerCongratulationsAutomatically Send Message By …...

深度学习笔记——循环神经网络之LSTM

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络LSTM知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作…...

AI 模型评估与质量控制:生成内容的评估与问题防护

在生成式 AI 应用中&#xff0c;模型生成的内容质量直接影响用户体验。然而&#xff0c;生成式模型存在一定风险&#xff0c;如幻觉&#xff08;Hallucination&#xff09;问题——生成不准确或完全虚构的内容。因此&#xff0c;在构建生成式 AI 应用时&#xff0c;模型评估与质…...

[MILP] Logical Constraints 0-1 (Note2)

1. 如果选择了项目1&#xff0c;则项目2&#xff0c;3也要求被选中 表示为&#xff1a; 2. 如果确定了选项目1&#xff0c;则接下来必须选项目2或者项目3 表示为&#xff1a; or 3. 如果同时选择了项目2和项目3&#xff0c;则不可以选择项目1 表示为&#xff1a; 4. 如果…...

DFFormer实战:使用DFFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…...

蓝桥杯例题四

每个人都有无限潜能&#xff0c;只要你敢于去追求&#xff0c;你就能超越自己&#xff0c;实现梦想。人生的道路上会有困难和挑战&#xff0c;但这些都是成长的机会。不要被过去的失败所束缚&#xff0c;要相信自己的能力&#xff0c;坚持不懈地努力奋斗。成功需要付出汗水和努…...

如何复现o1模型,打造医疗 o1?

如何复现o1模型&#xff0c;打造医疗 o1&#xff1f; o1 树搜索一、起点&#xff1a;预训练规模触顶与「推理阶段&#xff08;Test-Time&#xff09;扩展」的动机二、Test-Time 扩展的核心思路与常见手段1. Proposer & Verifier 统一视角方法1&#xff1a;纯 Inference Sca…...

PostgreSQL TRUNCATE TABLE 操作详解

PostgreSQL TRUNCATE TABLE 操作详解 引言 在数据库管理中,经常需要对表进行操作以保持数据的有效性和一致性。TRUNCATE TABLE 是 PostgreSQL 中一种高效删除表内所有记录的方法。本文将详细探讨 PostgreSQL 中 TRUNCATE TABLE 的使用方法、性能优势以及注意事项。 什么是 …...

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 &#x1f30d;一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 &#x1f30d;二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…...

【NOI】C++程序结构入门之循环结构三-计数求和

文章目录 前言一、计数求和1.导入2.计数器3.累加器 二、例题讲解问题&#xff1a;1741 - 求出1~n中满足条件的数的个数和总和&#xff1f;问题&#xff1a;1002. 编程求解123...n问题&#xff1a;1004. 编程求1 * 2 * 3*...*n问题&#xff1a;1014. 编程求11/21/3...1/n问题&am…...

[Linux]Shell脚本中以指定用户运行命令

前言 当我们为Linux设置了用户自启动的shel脚本&#xff0c;默认会使用root用户执行启动脚本中的命令&#xff0c;那么我们如何在启动脚本中切换为指定用户指定命令呢。 命令 以下将列出两条命令&#xff0c;两条命令都可以实现以指定用户运行命令&#xff0c;凭喜好选择使用…...

通过 NAudio 控制电脑操作系统音量

根据您的需求&#xff0c;以下是通过 NAudio 获取和控制电脑操作系统音量的方法&#xff1a; 一、获取和控制系统音量 &#xff08;一&#xff09;获取系统音量和静音状态 您可以使用 NAudio.CoreAudioApi.MMDeviceEnumerator 来获取系统默认音频设备的音量和静音状态&#…...

新项目上传gitlab

Git global setup git config --global user.name “FUFANGYU” git config --global user.email “fyfucnic.cn” Create a new repository git clone gitgit.dev.arp.cn:casDs/sawrd.git cd sawrd touch README.md git add README.md git commit -m “add README” git push…...

【异步编程基础】FutureTask基本原理与异步阻塞问题

文章目录 一、FutureTask 的桥梁作用二、Future 模式与异步回调三、 FutureTask获取异步结果的逻辑1. 获取异步执行结果的步骤2. 举例说明3. FutureTask的异步阻塞问题 Runnable 用于定义无返回值的任务&#xff0c;而 Callable 用于定义有返回值的任务。然而&#xff0c;Calla…...

原生 Node 开发 Web 服务器

一、创建基本的 HTTP 服务器 使用 http 模块创建 Web 服务器 const http require("http");// 创建服务器const server http.createServer((req, res) > {// 设置响应头res.writeHead(200, { "Content-Type": "text/plain" });// 发送响应…...

LeetCode热题100(一)—— 1.两数之和

LeetCode热题100&#xff08;一&#xff09;—— 1.两数之和 题目描述代码实现思路解析 你好&#xff0c;我是杨十一&#xff0c;一名热爱健身的程序员在Coding的征程中&#xff0c;不断探索与成长LeetCode热题100——刷题记录&#xff08;不定期更新&#xff09; 此系列文章用…...

二叉树高频题目——下——不含树型dp

一&#xff0c;普通二叉树上寻找两个节点的最近的公共祖先 1&#xff0c;介绍 LCA&#xff08;Lowest Common Ancestor&#xff0c;最近公共祖先&#xff09;是二叉树中经常讨论的一个问题。给定二叉树中的两个节点&#xff0c;它的LCA是指这两个节点的最低&#xff08;最深&…...

vue事件总线(原理、优缺点)

目录 一、原理二、使用方法三、优缺点优点缺点 四、使用注意事项具体代码参考&#xff1a; 一、原理 在Vue中&#xff0c;事件总线&#xff08;Event Bus&#xff09;是一种可实现任意组件间通信的通信方式。 要实现这个功能必须满足两点要求&#xff1a; &#xff08;1&#…...

PyCharm介绍

PyCharm的官网是https://www.jetbrains.com/pycharm/。 以下是在PyCharm官网下载和安装软件的步骤&#xff1a; 下载步骤 打开浏览器&#xff0c;访问PyCharm的官网https://www.jetbrains.com/pycharm/。在官网首页&#xff0c;点击“Download”按钮进入下载页面。选择适合自…...

《CPython Internals》读后感

一、 为什么选择这本书&#xff1f; Python 是本人工作中最常用的开发语言&#xff0c;为了加深对 Python 的理解&#xff0c;更好的掌握 Python 这门语言&#xff0c;所以想对 Python 解释器有所了解&#xff0c;看看是怎么使用C语言来实现Python的&#xff0c;以期达到对 Py…...

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似&#xff0c;区别就在于预处理部分存在不同&#xff1b;本文简单介绍了下音频处理的方法&#xff0c;以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…...

Redis --- 分布式锁的使用

我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法&#xff0c;但是这样不能让锁跨JVM也就是跨进程去使用&#xff0c;只能适用在单体项目中如下图&#xff1a; 为了解决这种场景&#xff0c;我们就需要用一个锁监视器对全部集群进行监视…...