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

news2025/1/31 3:09:34

本篇文章继续给大家介绍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
do
	echo $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
do
	echo $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
do
	echo $i
done
[root@web01 Day04]# sh test.sh
10
20
30
 
[root@web01 Day04]# cat test.sh
#!/bin/bash
for i in {1..5}
do
	echo $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}
do
	echo $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}
do
	IP=10.0.0.$i
	ping -c1 -W1 $IP &> /dev/null
	if [ $? -eq 0 ];then
	echo $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.$i
	ping -c1 -W1 $IP &> /dev/null
	if [ $? -eq 0 ];then
	echo $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.$i
        ping -c2 -W2 $IP &> /dev/null
        if [ $? -eq 0 ];then
        echo $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.$i
	ping -c2 -W2 $IP &> /dev/null
	if [ $? -eq 0 ];then
	echo $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`
do
	for b in `seq $i`
	do
	printf "$b x $i = $[i*b]\t"    #printf是格式化输出
	done
	printf "\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`
do
	echo $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`
do
	useradd $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] ]];then
	echo 请注意前缀输入格式 
	exit	
fi
read -p "请输入要操作的数量: " num1
if ! [[ $num1 =~ ^[0-9]+$ ]];then
        echo 请注意输入数量的格式
        exit
fi
echo 为您生成如下用户
shuchu=""
for i1 in $(seq $num1)
do
	shuchu="$shuchu $qianzhui$i1"
done
echo $shuchu
read -p "您可以选择操作y为创建,d为删除,i为查看用户id[y|d|i]" caozuo
if [ $caozuo == y ];then
	for i2 in $(seq $num1)
	do		
		id $qianzhui$i2 &> /dev/null
		if [ $? -eq 0 ];then
			echo "$user 已存在"
		else
        		useradd $qianzhui$i2
			if [ $? -eq 0 ];then
				echo "$user 创建成功"
			fi
		fi
	done	
elif [ $caozuo == d ];then
	for i3 in $(seq $num1)
        do
                id $qianzhui$i3 &> /dev/null
                if [ $? -ne 0 ];then
                        echo "$user 不存在不需要删除"
			exit
 
                else
                        userdel -rf $qianzhui$i3
                        if [ $? -eq 0 ];then
                                echo "$user 删除成功"
                        fi
                fi
        done
elif [ $caozuo == i ];then
        for i4 in $(seq $num1)
        do
                id $qianzhui$i4
        done
        echo "用户查询完毕"
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`
do
	if [ $i == 5 ];then
		useradd user$i -M -s /sbin/nologin
	else	
		useradd user$i
	fi
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
do
    echo hehe
done
 
while [ -f /etc/passwd ]
do
    echo hehe
done
 
#循环1-100
i=1
while [ $i -le 100 ]
do
    echo $i
    let i++
done
(1)while从1加到100
[root@web01 Day04]# cat test.sh 
#!/bin/bash
i=1
while [ $i -le 100 ]
do
    sum=$[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
do
	user=`echo $line|awk '{print $1}'`
	pass=`echo $line|awk '{print $2}'`
	useradd $user
	echo $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 ];then
		user=$i
		useradd $user
	else
		pass=$i
		echo $pass|passwd --stdin $user
	fi
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
do
	let i++
done<$wenjian
echo "$wenjian 中总共 $i 行"
[root@web01 Day04]# sh hangshu.sh
/etc/passwd 中总共 34 行
3. 流程控制语句
exit,break,continue

exit                    退出脚本

break                 跳出循环

continue            忽略当前剩余代码,从头继续执行
(1)exit
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
do
	echo 1
	exit
	echo 2
done
echo 3
[root@web01 Day04]# sh liucheng.sh
1
(2)break
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
do
	echo 1
	break
	echo 2
done
echo 3
[root@web01 Day04]# sh liucheng.sh
1
3
(3)continue
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
do
	echo 1
	continue
	echo 2
done
echo 3
[root@web01 Day04]# sh liucheng.sh
1
1
1
......
 
#continu使用示例
[root@web01 Day04]# cat liucheng.sh
#!/bin/bash
while true
do
	read -p "请输入密码: " pass
	if ! [ $pass == 123456 ];then
		echo "密码输入错误"
		continue
	else
		echo "密码输入正确"
		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 ];then
		echo 文件存在
	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 ];then
		echo 文件存在
	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 ];then
		echo $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=boss
	echo $name
}
fun1
echo $name
[root@web01 Day04]# sh bianliang.sh
boss
boss
 
#只在函数体中生效
[root@web01 Day04]# cat bianliang.sh
#!/bin/bash
fun1(){
	local name=boss
	echo $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 ];then
	echo "$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 ];then
		echo "存在" 
		return 100
	else
		echo "不存在"
		return 99
	fi
}
fun1 $?
echo $?
[root@web01 Day04]# sh fanhuizhi.sh /etc/passwd
不存在
99

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

如下所示的错误写法!

[root@web01 Day04]# cat fanhuizhi.sh
#!/bin/bash
fun1(){
if [ -f $1 ];then
	return 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 ];then
	return 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 ];then
	return 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 ];then
	return 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`
do
	md5=`echo $i|md5sum`
	md5_7=`echo $md5|cut -c1-7`
	md5_8=`echo $md5|cut -c1-8`
	if [ "$md5_7" == 081691c ];then
		echo $i $md5_7
	elif [ "$md5_7" == 76728eb ];then
		echo $i $md5_7
        elif [ "$md5_8" == 0b364f36 ];then
                echo $i $md5_8
        elif [ "$md5_8" == 7f1e6feb ];then
                echo $i $md5_8
        elif [ "$md5_8" == c5b795e2 ];then
                echo $i $md5_8
        elif [ "$md5_8" == 5f8b9f68 ];then
                echo $i $md5_8  
	fi
done
[root@web01 Day04]# sh fanxiang.sh
691 c5b795e2
5343 081691c
11902 7f1e6feb
21364 76728eb
25375 5f8b9f68
30458 0b364f36

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入 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;使用线程池…

全程Kali linux---CTFshow misc入门

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

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

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

[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定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

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

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

【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…

新项目上传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…

二叉树高频题目——下——不含树型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&#…

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

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

Redis --- 分布式锁的使用

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

使用shell命令安装virtualbox的虚拟机并导出到vagrant的Box

0. 安装virtualbox and vagrant [rootolx79vagrant ~]# cat /etc/resolv.conf #search 114.114.114.114 nameserver 180.76.76.76-- install VirtualBox yum install oraclelinux-developer-release-* wget https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7 -O /etc/pki/rpm-g…

2025数学建模美赛|赛题翻译|E题

2025数学建模美赛&#xff0c;E题赛题翻译 更多美赛内容持续更新中...

SpringBoot统一数据返回格式 统一异常处理

统一数据返回格式 & 统一异常处理 1. 统一数据返回格式1.1 快速入门1.2 存在问题1.3 案列代码修改1.4 优点 2. 统一异常处理 1. 统一数据返回格式 强制登录案例中,我们共做了两部分⼯作 通过Session来判断⽤⼾是否登录对后端返回数据进⾏封装,告知前端处理的结果 回顾 后…

C语言学习强化

前言 数据的逻辑结构包括&#xff1a; 常见数据结构&#xff1a; 线性结构&#xff1a;数组、链表、队列、栈 树形结构&#xff1a;树、堆 图形结构&#xff1a;图 一、链表 链表是物理位置不连续&#xff0c;逻辑位置连续 链表的特点&#xff1a; 1.链表没有固定的长度…