文章目录
引言
在实际工作中,经常会遇到某项目需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,命令都是相同的。当面对各种列表重复执行任务时,使用简单的if语句很难满足要求,并且顺序编写全部代码更是显得异常繁琐,这时候就可以使用for循环语句,可以很好的解决这样的问题。
1.echo命令参数
echo [参数] [字符串]
[root@clr /opt]# echo ${a}
1234567890
[root@clr /opt]# echo ${#a} #计算指定字符串a的长度
10
[root@clr /opt]# echo ${a:3:3} #求a字符串中下标为3,向后数3位所得到的字符切片
456
[root@clr /opt]# echo ${a:7:2} #求a字符串中下标为7,向后数2位所得到的字符切片
89
[root@clr /opt]# echo ${a:5:1} #求a字符串中下标为5,向后数1位所得到的字符切片
6
[root@clr /opt]# echo $RANDOM #输出任意随机数
3528
[root@clr /opt]# echo $[RANDOM % ${#a}] #输出0-9之间的任意随机数(${#a}=10)
8
[root@clr /opt]# num=7
[root@clr /opt]# b=6
[root@clr /opt]# num=$num$b
[root@clr /opt]# echo $num
76
[root@clr /opt]# b=8
[root@clr /opt]# num=$num$b
[root@clr /opt]# echo $num
768
[root@clr /opt]# num+=$b
[root@clr /opt]# echo $num
7688
[root@clr /opt]# num+=$b
[root@clr /opt]# echo $num
76888
[root@clr /opt]# echo -e '123\r456\f789' #-r用后面的字符串替换前面相同位数的字符串
456
789
[root@clr /opt]# echo -e '123344565\rabdnsi9' #用7位数的abdnsi9替换7位数的1233445
abdnsi965
[root@clr /opt]# echo -e '123\v456\f789' #换行,但光标仍停留在上一行结束的位置,——f与-v效果相同
123
456
789
[root@clr /opt]# echo -e "123\n456" #-n换行输出
123
456
[root@clr /opt]# echo -e "123456\c" #\c不产生进一步输出,-c后面不带参数时,效果和—n相同,不换行输出下一条命令(\c后面的字符不会输出)
123456[root@clr /opt]# echo -n "123456" #不换行输出下一条命令
123456[root@clr /opt]# echo -e "123456\c7893" #\c 不产生进一步输出 (\c 后面的字符不会输出)
123456[root@clr /opt]# echo -n "1234567893" #不换行输出下一条命令
1234567893[root@clr /opt]#
[root@clr /opt]# echo -e "1234\t567893" #-t添加制表符
1234 567893
2.for循环语句
2.1 for语句的结构
-
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。
-
for 循环语句的语法结构如下
for 变量名 in 取值列表
do
命令序列
done
- 上述语句结构中,操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do 和done之间的命令序列称为“循环体”,其中的执行语句需要引用变量以完成相应的任务。
2.2 for语句的执行流程
-
首先将列表中的第1个取值赋给变量,并执行 do···done循环体中的命令序列
-
然后将列表中的第2个取值赋给变量,并执行循环体中的命令序列……
-
以此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
2.3 for语句应用示例
- 根据姓名列表批量添加用户,操作如下
[root@clr /opt/mywork]# cat user.txt
gaozhenyang
ergouzi
wolong
fengchu
[root@clr /opt/mywork]# cat add.sh
#!/bin/bash
ud=$(cat /opt/mywork/user.txt)
for uname in $ud
do
useradd $uname
echo "123456" |passwd --stdin $uname &>/dev/null
echo "$uname用户创建成功"
done
[root@clr /opt/mywork]# bash add.sh
gaozhenyang用户创建成功
ergouzi用户创建成功
wolong用户创建成功
fengchu用户创建成功
[root@clr /opt/mywork]# tail -5 /etc/passwd
cd:x:1016:1016::/home/cd:/bin/bash
gaozhenyang:x:1017:1017::/home/gaozhenyang:/bin/bash
ergouzi:x:1018:1018::/home/ergouzi:/bin/bash
wolong:x:1019:1019::/home/wolong:/bin/bash
fengchu:x:1020:1020::/home/fengchu:/bin/bash
- 根据 IP 地址列表检查主机状态
[root@clr /opt/mywork]# cat ipadd
192.168.80.1
192.168.80.2
192.168.80.3
192.168.80.20
[root@clr /opt/mywork]# cat ip.sh
#!/bin/bash
host=$(cat /opt/mywork/ipadd)
for IP in $host
do
ping -c 3 -i 0.2 -W 3 $IP &>/dev/null #-c是发送ping包的数量为3
if [ $? -eq 0 ] #-i是收发信息的间隔时间为0.2s
then #-W是超时时间为3s
echo "HOST $IP is up"
else
echo "HOST $IP is down"
fi
done
[root@clr /opt/mywork]# bash ip.sh
HOST 192.168.80.1 is up
HOST 192.168.80.2 is up
HOST 192.168.80.3 is down
HOST 192.168.80.20 is up
- 密码输入正确和错误提示
[root@clr /opt/mywork]# cat mima.sh
#!/bin/bash
init=123456
for i in {1..3}
do
read -p "请输入用户密码:" passwd
if [ $passwd == $init ]
then
echo "密码正确"
exit
fi
done
echo "密码错误"
[root@clr /opt/mywork]# bash mima.sh
请输入用户密码:456123
请输入用户密码:4561596
请输入用户密码:469893
密码错误 #密码输入错误三次直接退出交互界面
[root@clr /opt/mywork]# bash mima.sh
请输入用户密码:66451
请输入用户密码:123456
密码正确 #密码输入成功提示密码输入正确
3. while循环语句
for循环语句非常适合于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用while语句。
3.1 while 语句的结构
使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。但是在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。
循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while循环语句的语法结构如下所示:
while 条件测试操作
do
命令序列
done
3.2 while 语句的执行流程
首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do···done 循环体中的命令序列
返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体
再次返回到 while 后,判断条件测试结果…如此循环
直到 while 后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环
3.3 while语句应用示例
- 批量添加规律编号的用户
[root@clr /opt/mywork]# cat useradd.sh
#!/bin/bash
add="clr"
i=1
while [ $i -le 10 ]
do
useradd ${add}$i
echo "123456"|passwd --stdin ${clr}$i &>/dev/null
let i++
done
[root@clr /opt/mywork]# bash useradd.sh
[root@clr /opt/mywork]# grep "clr" /etc/passwd | tail -10
clr1:x:1031:1031::/home/clr1:/bin/bash
clr2:x:1032:1032::/home/clr2:/bin/bash
clr3:x:1033:1033::/home/clr3:/bin/bash
clr4:x:1034:1034::/home/clr4:/bin/bash
clr5:x:1035:1035::/home/clr5:/bin/bash
clr6:x:1036:1036::/home/clr6:/bin/bash
clr7:x:1037:1037::/home/clr7:/bin/bash
clr8:x:1038:1038::/home/clr8:/bin/bash
clr9:x:1039:1039::/home/clr9:/bin/bash
clr10:x:1040:1040::/home/clr10:/bin/bash
上述脚本代码中,使用变量 i 来控制用户名称的编号,初始赋值为1,并且当取值大于10时终止循环。在循环中,通过语句 “let i++”(等同于i=‘expr $i+1’)来使变量i的值增加1,因此当执行第一次循环后i的值将变成2,执行第2次循环后i的值将变成3…以此类推。
- 猜数字大小
[root@clr /opt/mywork]# cat cai.sh
#!/bin/bash
NUM=8
while true
do
read -p "请输入数字:" sz
if [ $sz -eq $NUM ];then
echo "你猜对了!"
break
elif [ $sz -gt $NUM ];then
echo "你猜大了"
elif [ $sz -lt $NUM ];then
echo "你猜小了"
fi
done
[root@clr /opt/mywork]# bash cai.sh
请输入数字:4
你猜小了
请输入数字:6
你猜小了
请输入数字:7
你猜小了
请输入数字:8
你猜对了!
[root@clr /opt/mywork]# bash cai.sh
请输入数字:20
你猜大了
请输入数字:45
你猜大了
请输入数字:12
你猜大了
请输入数字:9
你猜大了
请输入数字:8
你猜对了!
4 shell脚本循环实战演练
生成8位随机密码;
[root@clr /opt]# cat passwd.sh
#!/bin/bash
str='1234567890'
for i in {1..8}
do
a=$[RANDOM % ${#str}]
tmp=${str:a:1}
passwd+=$tmp
done
echo "生成的8位随机密码为:$passwd"
[root@clr /opt]# bash passwd.sh
生成的8位随机密码为:34308093
[root@clr /opt]# bash passwd.sh
生成的8位随机密码为:60184466
[root@clr /opt]# bash passwd.sh
生成的8位随机密码为:42352352
[root@clr /opt]# bash passwd.sh
生成的8位随机密码为:79417826
余数倒排法求解二进制换算;
[root@clr /opt]# cat daopai.sh
#!/bin/bash
read -p "请输入一个0-255之间的整数:" num
for i in {1..8}
do
a=$[num % 2]$a
let num=$[num/2]
done
echo $a
[root@clr /opt]# bash daopai.sh
请输入一个0-255之间的整数:234
11101010
[root@clr /opt]# bash daopai.sh
请输入一个0-255之间的整数:674
10100010
减数正排法求解二进制换算
[root@clr /opt]# cat jianfa.sh
#!/bin/bash
read -p "请输入一个0-255之间的整数:" num
for i in {128,64,32,16,8,4,2,1}
do
NUM=$[num -i]
if [ $NUM -lt 0 ];then
echo -n 0
else
echo -n 1
#let num-=i
num=$[num -i]
fi
done
echo ''
[root@clr /opt]# bash jianfa.sh
请输入一个0-255之间的整数:192
11000000
[root@clr /opt]# bash jianfa.sh
请输入一个0-255之间的整数:123
01111011
[root@clr /opt]# free -m #查看内存使用情况
total used free shared buff/cache available
Mem: 3931 863 1434 33 1633 2791
Swap: 3968 0 3968
[root@clr /opt]# free -m | grep Mem | awk '{print $4}' #先过滤内存使用情况中Mem行,然后指定定位到该行内的第4字段
1434
[root@clr /opt]# echo '192.168.80.20'
192.168.80.20
[root@clr /opt]# echo '192.168.80.20' | awk -F. '{print $3}' #-F.表示以点分割字段,默认以空格、制表符进行分割
80
[root@clr /opt]# i='192.168.80.20' #获取字符串中的指定任意字段
[root@clr /opt]# echo ${i:0:4}
192.
[root@clr /opt]# echo ${i%%.*} #%%表示从字符串末尾开始删,删到最后一个点
192
[root@clr /opt]# echo ${i%.*} #%表示从字符串末尾开始删,删到第一个点
192.168.80
[root@clr /opt/mywork]# echo ${i#*.} ##表示从字符串的开头开始删,删到第一个点
168.80.20
[root@clr /opt/mywork]# echo ${i##*.} ###表示从字符串的开头开始删,删到最后一个点
20
[root@clr /opt/mywork]# cat -n clr.txt
1 1
2 2
3 3
4 455
5 6
6 7
7 7434
8 32
[root@clr /opt/mywork]# for a in $(cat clr.txt) #循环读取指定文件中的每行内容
> do
> echo $a
> done
1
2
3
455
6
7
7434
32
[root@clr /opt]# echo -e '123\r456\f789' #-r用后面的字符串替换前面相同位数的字符串
456
789
[root@clr /opt]# echo -e '123344565\rabdnsi9' #用7位数的abdnsi9替换7位数的1233445
abdnsi965
[root@clr /opt]# echo -e '123\v456\f789' #换行,但光标仍停留在上一行结束的位置,——f与-v效果相同
123
456
789
[root@clr /opt]# echo -e "123\n456" #-n换行输出
123
456
[root@clr /opt]# echo -e "123456\c" #\c不产生进一步输出,-c后面不带参数时,效果和—n相同,不换行输出下一条命令(\c后面的字符不会输出)
123456[root@clr /opt]# echo -n "123456" #不换行输出下一条命令
123456[root@clr /opt]# echo -e "123456\c7893" #\c 不产生进一步输出 (\c 后面的字符不会输出)
123456[root@clr /opt]# echo -n "1234567893" #不换行输出下一条命令
1234567893[root@clr /opt]#
[root@clr /opt]# echo -e "1234\t567893" #-t添加制表符
1234 567893
使用while循环读取指定文件中每行内容的两种方式;
[root@clr /opt/mywork]# while read b
> do
> echo $b
> done < clr.txt
1
2
3
455
6
7
7434
32
[root@clr /opt/mywork]# cat clr.txt | while read c
> do
> echo $c
> done
1
2
3
455
6
7
7434
32
[root@clr /opt/mywork]# cat clr.txt | while read c; do echo $c; done #上面形式的简写
1
2
3
455
6
7
7434
32
[root@clr /opt/mywork]# while read b; do echo $b; done < clr.txt #上面形式的简写
1
2
3
455
6
7
7434
32
for循环使用的默认分隔符IFS文件;
[root@clr /opt/mywork/demo]# for i in $(cat demo2.sh)
> do
> echo $i
> done
zhangsan
lisi
gao #此处以空格分割的字符串,也被换行输出了
zhenyang
er
goui
[root@clr /opt/mywork/demo]# set | grep IFS
IFS=$' \t\n' #for循环默认的空格、制表符、换行符进行换行输出
local i IFS='
local i IFS=" "'
local i IFS=" "'
local i IFS='
local i IFS='
local c i=0 IFS='
local IFS='
local IFS='
local option option2 i IFS='
IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local i IFS='
local IFS='
local i c='' IFS='
local OIFS=$IFS IFS='
IFS=$OIFS;
local IFS='
local IFS='
local IFS='
local IFS='
[root@clr /opt/mywork/demo]# IFS_OLD=$IFS #首先将环境变量值IFS进行备份,确保只在当前的for循环环境中修改IFS的参数内容
[root@clr /opt/mywork/demo]# IFS=$'\n'
[root@clr /opt/mywork/demo]# for i in $(cat demo2.sh); do echo $i; done
zhangsan
lisi
gao zhenyang
er goui
[root@clr /opt/mywork/demo]# set | grep IFS
IFS=$'\n'
IFS_OLD=$' \t\n'
local i IFS='
local i IFS=" "'
local i IFS=" "'
local i IFS='
local i IFS='
local c i=0 IFS='
local IFS='
local IFS='
local option option2 i IFS='
IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local i IFS='
local IFS='
local i c='' IFS='
local OIFS=$IFS IFS='
IFS=$OIFS;
local IFS='
local IFS='
local IFS='
local IFS='
[root@clr /opt/mywork/demo]# IFS=$IFS_OLD #再次将环境变量修改为原始值,防止对后续for循环语句的影响
[root@clr /opt/mywork/demo]# set | grep IFS
IFS=$' \t\n'
IFS_OLD=$' \t\n'
local i IFS='
local i IFS=" "'
local i IFS=" "'
local i IFS='
local i IFS='
local c i=0 IFS='
local IFS='
local IFS='
local option option2 i IFS='
IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local i IFS='
local IFS='
local i c='' IFS='
local OIFS=$IFS IFS='
IFS=$OIFS;
local IFS='
local IFS='
local IFS='
local IFS='
将指定文件按照每20行划分位一个文件;
[root@clr /opt/mywork/demo]# cat demo1.sh
#!/bin/bash
#定义记录行数的变量
a=0
#定义分割的文件序号标识
b=1
IFS_OLD=$IFS #先备份保存环境变量
IFS=$'\n' #在当前for循环中修改环境变量为以换行符进行分割
for i in $(cat passwd)
do
let a++
c=$[a % 20]
if [ $c -eq 0 ];then
echo $i >> wd-$b
let b++
else
echo $i >> wd-$b
fi
done
IFS=$IFS_OLD #运行完for循环条件后,再次将环境变量保存为原来的值,防止影响后续的for循环操作
[root@clr /opt/mywork/demo]# bash demo1.sh
[root@clr /opt/mywork/demo]# ls
demo1.sh passwd wd-1 wd-2 wd-3
[root@clr /opt/mywork/demo]# cat -n passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
18 colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
19 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
20 saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
21 gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin
22 saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
23 abrt:x:173:173::/etc/abrt:/sbin/nologin
24 setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin
25 rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
26 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
27 radvd:x:75:75:radvd user:/:/sbin/nologin
28 chrony:x:992:987::/var/lib/chrony:/sbin/nologin
29 unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin
30 qemu:x:107:107:qemu user:/:/sbin/nologin
31 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
32 sssd:x:990:984:User for sssd:/:/sbin/nologin
33 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
34 geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin
35 ntp:x:38:38::/etc/ntp:/sbin/nologin
36 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
37 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
38 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
39 gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin
40 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
41 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
42 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
43 tcpdump:x:72:72::/:/sbin/nologin
44 cCLR:x:1000:1000:CLR:/home/cCLR:/bin/bash
[root@clr /opt/mywork/demo]# ls
demo1.sh passwd wd-1 wd-2 wd-3
[root@clr /opt/mywork/demo]# cat -n wd-1
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
18 colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
19 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
20 saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
[root@clr /opt/mywork/demo]# cat -n wd-2
1 gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin
2 saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
3 abrt:x:173:173::/etc/abrt:/sbin/nologin
4 setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin
5 rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
6 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
7 radvd:x:75:75:radvd user:/:/sbin/nologin
8 chrony:x:992:987::/var/lib/chrony:/sbin/nologin
9 unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin
10 qemu:x:107:107:qemu user:/:/sbin/nologin
11 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
12 sssd:x:990:984:User for sssd:/:/sbin/nologin
13 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
14 geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin
15 ntp:x:38:38::/etc/ntp:/sbin/nologin
16 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
17 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
18 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
19 gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin
20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@clr /opt/mywork/demo]# cat -n wd-3 #划分的最后一个文件行数不满20行
1 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
2 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
3 tcpdump:x:72:72::/:/sbin/nologin
4 cCLR:x:1000:1000:CLR:/home/cCLR:/bin/bash
[root@clr ~]# mkdir /opt/mywork/test
[root@clr ~]# cd !$
cd /opt/mywork/test
[root@clr /opt/mywork/test]# cp /etc/passwd /etc/shadow /etc/
[root@clr /opt/mywork/test]# ls
passwd shadow yum.conf
[root@clr /opt/mywork/test]# md5sum * #对当前目录下的所有文件求校验和
f9e8780619cb2b635221f61f8f85b741 passwd
9c5079a4484f6efb822d6a58ac669f41 shadow
a7dc0d7b8902e9c8c096c93eb431d19e yum.conf
[root@clr /opt/mywork/test]# md5sum * > /root/md5sum.txt #将原始校验和重定向写入到/root/md5sum.txt文件中
[root@clr /opt/mywork/test]# cat !$
cat /root/md5sum.txt
f9e8780619cb2b635221f61f8f85b741 passwd
9c5079a4484f6efb822d6a58ac669f41 shadow
a7dc0d7b8902e9c8c096c93eb431d19e yum.conf
[root@clr /opt/mywork/test]# pwd
/opt/mywork/test
[root@clr /opt/mywork/test]# echo 123456 >> shadow
[root@clr /opt/mywork/test]# md5sum * #可以查看到shadow文件的校验和发生改变
f9e8780619cb2b635221f61f8f85b741 passwd
37a28d21cb751a92b94bb161a2361441 shadow
a7dc0d7b8902e9c8c096c93eb431d19e yum.conf
假设/opt/test/ 目录中有多个重要文件,编写脚本使用 md5sum 命令一次性判别目录中的文件是否有发生过改动.
[root@clr /opt/mywork]# vim 5.sh
#!/bin/bash
for file in $(ls /opt/test)
do
SUM_NOW=$(md5sum /opt/test/$file | awk '{print $1}')
#SUM_NOW=$(md5sum $file | awk '{print $1}') #此处获取到的file文件需要绝对路径下的文>件,当上一句中不带/*时,此句也可用/opt/test/$file,查看新获得的校验和
SUM_OLD=$(grep $file /root/md5sum.txt | awk '{print $1}') #提取原先保存的校验和
if [ "$SUM_NOW" != "$SUM_OLD" ];then #如果校验和不一致,则说明文件有改动
echo "$file文件内容有改动!"
fi
done
输出环境变量PATH的目录所包含的所有可执行文件.
[root@clr /opt/mywork]# [ -x zic ]
[root@clr /opt/mywork]# echo $?
1
[root@clr /opt/mywork]# [ -x /usr/sbin/zic ]
[root@clr /opt/mywork]# echo $?
0
[root@clr /opt/mywork]# vim 6.sh
#!/bin/bash
IFSB=$IFS
IFS=$IFS':' #保留原来IFS变量值的基础上增加:号分隔符
for folder in $PATH
do
#echo $folder #输出环境变量所包含的目录
for file in $(ls $folder) #已使用:号将folder进行分割,然后查看环境变量目录下所包>含的文件
do
if [ -f "${folder}/${file}" ] && [ -x "${folder}/${file}" ];then #判断是否为文>件和是否具有可执行权限时,需要使用绝对路径进行判断
echo " $file"
fi
done
done
IFS=$IFSB