shell编程快速入门(二)

2023-11-19

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell编程快速入门(二) 的相关文章

  • 软件测试工程师自我介绍范文_软件测试面试指导之自我介绍

    面试自我介绍虽然人人都准备 但是做到让人印象深刻可不容易啊 本篇就具体来聊聊人人都要经历的面试 怎么做自我介绍 才能让面试官眼前一亮 面试是什么 它是个机会 让面试官更进一步确认你是他们需要的人 你进一步展现你的交际沟通能力 在面试中 自我
  • 7G空间安装Linux,双系统使用Linux引导

    今天在装linux的window双系统时 出现在无法使用linux引导的问题 开机总是自动进windows 照理来说我先装的window 后装的linux 应该是开机进grub引导才对 在主板的boot里根本没有linux项 后来用Easy
  • DAMA-DMBOK2重点知识整理CDGA/CDGP——第2章 数据处理伦理

    目录 一 分值分布 二 重点知识梳理 1 语境关系图 2 引言 3 业务驱动因素 4 基本概念 一 分值分布 CDGA 2分 2单选 CDGP 0分 不考 二 重点知识梳理 1 引言 预警关系图 数据处理伦理定义 如何以符合道德准则及社会责
  • module load/unload 命令 (Envrionment modules工具)

    Envrionment modules工具用来快速的设置和修改用户编译运行环境 Envrionment modules通过加载和卸载modulefile文件可直接改变用户的环境变量 用户不需要修改 bashrc 从而避免误操作 使用modu
  • Unity里清除Console控制台Log的函数

    Log输出部分转发来自 http blog sina com cn s blog 13c4bf4b40102wz0r html 在控制台输出中 是开发者常用到的一种函数 通过Debug类来实现 打印字符串 Debug Log log 如果有
  • PyTorch深度学习框架(一)

    文章目录 pytorch安装步骤 pytorch基本使用方法 view操作 改变矩阵维度 格式转化 numpy lt gt torch 自动求导机制 例子实现 线性回归模型 常见的tensor格式 pytorch安装步骤 pip3 inst
  • 基础算法题——画树(卡特兰数)

    卡特兰数简介 卡特兰数又称卡塔兰数 英文名Catalan number 是组合数学中一个常出现在各种计数问题中出现的数列 卡特兰数前几项为 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012
  • Excel制作导入模板,多级联动下拉框(一整列的设置),修改一级下拉框内容,自动清空二级内容

    目录 效果展示 一 数据准备 二 模板制作 原因1 为空 原因二 名称管理器数据有误 三 修改一级下拉框内容 自动清空二级内容 1 效果演示 2 实际操作 效果展示 一 数据准备 1 新建一张表 在sheet2中放入数据 如图所示 2 点击
  • 提取任务相关成分的TRCA算法

    提取任务相关成分的TRCA算法 1 TRCA算法简介 2 TRCA算法原理与推导 3 Ensemble TRCA算法原理简介 1 TRCA算法简介 虽然基于CCA的方法在识别SSVEP信号方面具有不错的表现 但这类方法的性能仍旧易受到自发脑
  • 阿里云oss上传和下载

    这段为上传的代码 账号之类前往注册 可以根据个人情况进行修改 上传文件 param endPoint 路径 param bucketName 桶名称 param fileName 文件绝对路径和名称 param ossPath 上传存储路径
  • 线程池的使用实例

    线程池的使用实例 number 创建线程个数 创建线程池 ExecutorService cachedThreadPool Executors newCachedThreadPool 每次线程执行完毕 计数 1 当计数减到 0 之后 才能解

随机推荐

  • 红帽7.9部署telnet服务

    升级ssh 为预防万一提前配置telnet服务 安装软件包 yum install telnet server yum install xinetd xinetd加入开机自启 systemctl enable xinetd service
  • DB2分组查询之row_number() over(partition by order by )说明

    作用 数据库根据某几个字段去除重复记录 并进行排序 语法 ROW NUMBER OVER PARTITION BY COL1 ORDER BY COL2 功能 表示根据COL1分组 在分组内部根据 COL2排序 而这个值就表示每组内部排序后
  • 图像的打开、修改、显示和保存示例(>OpenCV 2.0)

    代码如下 include
  • Vue项目中使用Sass变量自定义ag-grid表格主题样式

    1 在Vue项目中新建一个样式文件 src assets styles table scss 引入ag grid默认的样式文件 table scss ag icons path node modules ag grid community
  • 蓝桥杯每日一题2023.9.16

    蓝桥杯2022年第十三届省赛真题 X进制减法 C语言网 dotcpp com 题目描述 进制规定了数字在数位上逢几进一 X 进制是一种很神奇的进制 因为其每一数位的进制并不固定 例如说某种 X 进制数 最低数位为二进制 第二数位为十进制 第
  • 【机器学习】【逻辑回归】最大似然估计的推导和求解步骤和梯度上升算法求解

    伯努利分布 如果随机变量X 0 1 并且相应的概率满足 P X 1 p 0
  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • Kafka 架构及原理分析

    Kafka 架构及原理分析 文章目录 Kafka 架构及原理分析 简介 使用场景 架构 Broker Topic 副本机制 存储 消费分组 消费编号 数据多写支持 基于 binlog 实现主从复制 Kafka 的进阶功能 消息幂等性 事务
  • (五)数据清理之stata的使用----------变量进行具体处理的命令

    br 浏览文件所存储的内容 set obs n 具体样本数量 该命令会自动帮你生成n个样本 list 显示样本的内容 使用方法为 list in 5 显示第5个样本的内容 list in 1 10 表示至的关系 显示1到至10的样本内容 l
  • ldap 初始化配置

    dn cn config objectClass olcGlobal cn config olcArgsFile var run openldap slapd args olcPidFile var run openldap slapd p
  • 数学建模之BP神经网络

    1 BP网络基本数学原理 BP网络是一种多层前馈神经网络 它的名字源于在网络训练中 调整网络权值的训练算法是反向传播算法 即BP学习算法 BP网络是一种具有三层或者三层以上神经元的神经网络 包括输入层 隐含层和输出层 上下层之间实现全连接
  • Vuetify笔记(6):v-form表单及校验

    在表单验证方面 Vuetify拥有集成了众多的功能 想要使用第三方验证插件 您可以开箱即用Vee validate和Vuelidate 1 v form表单 1 1 v form的属性和方法 v form表单的常用属性 1 lazy val
  • 什么是视图?普通视图和物化视图什么区别?看这一篇就明白了

    目 录 普通视图 如何创建普通视图 物化视图 增量刷新是如何判断哪些记录被改动的 物化视图创建案例 普通视图 视图可以理解为一张表或多张表的预计算 这些表称为基表 它可以将所需要查询的结果封装成一张虚拟表 基于它创建时指定的查询语句返回的结
  • U-Boot顶层Makefile详解

    文章目录 一 U Boot工程目录分析 1 打包编译好的uboot 2 目录介绍 1 arch 2 board 3 configs 4 Makefile 5 config 6 README 二 VSCode工程创建 1 新建工程 2 屏蔽不
  • 【docker】文档 [不断补充中...]

    全栈技术分享 文档API化 简单易懂 快速入门 动手党福音 跨界佬福利 直接搞技术 不背八股文 觉得对你有帮助的话点个赞吧 感兴趣的加关注 收藏书签方便随时查阅 同文档会不定期更新补充 有问题欢迎留言讨论 虚拟化 一种资源管理技术 硬件资源
  • 忍3服务器维护奖励,7月3日服务器维护公告

    亲爱的忍村学员 感谢大家对 忍者村大战2 的支持 为给大家带来更好的游戏体验 我们已于7月3日7 00 10 00进行全区停机版本更新 注 请勿擅自修改或替换客户端图片文件 会导致您的游戏崩溃或更新版本失败 如出现以上情况请卸载本地的客户端
  • mysql服务器搭建方法_windows下搭建MySQL服务器步骤详解

    Mysql是一个数据库系统 它包括数据库服务器 并且有一个数据库管理系统对数据库服务器进行管理 同时还包括有一个数据库客户端 用于与用户交互 从官方网站下载Mysql数据库系统的安装包程序 http www mysql com downlo
  • 怎样将好多个字符串组装成一个数组

    最近在写一个项目 在这个写的途中 发现了一个问题 就是不会将字符串组装成数组 然后去问了学长才知道 于是赶紧过来做个笔记 首先 我们需要先创建一个存储字符串的数组 创建数组 String hids new String hrs size 然
  • 不懂优雅停机,搞挂了线上服务,咋办?

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 7 分钟 来自 陈树义 树哥聊编程 公司项目是用 consul 进行注册的 在发布微服务的时候 总是会导致调用方出现一定几率的调用失败 一开始百思不得其解 后来咨询了
  • shell编程快速入门(二)

    echo命令 输出指定的字符串或者变量 参数 n 不要在最后自动换行 e 激活转义字符 若字符串中出现以下字符 则特别加以处理 而不会将它当成一般文件输出 a 发出警告声 b 删除前一个字符 c 不产生进一步输出 c 后面的字符不会输出 f