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