shell编程快速入门(二)

echo命令

输出指定的字符串或者变量。

参数:
-n  不要在最后自动换行
-e	激活转义字符。

若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文件输出:
\a 发出警告声;
\b 删除前一个字符;
\c 不产生进一步输出 (\c 后面的字符不会输出);
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入 nnn(八进制)所代表的ASCII字符;

shift位移

continue	忽略本次循环的剩余代码,直接进入下一个循环
break		结束当前循环,或跳出本层循环
shift		使位置参数向左位移,默认移动1位,可用使用shift2
exit		退出整个程序

sleep命令

将动作延迟一段时间

参数:
时间:指定要暂停时间的长度
时间长度,后面可接s,m,h或者d,分别为秒,分,时,天数
有时在写一些循环方式运行的监控脚本,设置时间间隔必不可少

案例:
每隔2秒输出依次系统负载情况,(负载是系统性能的基础重要指标)
[root@m01 scripts]# cat sleep01.sh 
#!/bin/bash
while true
do
    uptime >> /tmp/uptime.log
    sleep 2
done

usleep命令

对应微妙,1微妙等于0.001毫秒,1秒等于1000毫秒等于1000000微妙。

bg命令

将前台终端作业移动至后台运行。

fg命令

将后台作业移动至前台终端运行。

jobs命令

显示作业的状态,列出活动的作业,列出停止的作用。

选项:
-l	在作业信息中额外的列出PID
-n	至列出最近一次通知以来状态变更的作业
-p	只列出PID
-r	只输出处于运行状态的作业
-s	只输出处于停止状态的作业

nohup命令

将程序以忽略挂起信号的方式运行起来

seq命令

以指定增量从首数开始打印数字到尾数

参数:
-f	使用printf样式的浮点个数
-s	使用指定字符串分隔数字(默认使用:\n)
-w	在列前添加0,使得肯定相同

案例:
%后面指定数字的位数,默认是%G,%3g 数字位数不足部分是空格
[root@m01 ~]# seq -f "%g" 9 11
9
10
11
[root@m01 ~]# seq -f "%4g" 9 11
   9
  10
  11
[root@m01 ~]# seq -f "str%04g" 9 11
str0009
str0010
str0011
[root@m01 ~]# seq -f "str%4g" 9 11
str   9
str  10
str  11
这样的话数字位数不足部分是0,%前面制定字符串
[root@m01 ~]# seq 3
1
2
3
[root@m01 ~]# seq 8 10
8
9
10
[root@m01 ~]# seq -w 8 10
08
09
10
[root@m01 ~]# seq -s "#" 10
1#2#3#4#5#6#7#8#9#10

while循环介绍与实践

while语法介绍:
循环语句命令通常用于重复执行一条指令或一组指令,直到条件不满足停止,shell脚本语言循环语句常见有while,until,for 以及select循环语句。while循环语句主要用来执行一组命令或语句,在企业实际应用中,常用于守护进程持续运行的程序,除此之外,大多数循环都会使用for循环语句。

while 循环语法:

while <条件表达式>
do
	指令...
done

条件为真开始执行,条件为假停止执行。

while循环执行流程逻辑图

在这里插入图片描述

循环相关控制命令

用法说明
sh filename.sh &把脚本filename.sh放到后台执行(后台运行脚本常用)
nohup filename.sh &使用nohup把脚本放入后台执行
ctl+c停止执行当前脚本或任务
ctl+z暂停执行当前脚本或任务
bg把当前脚本或任务放到后台执行,bg可用理解为backround
fg把当中脚本或任务拿到前台执行,如果有多个认为任务,使用fg加任务标号,调出对应任务。
jobs查看当前执行的脚本或任务
kill关闭脚本或任务,即以 "kill %任务编号"的形式关闭脚本,这个任务编号可用通过jobs获得。

案例

1.使用while循环对下面的脚本进行修改,使得当执行脚本时,每次执行完脚本以后不退出脚本,而是继续提示用户输出。
[root@m01 scripts]# cat while_01.sh 
#!/bin/bash
while true
do
    read -p "请输入两个整数:" a b c
    if [[ -z $b ]]
    then
        echo "error1:参数个数小于2"
        continue
    elif [[ -n $c ]]
    then
        echo "error2:参数个数大于2"
        continue
    fi
    expr $a + $b + 3 &>/dev/null
    if [[ $? -ne 0 ]]
    then
        echo "error3:只能是整数"
        continue
    fi
    echo "a-b=$(($a-$b))"
    echo "a+b=$(($a+$b))"
    echo "a*b=$(($a*$b))"
    echo "a/b=$(($a/$b))"
    echo "a**b=$(($a**$b))"
    echo "a%b=$(($a%$b))"
done

2.猜数字游戏,首先让系统生成一个数字,给这个数字定一个范围(1-60),让用户输入猜的数字,对输入进行判断,如果不符合要求,就给与高或低的提示,猜对后则给出猜对用的次数,请使用while语句实现。
分析:
1)给数字一个范围(1-60)
echo $((RANDOM%60))执行脚本后是固定的
2) read -p  "请输入数字:" num
用户输入的数字和已知的随机数比较
3)连续猜需要while,结束当磁循环不退出脚本需要continue
[root@m01 scripts]# cat caishuzi.sh 
#!/bin/bash
random="$((RANDOM%60))"
count=0
while true
do
    ((count++))
    read -p "请输入一个数字:" num
    expr $num + 2 &>/dev/null
    if [[ $? -ne 0 ]]
    then
        echo "error1:请输入整数"
        continue
    fi
    if [[ $num -gt $random ]]
    then
        echo "猜大了"
    elif [[ $num -lt $random ]]
    then
        echo "猜小了"
    else
        echo "Bingo! 一共猜了${count}次"
        exit 1
    fi
done
[root@m01 scripts]# 
[root@m01 scripts]# sh caishuzi.sh 
请输入一个数字:22
猜小了
请输入一个数字:44
猜大了
请输入一个数字:33
猜小了
请输入一个数字:37
猜大了
请输入一个数字:35
猜小了
请输入一个数字:36
Bingo! 一共猜了6次
while循环读取文件的三种方式
方式1:在while循环结尾done通过重定向指定读取的文件,以行line读入。
while read line
do
	cmd
done<FILENAME


方式2:使用cat读取文件内容,然后通过管道进入while循环处理
cat FILE_PATH|while read line
do
	cmd
done

方式3:采用exec读取文件后,然后进入while循环处理
exec<FILE
sum=0
while read line
do
	cmd
done

案例:
[root@m01 scripts]# seq 5 >test.log
  oot@m01 scripts]# vim while_02.sh 
#!/bin/bash
while read line
do
    echo $line
    sleep 1
done < ./test.log  

每隔一秒输出一行
[root@m01 scripts]# sh while_02.sh 
1
2
3
4
5

案例2:
分析apache访问日志,(access_2010-12-8.log),把日志中每行的访问字节数对应字段数相加,计算出总的访问量,给出实现程序,使用while循环实现。
[root@m01 scripts]# cat apache_log.sh 
#!/bin/bash
sum=0
awk '{print $10}' /root/access_2010-12-8.log |grep -v "-" > /tmp/apache_test.log
while read line
do
    ((sum+=line))
done</tmp/apache_test.log
echo $sum
[root@m01 scripts]# sh apache_log.sh 
1380681

until介绍

和while正好相反,until是条件为假开始执行,条件为真停止执行。

until 语法

until <条件表达式>
do
	指令...
done

条件为假开始执行,条件为真停止执行。

案例

打印数字10-20
[root@m01 scripts]# cat until.sh 
#!/bin/bash
init_num=10
until [[ $init_num -gt 20 ]]
do
    echo $init_num
    init_num=$((init_num + 1))
done

whiel循环结构及相关语句综合实践小结

while循环的特长 是执行守护进程,以及实现微妙希望循环不退出,持续循环执行的应用,擅长用于频率小于1分钟循环处理,其他的while循环几乎都可用被for循环以及定时任务crond功能替代。

case语句可用使用if语句替换,一般在系统启动脚本传入少量固定规则的字符串,多用case语句,其他普通多用if。总之if语句,for语句最常用,其次while(进程守护),case(服务启动脚本)。

shell脚本中各个语句的使用场景

  • 条件表达式,用于简短的条件判断及输出(文件是否存在,字符串是否为空等)
  • if取值判断,多用于不同数值数量较少的情况
  • for正常的循环应用处理,最常用
  • while多用于守护进程,无限循环(可用加sleep,usleep控制频率)应用
  • case多用于服务启动脚本,打印菜单可以是select语句,几乎不用,可以使用cat的here文档方法替代
  • 函数用途主要是逻辑清晰,减少重复语句开发

for循环常见语法介绍与入门实践

for循环常见语法

for循环语句和while循环语句类似,但for循环语句主要用于执行次数有限的循环,而不是用于守护进程以及无限循环。for循环语句常见语法有两种。for循环在list变量值里,反复迭代,第一次迭代,使用第一个值,第二次用第二个值,以此类推,直到所有元素都循环一遍,也叫遍历循环。

for循环语法
1)普通语法

for 变量名 in 变量取值列表
do
	指令...
done

2)c语言型for循环语法
for ((exp1;exp2;exp3))
do
	指令...
done 

案例

1.使用for循环竖向打印1-5,共五个数字
[root@m01 scripts]# cat for_01.sh 
#!/bin/bash
for ((i=1;i<=5;i++))
do
    echo $i
done

echo ====================

for n in 1 2 3 4 5 
do
    echo $n
done
[root@m01 scripts]# sh for_01.sh 
1
2
3
4
5
====================
1
2
3
4
5

2.计算1加到100之和
[root@m01 scripts]# cat for_02.sh 
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
    ((sum+=i))
done
echo $sum
[root@m01 scripts]# sh for_02.sh 
5050

或者:
[root@m01 scripts]# cat for_02.sh 
#!/bin/bash
for ((i=1;i<=100;i++))
do
    ((sum+=i))
done
echo $sum

echo "========"
for n in {1..100}
do
    ((sum1+=n))
done
echo $sum1
[root@m01 scripts]# sh for_02.sh 
5050
========
5050

 3.在Linux下频率修改文件名,“_finished”去掉
 数据准备
[root@m01 scripts]# mkdir test
[root@m01 scripts]# cd test/
[root@m01 test]# touch stu_102999_{1..5}_finished.jpg
[root@m01 test]# ls
stu_102999_1_finished.jpg  stu_102999_3_finished.jpg  stu_102999_5_finished.jpg
stu_102999_2_finished.jpg  stu_102999_4_finished.jpg

方法1:awk
[root@m01 test]# ls *.jpg |awk -F "_finished" '{print "mv",$0,$1$2}' |bash
[root@m01 test]# ls
stu_102999_1.jpg  stu_102999_3.jpg  stu_102999_5.jpg
stu_102999_2.jpg  stu_102999_4.jpg

方法二:利用变量子串替换
#创建
[root@m01 test]# rm ./* -rf
[root@m01 test]# touch stu_102999_{1..5}_finished.jpg
#利用变量子串替换 
${parameter/pattern/string} 使用string代替第一个匹配的pattern
[root@m01 test]# file=stu_102999_1_finished.jpg 
[root@m01 test]#  echo ${file/_finished/}
stu_102999_1.jpg

思想:要批量做什么,先做一个,然后使用for循环
[root@m01 test]# mv $file `echo ${file/_finished/}`
[root@m01 test]# ls
stu_102999_1.jpg           stu_102999_3_finished.jpg  stu_102999_5_finished.jpg
stu_102999_2_finished.jpg  stu_102999_4_finished.jpg

[root@m01 test]# cat rename_01.sh 
#!/bin/bash
for file in `ls ./*jpg`
do
    mv $file `echo ${file/finished/}`
done
[root@m01 test]# sh rename_01.sh 
mv: ‘./stu_102999_1.jpg’ and ‘./stu_102999_1.jpg’ are the same file
[root@m01 test]# ls
rename_01.sh      stu_102999_2_.jpg  stu_102999_4_.jpg
stu_102999_1.jpg  stu_102999_3_.jpg  stu_102999_5_.jpg

方法三:使用rename命令
#重新创建数据
[root@m01 test]# rename "_finished" "" *.jpg
[root@m01 test]# ls
stu_102999_1.jpg  stu_102999_3.jpg  stu_102999_5.jpg
stu_102999_2.jpg  stu_102999_4.jpg

rename命令

用字符串替换的方式批量改变文件名

rename命令存在两个版本用法上有所区别;区分方法: rename --version
[root@m01 test]# rename --version 
rename from util-linux 2.23.2
如果返回结果中包含 util-linux , 说明是C语言版本, 反之是Perl版本

c版本参数:
-V 线上版本信息并退出
-h 显示帮助文本并退出

C版本语法:
rename [选项]  表达式   替换的字符  文件...


案例:
将.txt重命名为.log
[root@m01 test]# touch {1..3}.txt
[root@m01 test]# rename -v txt log *.txt
`1.txt' -> `1.log'
`2.txt' -> `2.log'
`3.txt' -> `3.log'

条件语句及循环语句的控制知识和实践

特殊命令介绍

命令说明
break n如果省略n表示跳出整个循环,n表示跳出循环的层数
continue如果省略n表示跳出本次循环,忽略本次循环的剩余代码,进入循环的的下一次循环。n表示退到n层继续循环。
exit n退出当前shell程序,n为上一次程序执行的状态返回值。n也可以省略,在下一个shell里可以通过$?接收exit n的n值。
return n用于在函数里,作为函数的返回值,用于判断函数执行是否正确,在下一个shell里可以通过$?接收exit n的n值。
在上述命令中,brenk,continue在条件语句及循环语句(for,while,if等)中用于控制程序的走向,而exit则用于终止所有语句并退出当前脚本,除此之外,exit还可以返回上一次程序或目录的执行状态值给当前shell,return仅用于在函数内部返回函数执行的状态值。

shell数组

shell数组介绍

什么是shell数组

简单来说,shell的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对他们进行区分的元素集合,这个名字就称为数组名。用于区分不同内容的编号就被称为数组下标,组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。有了shell数组后,就可以用相同名字引用一系列变量及变量值,并通过数字(索引)来识别使用他们。在许多场合,使用数组可以缩短和简化程序开发。

数组的定义与增删改查
数组的定义

shell数组的定义有多种方法,列举如下:

方法1:用小括号将变量值扣起来给数组变量,每个变量之间用空格分隔。
array=(value1 value2 value3 ...)
注:使用小括号将数组内容复制给数组变量,数组元素用 "空格"分隔开

此方法为常用定义方法,需重点掌握,示例如下:
[root@m01 ~]# array=(1 2 3)
[root@m01 ~]# echo ${array[*]} #输出上面定义的数组的所有元素,注意语法
1 2 3
[root@m01 ~]# echo ${array[1]}
2
[root@m01 ~]# echo ${array[0]}
1

方法2:用小括号把变量值括起来,同时采用键值对的形式赋值,语法如下:
array=([1]=one [2]=two [3]=tree)
此方法为key-value键值对的形式,小括号对应的数字为数组下标,等号后面的内容为下标对应的数组变量的值,此方法比较复杂,不推荐使用,示例如下:
[root@m01 ~]# array=([1]=one [2]=two [3]=three)
[root@m01 ~]# echo ${array[*]}
one two three
[root@m01 ~]# echo ${array[@]}
one two three
[root@m01 ~]# echo ${array[1]}
one

方法3:通过分别定义数组变量的方法来定义,此种方法比较麻烦,不推荐使用,语法如下:
[root@m01 ~]# array[0]=a
[root@m01 ~]# array[1]=b
[root@m01 ~]# array[2]=c
[root@m01 ~]# array[3]=d
[root@m01 ~]# array[4]=e
[root@m01 ~]# echo ${array[*]}
a b c d e

方法4:动态的定义数组变量,并使用命令的输出结果为数组的内容,语法为:
array=($(命令))  或者 array=(`命令`)

案例:
[root@m01 array]# pwd
/root/array
[root@m01 array]# touch {1..3}.txt
[root@m01 array]# array=(`ls /root/array/`)  #写绝对路径
[root@m01 array]# echo ${array[*]}
1.txt 2.txt 3.txt
[root@m01 array]# echo ${array[0]}
1.txt

还可以使用declare -a array 来定义数组类型,但是很少这样使用。
数组的增删改查

打印数组元素

使用${#数组名[*或@]}可以打印整个数组的长度,这里和前面所学的变量子串知识点是一样的,因为数组也是变量,只不过是特殊的变量,因此也适合变量的子串替换等知识。

常用知识点,需要重点掌握,
[root@m01 ~]# array=(1 2 3)
[root@m01 ~]# echo ${array[0]}
1
[root@m01 ~]# echo ${array[*]}
1 2 3
[root@m01 ~]# echo ${array[2]}
3

打印单个数组元素用${数组名[小标]},当未指定数组下标,数组的下标是从0开始,使用 * 或 @ 可以打印整个数组的内容

打印数组元素的个数
[root@m01 ~]# echo ${#array[@]}
3
[root@m01 ~]# echo ${#array[*]}
3

数组的赋值

可以直接通过"数组名[下标]" 对数组进行引用赋值,如果下标不存在,则自动添加新一个数组元素,如果下标存在,则覆盖原来的值。

下标存在则覆盖
[root@m01 ~]# array=(a b c)
[root@m01 ~]# echo ${array[2]}
c
[root@m01 ~]# array[2]=d
[root@m01 ~]# echo ${array[2]}
d

不存在则添加
[root@m01 ~]# echo ${array[3]}

[root@m01 ~]# array[3]=f
[root@m01 ~]# echo ${array[3]}
f

数组的删除

因为数组在本质上还是变量,因此可以通过 "unset 数组[下标]" 清除相应的数组元素,如果不带小标,表示清除整个数组的所有内容。
[root@m01 ~]# echo ${array[*]}
a b d f
[root@m01 ~]# unset array[3]
[root@m01 ~]# echo ${array[3]}

[root@m01 ~]# unset array[2]
[root@m01 ~]# echo ${array[*]}
a b
[root@m01 ~]# unset array  #不指定下标则清除数组所有内容
[root@m01 ~]# echo ${array[*]}

[root@m01 ~]# echo ${#array[*]}
0

数组的内容截取和替换(索引切片)

数组替换和变量子串替换是一样的,因为数组是特殊的变量,数组元素部分内容截取的示例如下:
[root@m01 ~]# array=(1 2 3 4 5)
[root@m01 ~]# echo ${array[*]}
1 2 3 4 5
#从下标为1的元素开始截取,共取三个数组元素 
[root@m01 ~]# echo ${array[*]:1:3}
2 3 4
[root@m01 ~]# echo ${array[@]:1:3}
2 3 4

#将变量的结果赋值给数组变量
[root@m01 ~]# array=({a..z})
[root@m01 ~]# echo ${array[*]}
a b c d e f g h i j k l m n o p q r s t u v w x y z

从小标为2 的元素开始截取,共截取四个数组元素
[root@m01 ~]# echo ${array[*]:2:4}
c d e f

从下标为22的元素开始截取,一直取到最后
[root@m01 ~]# echo ${array[*]:22}
w x y z

对数组里面变量子串取值

[root@m01 ~]# array=(1 2 3 daveorff)
[root@m01 ~]# echo ${array[*]}
1 2 3 daveorff
[root@m01 ~]# echo ${array[3]}
daveorff
[root@m01 ~]# echo ${array[3]:1}
aveorff
[root@m01 ~]# echo ${array[3]:1:3}
ave

变量也可以这样操作

[root@m01 ~]# a=12345
[root@m01 ~]# echo $a
12345
#从下标数1开始取,共取2个
[root@m01 ~]# echo ${a:1:2}
23
#从下标数1开始取,共取3个
[root@m01 ~]# echo ${a:1}
2345

数组元素部分内容替换

调用方法是:${数组名[*或@]/查找字符/替换字符}

把数组种的1替换称b,原数组未被修改,和sed很像
[root@m01 ~]# array=(1 2 3 1 1)
[root@m01 ~]# echo ${array[*]/1/b}
b 2 3 b b
[root@m01 ~]# echo ${array[@]/1/b}
b 2 3 b b
[root@m01 ~]# echo ${array[*]}
1 2 3 1 1
该操作不会改变原来数组内容,如需修改,需要重新定义数组

对数组中变量子串的替换

匹配第一个替换
[root@m01 ~]#  array=(1 2 3 daveorff)
[root@m01 ~]# echo ${array[*]}
1 2 3 daveorff
[root@m01 ~]# echo ${array[*]/ff/xx}
1 2 3 daveorxx
[root@m01 ~]# echo ${array[*]}
1 2 3 daveorff

[root@m01 ~]# echo ${array[2]/3/5}
5


匹配全部替换
[root@m01 ~]#  array=(1 2 3 daveorff 1 222 3)
[root@m01 ~]# echo ${array[*]}
1 2 3 daveorff 1 222 3
[root@m01 ~]# echo ${array[*]/2/h}
1 h 3 daveorff 1 h22 3
[root@m01 ~]# echo ${array[*]//2/h}
1 h 3 daveorff 1 hhh 3

替换方法:${数组名[*或@]/查找字符/替换字符} 该操作不会改变原先数组的内容,修改需要重新定义

全部替换则是:${数组名[*或@//查找字符/替换字符}
[root@m01 ~]#  array=(a aaa abc b d e)
[root@m01 ~]# echo ${array[*]}
a aaa abc b d e
匹配到的全部替换
[root@m01 ~]# echo ${array[*]//a/h}
h hhh hbc b d e
匹配到的值替换第一个
[root@m01 ~]# echo ${array[*]/a/h}
h haa hbc b d e
实际数组内容并未改变
[root@m01 ~]# echo ${array[*]}
a aaa abc b d e

数组脚本开发与实践

[root@m01 scripts]# cat anli_01.sh 
#!/bin/bash
array=(1 2 3 4 5)
for ((i=0;i<`echo ${#array[*]}`;i++))
do
    echo ${array[i]}
done

echo "=========================="
for n in ${array[*]}
do
    echo $n
done
[root@m01 scripts]# sh anli_01.sh 
1
2
3
4
5
==========================
1
2
3
4
5

案例2:通过竖向列举法定义数组元素并批量打印
[root@m01 scripts]# cat anli_02.sh 
#!/bin/bash
array=(
www.baidu.com
www.qq.com
www.taobao.com
)
for n in ${array[@]}
do
    echo $n
done
[root@m01 scripts]# sh anli_02.sh 
www.baidu.com
www.qq.com
www.taobao.com


案例3:把命令结果作为数组定义并打印
[root@m01 scripts]# cat anli_03.sh 
#!/bin/bash
array=(`ls /tmp`)
for n in ${array[*]}
do
    echo $n
done

echo "===C式写法==="

for ((i=0;i<${#array[*]};i++))
do
    echo ${array[$i]}
done

shell 数组高级实战案例

案例4:利用bash for循环打印下面这句话中字母数不大于6的单词。
Everything is possible if we want it enough

解析:
使用${#数组[*]}取数组元素的长度,取哪个中括号写对应的下标即可。
[root@m01 scripts]# array=(Everything is possible if we want it enough)
[root@m01 scripts]# echo ${#array[*]}
8
[root@m01 scripts]# echo ${#array[1]}
2

然后使用for循环取出每个元素的长度
再作比较,符合的则打印
[root@m01 scripts]# cat anli_04.sh 
#!/bin/bash
array=(Everything is possible if we want it enough)
for word in ${array[*]}
do
    if [[ ${#word} -le 6 ]]
    then
        echo $word
    fi
done

echo "============"

for ((i=0;i<${#array[*]};i++))
do
    if [[ `echo ${#array[i]}` -le 6 ]]
    then
        echo ${array[i]}
    fi
done
[root@m01 scripts]# sh anli_04.sh 
is
if
we
want
it
enough
============
is
if
we
want
it
enough

还可以通过awk循环实现
[root@m01 scripts]# chars="Everything is possible if we want it enough"
[root@m01 scripts]# echo $chars |awk '{for(i=1;i<=NF;i++) if(length($i)<=6)print $i}'
is
if
we
want
it
enough

生产随机数的方法

1)echo $RANDOM  范围是0-32767
2)openssl rand -base64 100  #100是指定密码长度
3)date +%S%N  或 date  +%s%N
4)head /dev/urandom| cksum
5)uuidgen
6)cat /proc/syslernel/random/uuid
生成随机字符串;我们甚至可以使用 /dev/urandom 设备配合 dd 命令 来获取随机字符串。
7)dd if=/dev/urandom bs=1 count=15|base 64 -w 0
8)mkpasswd (yum install expect -y)
案例:
mkpasswd -l 20 -d 10 -C 5 -c 3 -s 2
[root@m01 scripts]# mkpasswd -l 20 -d 10 -C 5 -c 3 -s 2
&I1s29M6915715xVk*ZL
参数解释:
-l 长度
-d 数字
-c 小写字母
-C 大写自动
-s 特殊字符
注:各字符相加必须等于指定密码的长度数

还可以使用md5sum命令
[root@m01 scripts]# date | md5sum 
210d915f0411767757ce832b5c24bd5b  -

md5sum命令

计算和校验文件报文摘要的工具程序

md5sum 采用MD5报文摘要算法(128位)计算和检查文件的校验和。
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。

语法:md5sum  (选项)  (参数)
选项:
-b	二进制模式读取文件
-t	把输入的文件作为文本文件看待
-c	从指定文件中读取MD5校验和,并进行校验
--status  校验成功时不输出任何信息
-w	当校验不正确时给出警告信息

参数:
文件:指定保存着文件名和校验和的文本文件

案例:
使用md5sum生成密码
[root@m01 scripts]# date | md5sum |awk '{print $1}'
e9dd93ab2eb66e052e725f92a3885961

生成有关文件的md5值
[root@m01 scripts]# md5sum 02.sh 
445da26df664d9facf9ebaa8781dba2b  02.sh

检查文件是否被修改过
先生成md5文件
[root@m01 scripts]# touch testfile
[root@m01 scripts]# md5sum testfile > testfile.md5
检查
[root@m01 scripts]# md5sum testfile -c testfile.md5
md5sum: testfile: no properly formatted MD5 checksum lines found
testfile: OK
[root@m01 scripts]# echo "123" >> testfile
[root@m01 scripts]# md5sum testfile -c testfile.md5
md5sum: testfile: no properly formatted MD5 checksum lines found
testfile: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

md5sum命令

计算和校验文件报文摘要的工具程序

md5sum 采用MD5报文摘要算法(128位)计算和检查文件的校验和。
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。

语法:md5sum  (选项)  (参数)
选项:
-b	二进制模式读取文件
-t	把输入的文件作为文本文件看待
-c	从指定文件中读取MD5校验和,并进行校验
--status  校验成功时不输出任何信息
-w	当校验不正确时给出警告信息

参数:
文件:指定保存着文件名和校验和的文本文件

案例:
使用md5sum生成密码
[root@m01 scripts]# date | md5sum |awk '{print $1}'
e9dd93ab2eb66e052e725f92a3885961

生成有关文件的md5值
[root@m01 scripts]# md5sum 02.sh 
445da26df664d9facf9ebaa8781dba2b  02.sh

检查文件是否被修改过
先生成md5文件
[root@m01 scripts]# touch testfile
[root@m01 scripts]# md5sum testfile > testfile.md5
检查
[root@m01 scripts]# md5sum testfile -c testfile.md5
md5sum: testfile: no properly formatted MD5 checksum lines found
testfile: OK
[root@m01 scripts]# echo "123" >> testfile
[root@m01 scripts]# md5sum testfile -c testfile.md5
md5sum: testfile: no properly formatted MD5 checksum lines found
testfile: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值