Shell编程之循环语句

46 篇文章 3 订阅
15 篇文章 1 订阅

引言

在实际工作中,经常会遇到某项目需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,命令都是相同的。当面对各种列表重复执行任务时,使用简单的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                                  
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开,静待绽放!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值