赞
踩
在实际工作中,经常会遇到某项目需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,命令都是相同的。当面对各种列表重复执行任务时,使用简单的if语句很难满足要求,并且顺序编写全部代码更是显得异常繁琐,这时候就可以使用for循环语句,可以很好的解决这样的问题。
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
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。
for 循环语句的语法结构如下
for 变量名 in 取值列表
do
命令序列
done
首先将列表中的第1个取值赋给变量,并执行 do···done循环体中的命令序列
然后将列表中的第2个取值赋给变量,并执行循环体中的命令序列……
以此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
[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
[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 密码正确 #密码输入成功提示密码输入正确
for循环语句非常适合于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用while语句。
使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。但是在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。
循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while循环语句的语法结构如下所示:
while 条件测试操作
do
命令序列
done
首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do···done 循环体中的命令序列
返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体
再次返回到 while 后,判断条件测试结果…如此循环
直到 while 后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环
[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 你猜对了!
生成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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。