shell脚本

1.shell脚本初识

1.1多行注释方法

方法一:
让某一列输入相同的内容
1.ctrl+shift+v
 2.然后按上下箭头,移动光标
3.shift+i
 4.输入内容
5.按下esc
就能让某一列输入相同的内容,可用于多行注释
方法二:
:<
方法三:
cat >/dev/null<
脚本案例

[root@node2 scripts]# cat comment.sh
 #!/bin/bash
 #description:comment of many lines
 #author:vita
 #version:1.0
 :</dev/null<

1.2 Shell脚本的执行

1.bash script-name或sh script-name
这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,
或者脚本文件开头没有指定解释器时需要使用的方法,
这是推荐的脚本执行方法。

2.path/script-name或./script-name
指在当前路径下执行脚本(脚本要有执行权限),需要先将脚本文件的权限改为可执行(即文件权限属性加x位)
具体方法为chmod +x script-name。然后通过脚本绝对路径或相对路径就可以直接执行脚本了。

3.source script-name或. script-name

4.sh


1.3Shell脚本的编程规范和习惯

1.开头加脚本解释器
2.附带作者及版权信息
3.脚本扩展名为*.sh
 4.脚本存放在固定的目录下
5.脚本中不用中文
6.成对的符号一次书写完成
7.循环格式一次性输入

2.shell变量

2.1Shell变量知识

2.1.1什么是变量?

在小学或初中时,我们开始接触数学方程式,例如:已知x=1,y=x+1,那么y等于多少?
 在上述问题中,等号左边的x和y当时被称做未知数,但在Shell编程里就叫做变量名,等号右边的1和x+1则是变量的内容(变量的值)。
 注意,这里的等号符号被称为赋值,而不是等号。

2.1.2.Shell变量特性

默认情况下,在bash Shell中是不会区分变量是什么类型的,例如:常见的变量类型为整数、字符串、小数等。

2.1.3.Shell变量分类

变量可分为两类:
 环境变量(全局变量)和普通变量(局部变量)。
 环境变量也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程Shell中使用,
 环境变量又可分为自定义环境变量和bash内置的环境变量。
 普通变量也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。
 普通变量一般由开发者在开发脚本程序时创建

2.2 Shell环境变量介绍

环境变量一般是用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。
Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。

2.2.1 操作Shell环境变量

1.显示环境变量
echo $PATH
 env
 set
 set -o

2.设置环境变量
 放在/etc/profile中永久并全局生效,否则只在当前shell生效
 方法一:
export JAVA_HOME=/opt/jdk
方法二:
JAVA_HOME=/opt/jdk
 export JAVA_HOME
方法三:
declare -x JAVA_HOME=/opt/jdk

3.取消环境变量
unset JAVA_HOME

2.2.2 环境变量初始化与对应文件生效

全局文件
/etc/profile
 /etc/bashrc
用户环境变量
~/.bashrc
 ~/.bash_profile
如果以上四个文件中都定义了变量,那么环境变量生效的优先级是怎样的
1./etc/bashrc
 2.~/.bashrc
 3.~/.bash_profile
 4./etc/profile

因为加载顺序为下图,后加载的先生效![](https://s1.51cto.com/images/blog/201909/04/580283343e9bf5dc54502f671e232ad4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

但在实际的操作中,如果把变量放在最后面,优先级并不是这样,因为
[root@m01 ~]# cat ~/.bash_profile 

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
A=2
[root@m01 ~]# cat ~/.bashrc 
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
A=3
此时输出$A为2,并不是3,因为.bash_profile加载完了.bashrc,继续执行了A=2,所以最终A为2了,要把变量放在if的前面才能看到效果
要知道上面的情况,遇到问题时才有排查思路。。
虽然生效顺序如上,但是实际工作中不要把同样的变量写道很多个文件中,给自己找麻烦。。给他人找麻烦。。。

2.3 普通变量介绍

普通变量也称本地变量,本地变量在用户当前Shell生存期的脚本中使用。
 例如,本地变量oldboy的取值为bingbing,这个值只在用户当前Shell生存期中有意义。
如果在Shell中启动另一个进程或退出,变量oldboy的值将无效。

2.3.1操作Shell普通变量

1.字符串变量
 变量名=value #<==不加引号。也会解析相应的特殊符号,但是不解析空格,如果含有空格,则不会吧相应的内容作为一个整体
 变量名=’value’ #<==加单引号。所见即所得
 变量名=”value” #<==加双引号。解析特殊符号,如果含有空格,会把相应的内容作为一个整体输出

2.命令变量
 变量名=`ls`
变量名=$(ls)

3.变量名
 规则:字母、数字下划线三者组合,以字母开头
 要求:见名知意
OldboyAge=1
 oldboy_age=1
 oldboyAge=1###驼峰语法

4.变量定义总结
•针对变量名:
1)变量名的定义要有一定的命令规范,并且要见名知意,OldboyAge=1,推荐使用驼峰语法。
2)变量名仅能使用字母、数字、下划线中的任意多个字符,并且要字母开头。

•针对变量内容:
3)在脚本中定义普通字符串变量,尽量把变量的内容用双引号括起来。
4)单纯数字的变量内容可以不加引号。
5)希望变量的内容原样输出需加单引号。
6)希望变量值引用命令并获取命令的结果就用反引号或$()。

•针对赋值符号:
7)变量定义使用赋值符号(=),赋值符号两端不要有空格。

•针对变量输出:
8)使用或者输出变量的内容,可用$变量名,例如:echo $OldboyAge。 
9)若变量名(db)后面有其他字符连接的时候,就必须给变量名加上大括号{},例如:db_t就要改成${db}_t

2.4特殊位置参数变量

$0 获取当前执行shell脚本的文件名,如果执行脚本带路径,那么就包括脚本路径
$n获取当前执行的shell脚本的第n个参数,n=1..9,当n=0时表示脚本的文件名,如果n>9,需要用{}括起来,例如${10},参数用空格隔开
$#获取当前执行的shell脚本后面接的参数个数
$* 不加""时,与$@一样,后面的参数每个都是独立的,不管参数是否用双引号括起来
    加""时,为"$*"所有的参数都当做一个整体输出
$@ 不加""时,与$*一样,后面的参数每个都是独立的,不管参数是否用双引号括起来
   加""时,为"$@"每个参数是独立的,但如果其中有参数是用双括号括在一起的,则视为一个参数
[root@m01 script]# vim arg.sh
#!/bin/bash
#description:test arg
#author:vita
#version:v1.0
echo '#####$0#####'
echo $0
echo '#####$n#####'
echo $2
echo '#####$*#####'
for arg in $*
do
    echo $arg
done
echo '#####$@#####'
for arg in $@
do
    echo $arg
done
echo '#####"$*"#####'
for arg in "$*"
do
    echo $arg
done
echo '#####"$@"#####'
for arg in "$@"
do
"arg.sh" 28L, 349C written                                                                 
[root@m01 script]# sh arg.sh i am "old boy"
#####$0#####
arg.sh
#####$n#####
am
#####$*#####
i
am
old
boy
#####$@#####
i
am
old
boy
#####"$*"#####
i am old boy
#####"$@"#####
i
a
old boy
[root@m01 script]# 

2.5shell进程特殊状态变量

$?获取执行上一个指令的状态返回值,0为成功,非0是失败
$$获取当前执行的shell脚本的进程号--了解
$!获取上一个后台运行的脚本的进程号--了解
$_获取在此之前执行的命令或脚本的最后一个参数--了解

2.6变量字串

1.${oldboy}返回变量${oldboy}的内容
[root@m01 script]# oldboy="oldoldyoungold"
[root@m01 script]# echo $oldboy
oldoldyoungold
[root@m01 script]# echo ${oldboy}
oldoldyoungold

2.${#oldboy}返回变量${oldboy}的长度
[root@m01 script]# echo ${#oldboy}
14

3.${oldboy:offset}返回变量${oldboy}从offset后开始到结尾的所有字符
[root@m01 script]# echo ${oldboy:2}
doldyoungold

4.${oldboy:offset:length}返回变量${oldboy}从offset后开始,共取length个字符串
[root@m01 script]# echo ${oldboy:2:2}
do

5.${oldboy#word}从变量${oldboy}开头开始删除最短匹配的word字串
[root@m01 script]# echo ${oldboy#o*o}
ldyoungold

6.${oldboy##word}从变量${oldboy}开头开始,删除最长匹配的word字串
[root@m01 script]# echo ${oldboy##o*o}
ld

7.${oldboy%word}从变量${oldboy}结尾开始删除最短匹配的word字串
[root@m01 script]# echo ${oldboy%o*o}
oldoldyoungold
[root@m01 script]# echo ${oldboy%d*d}
oldol
[root@m01 script]# echo ${oldboy%%d*d}
ol

8.${oldboy%%word}从变量${oldboy}结尾开始删除最长匹配的word字串
[root@m01 script]# echo ${oldboy%%d*d}
ol

9.${oldboy/pattern/string}使用string代替第一个匹配的pattern
[root@m01 script]# echo ${oldboy/o/O}
Oldoldyoungold

10.${oldboy//pattern/string}使用string代替所有匹配的pattern
[root@m01 script]# echo ${oldboy//o/O}
OldOldyOungOld

11.${oldboy:-word}如果oldboy变量值为空或未赋值,就会返回word字符串替代变量的值,如果变量未定义,则返回备用的值。防止变量为空或未定义导致异常
[root@m01 script]# result=${test:-UNSET}
[root@m01 script]# echo $result
UNSET
[root@m01 script]# echo $test
[root@m01 script]# 
企业用途:
防止path变量没定义
[root@m01 script]# find ${path:-/tmp} -name "*.log"---path变量无值
/tmp/dracut.log
/tmp/anaconda.log
/tmp/luffycity.log
[root@m01 script]# find ${path-/tmp} -name "*.log"
/tmp/dracut.log
/tmp/anaconda.log
/tmp/luffycity.log
[root@m01 script]# 
[root@m01 script]# touch /opt/aa.log
[root@m01 script]# path=/opt   ---path变量有值
[root@m01 script]# find ${path-/tmp} -name "*.log"
/opt/aa.log
[root@m01 script]# 
/etc/init.d/httpd
HTTPD_LANG=${HTTPD_LANG-"C"} HTTPD_LANG变量不存在,就用赋值HTTPD_LANG=C
httpd=${HTTPD-/usr/sbin/httpd} HTTPD变量不存在,就赋值httpd=/usr/sbin/httpd

12.${oldboy:=word}如果oldboy变量值为空或未赋值,就设置这个变量值为word,并返回值。位置变量和特殊变量不适用 用途:基本同上一个${oldboy:-word},但是又额外给oldboy变量赋值了
[root@m01 script]# result1=${test1:=UNSET}
[root@m01 script]# echo $result1
UNSET
[root@m01 script]# echo $test1
UNSET
[root@m01 script]# 

13.${oldboy:?word}如果oldboy变量为空或未赋值,word字符串将作为标准错误输出,否则输出变量的值 用途:用于捕捉由于变量未定义而导致的错误,并退出程序
[root@m01 script]# echo ${oldboyNono:+replace}

[root@m01 script]# echo ${oldboyNono:?replace}
-bash: oldboyNono: replace
[root@m01 script]# 

14.${oldboy:+word}如果oldboy变量未空或未赋值,则什么都不做,否则word字符串替代变量的值
[root@m01 script]# resutl3=${test3:+word}
[root@m01 script]# echo $test3

[root@m01 script]# echo $result3

[root@m01 script]# test3=3
[root@m01 script]# resutl3=${test3:+word}
[root@m01 script]# echo $test3
3
[root@m01 script]# echo $resutl3
word
[root@m01 script]# 

15.输出字符串长度的几种方法
[root@web01 scripts]# oldboy="I am oldboy"
[root@web01 scripts]# echo ${oldboy}
I am oldboy
[root@web01 scripts]# echo ${#oldboy}
11
[root@web01 scripts]# echo $oldboy|wc -L
11
[root@web01 scripts]# expr length "$oldboy"
11
[root@web01 scripts]# echo $oldboy|awk '{print length}'
11
[root@web01 scripts]# echo $oldboy|awk '{print length ($1)}'
11
[root@web01 scripts]# echo $oldboy|awk '{print length ($0)}'
11

3.数值计算

3.1算数运算符

3.2运算命令

[root@m01 script]# declare -i a=3+4
[root@m01 script]# echo $a
 7

[root@m01 script]# a=$[3+4]
[root@m01 script]# echo $a
 7

3.2.1双小括号"(())"数值运算的基础语法--首推荐

((i=i+1))此中书写方法为运算后赋值法,即i+1的运算结果赋值给变量i。注意,不能用"echo ((i=i+1))"形式输出表达式的值,但是可以用echo $((i=i+1))输出值
i=$((i+1))可以在(())前面加$符号,将表达式运算后赋值给i
((8>7&&5==5))可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断
echo $((2+1))需要直接输出表达式的运算结果时,可以在(())前面加$符
[root@m01 script]# echo $((2+3))
5
[root@m01 script]# i=$((2+3))
[root@m01 script]# echo $i
5
[root@m01 script]# echo $((8>7&&5==5))
1
[root@m01 script]# a=3
[root@m01 script]# echo $(($a+3))
6
[root@m01 script]#

3.2.2let运算命令--次推荐

[root@m01 script]# a=3
[root@m01 script]# a=a+2
[root@m01 script]# echo $a
a+2
[root@m01 script]# a=3
[root@m01 script]# let a=$a+3
[root@m01 script]# echo $a
6

3.2.3expr

1.1.用于计算
运算符及用于计算的数字左右都至少有一个空格,否则报错
使用*号时,必须用反斜线屏蔽其特殊含义。因为shell可能会误解*的含义
[root@m01 script]# expr 2 + 2
4
[root@m01 script]# expr 2 \* 2--->*号要用\*转义
4
[root@m01 script]# expr 2 / 2
1

1.2.判断一个变量值是否是整数
利用expr做计算时必须是整数的规则,吧一个变量或字符串和一个已知的整数(非0)相加,看命令返回值是否为0,如果为0,就认为做加法的变量是整数,否则就不是整数
[root@m01 script]# i=5  赋值一个数5给i
[root@m01 script]# expr $i + 6 &>/dev/null  把i和整数相加,&>/dev/null表示不保留任何输出
[root@m01 script]# echo $?  输出返回值
0  返回值为0,说明是整数
[root@m01 script]# i=value
[root@m01 script]# expr $i + 6 &>/dev/null
[root@m01 script]# echo $?
2  返回值不为0,说明不是整数
[root@m01 script]# 

1.3.判断文件扩展名是否符合要求
[root@m01 script]# vim extendName.sh
#!/bin/bash
#description:identify the extend name of one file
#author:vita
#version:v1.0
if expr "$1" : .*\.pub &>/dev/null
  then
    echo "you are using $1"
else
  echo "pls use *.pub file"
fi
[root@m01 script]# sh extendName.sh ew.pub
you are using ew.pub
[root@m01 script]# sh extendName.sh ew.txt
pls use *.pub file
[root@m01 script]# 

1.4.计算字符串的长度
[root@m01 script]# a="i am a good colleage"
[root@m01 script]# expr length $a
expr: syntax error
[root@m01 script]# expr length "$a"
20

3.2.4适合小数的运算命令bc

[root@m01 script]# echo 3+5|bc
8
[root@m01 script]# echo 3.1+3.2|bc
6.3
[root@m01 script]# echo "scale=2;3.11+3.22"|bc
6.33
[root@m01 script]# echo "scale=2;3.113+3.22"|bc
6.333
[root@m01 script]# echo "scale=2;3.113+3.221"|bc
6.334
[root@m01 script]# echo "scale=4;3.113+3.221"|bc
6.334
[root@m01 script]# echo "scale=1;3.113+3.221"|bc
6.334
[root@m01 script]# echo "scale=1;3.113/3.221"|bc
.9
[root@m01 script]# echo "scale=1;7/3"|bc
2.3
[root@m01 script]# echo "scale=4;7/3"|bc
2.3333
[root@m01 script]#

3.2.5适合小数的运算命令awk----小数运算推荐awk

[root@m01 script]# echo "2.33 3.4"|awk '{print $1+$2}'
5.73
[root@m01 script]# echo "2.33 3.4"|awk '{print $1/$2}'
0.685294
[root@m01 script]# echo "2.33 3.4"|awk '{print $1/$2*10}'
6.85294
[root@m01 script]#

4.read

shell变量除了可以直接赋值或脚本传参外,还可以用read命令从标准输入中获得,read为bash内置命令,
-p设置提示信息
-t设置输入等待的时间,单位默认为秒
 操作案例:
 测试命令
[root@m01 script]# b="w e"
[root@m01 script]# echo "$b"|sed -r 's# ##g'|wc -L
2
[root@m01 script]# echo "$b"|wc -L
3
[root@m01 script]# b=""
[root@m01 script]# echo "$b"|wc -L
0
[root@m01 script]# echo "$b"|sed -r 's# ##g'|wc -L
0
[root@m01 script]# 
脚本内容
[root@m01 script]# cat cmpVar.sh 
#!/bin/bash
#description:compare to variable
#author:vita
#version:v1.0
read -p "please input two number:"  a b
#判断是否输入了第一个参数
if [ -z $a ];then
    echo "you must input first number"
    exit 6
fi
#当用户输入三个参数的时候,第一个空格后的内容都当做第二个参数,由于第二个参数中是含有空格的,可以去除空格比较长度
if [ $(echo "$b"|sed -r 's# ##g'|wc -L) -eq $(echo "$b"|wc -L) ];then
####不输入第二个参数的时候,长度也是相同的,所以要对此情况做判断
    if [ -z $b ];then
        echo "you must input second number"
        exit 8
    fi
#长度不相同,说明输入了多个参数
elif [ $(echo "$b"|sed -r 's# ##g'|wc -L) -ne $(echo "$b"|wc -L) ];then
    echo "you can just input two number"
    exit 9
fi
##判断输入是否是整数
expr $a + $b + 2 &>/dev/null
if [ $? -ne 0 ];then
    echo "the two number must be int"
    exit 1
fi
#用户输入终于合法了,可以判断大小了
if [ $a -gt $b ];then
    echo "$a>$b"
    exit 3
elif [ $a -eq $b ];then
    echo "$a==$b"
    exit 4
elif [ $a -lt $b ];then
    echo "$a<$b"
    exit 5
fi
[root@m01 script]# 
测试脚本
[root@m01 script]# sh cmpVar.sh 
please input two number:
you must input first number
[root@m01 script]# sh cmpVar.sh 
please input two number:2
you must input second number
[root@m01 script]# sh cmpVar.sh 
please input two number:2 3 4
you can just input two number
[root@m01 script]# sh cmpVar.sh 
please input two number:2 a
the two number must be int
[root@m01 script]# sh cmpVar.sh 
please input two number:w 3
the two number must be int
[root@m01 script]# sh cmpVar.sh 
please input two number:2 3
2<3
[root@m01 script]# sh cmpVar.sh 
please input two number:23 3
23>3
[root@m01 script]# sh cmpVar.sh 
please input two number:23 23
23==23

5.条件测试与比较

5.1测试表达式语法

条件表达式6种写法:if,while
语法1: test <测试表达式>
语法2: [ <测试表达式> ]    #两端有空格
语法3:[[ <测试表达式> ]]  #两端有空格
语法4:((<测试表达式>))    #不需要空格

语法5:(命令表达式) 
语法6:`命令表达式`
编程语法:
[ <测试表达式> ] && 命令1
如果前面表达式成功,那么就执行后面命令。

[ <测试表达式> ] || 命令1
如果前面表达式失败,那么就执行后面命令。

[ <测试表达式> ] && {
命令1
命令2
命令3
}
如果前面表达式成功,那么就执行后面命令。

[ <测试表达式> ] && 命令1 || 命令2
如果前面表达式成功,那么就执行命令1,否则执行命令2。

[ <测试表达式> ] && {
命令1
命令2
}||{
命令3
命令4
}
如果前面表达式成功,那么就执行命令1,2,否则执行命令3,4。

5.2文件测试表达式

为什么需要文件测试表达式?
 操作一个对象,就要看对象条件是否满足,否则不要操作。
1、常见功能
2、实践
3、企业应用:启动脚本中的应用。

5.3字符串测试表达式

注意:
1、字符串就用双引号
2、等号可以用一个或者两个。
3、=号两端必须要有空格。
 实践:

[root@web01 ~]# [ -n "oldboy" ] && echo 1 || echo 0
1
[root@web01 ~]# [ -z "oldboy" ] && echo 1 || echo 0
0
[root@web01 ~]# char="oldboy"
[root@web01 ~]# [ -z "$char" ] && echo 1 || echo 0
0
[root@web01 ~]# unset char
[root@web01 ~]# [ -z "$char" ] && echo 1 || echo 0
1
[root@web01 ~]# [ "dd" == "dd" ] && echo 1 || echo 0
1
[root@web01 ~]# [ "dd" == "ff" ] && echo 1 || echo 0
0
[root@web01 ~]# [ "dd" = "ff" ] && echo 1 || echo 0
0
[root@web01 ~]# [ "dd" != "ff" ] && echo 1 || echo 0
1
[root@web01 ~]# [ "dd" != "dd" ] && echo 1 || echo 0
0

5.4整数测试表达式

5.5逻辑测试表达式

5.6条件测试表达式语法对比

[root@db03 scripts]# [ 1 -eq 1 -a -f /etc/hosts ] && echo 1 || echo 0
1
[root@db03 scripts]# [ 1 -eq 2 -a -f /etc/hosts ] && echo 1 || echo 0
0
[root@db03 scripts]# [ 1 -eq 2 && -f /etc/hosts ] && echo 1 || echo 0
-bash: [: missing `]'
0
[root@db03 scripts]# [[ 1 -eq 2 && -f /etc/hosts ]] && echo 1 || echo 0
0

[root@db03 scripts]# [ 1 -eq 2 ] && [ -f /etc/hosts ] && echo 1 || echo 0

[root@db03 scripts]# [ -f /etc/hosts ] && echo 1 || echo 0
1
[root@db03 scripts]# [ ! -f /etc/hosts ] && echo 1 || echo 0
0
小题:如果/tmp/oldboy.sh是普通文件,并且可执行,就执行改脚本。
file="/tmp/oldboy.sh"
if [ -f $file ] && [ -x $file ]
then
    bash $file
fi

6.if


7.函数



企业案例:通过脚本传参的方式,检查Web 网站URL是否正常。
wget命令:
--spider 模拟爬虫,不真正下载
-q 安静访问
-o /dev/null 不输出
-T --timeout 超时时间
-t --tries 重试次数
[root@web01 ~]# wget --spider -T 5 -q -o /dev/null -t 2 www.baidu.com
[root@web01 ~]# echo $?
0

curl命令:
-I 看响应头
-s 安静的
-o /dev/null 不输出
-w %{http_code} 返回状态码,200
[root@web01 ~]# curl www.baidu.com -s &>/dev/null
[root@web01 ~]# echo $?
0
[root@web01 ~]# curl -I -m 5 -s -w "%{http_code}\n" -o /dev/null  www.baidu.com
200

[root@oldboy ~]# cat checkurl.sh 
#!/bin/bash
##############################################################
# File Name: checkurl.sh
# Version: V1.0
# Author: vita
# Organization: vita
# Created Time : 2019-06-07 18:29:19
# Description:
##############################################################
usage(){
    echo "Usage:$0 url"
    exit 1
}
checkurl(){
    wget -q -o /dev/null -t 2 -T 5 $1
    if [ $? -eq 0 ]
    then
        echo "$1 is ok"
    else
        echo "$1 is fail"
    fi
}
main(){
    if [ $# -ne 1 ]
    then
        usage
    fi
    checkurl $1
}
main $*

[root@oldboy scripts]# cat 8_5_1.sh   
#!/bin/sh
function usage() {     #<==帮助函数
    echo $"usage:$0 url"
    exit 1
}

function check_url() { #<==检测URL函数。
  wget --spider -q -o /dev/null --tries=1 -T 5 $1 #<==这里的$1就是函数传参。
  if [ $? -eq 0 ]
   then
     echo "$1 is yes."
  else
    echo "$1 is no."
  fi
}

function main() {   #<==主函数。
  if [ $# -ne 1 ]  #<==如果传入的多个参数,则打印帮助函数,提示用户。
  then
    usage
  fi
  check_url $1     #<==接收函数的传参,即把结尾的$*传到这里。
}
main $*            #<==这里的$*就是把命令行接收的所有参数作为函数参数传给函数内部,常用手法。

8.设置输出字体颜色

范例9_3:给内容加不同的颜色。
 内容的颜色用数字表示,范围为30-37,每个数字代表一种颜色。代码如下:
echo -e "\033[30m 黑色字oldboy trainning \033[0m" #<==30m表示黑色字。
echo -e "\033[31m 红色字oldboy trainning \033[0m" #<==31m表示红色字。
echo -e "\033[32m 绿色字oldboy trainning \033[0m" #<==32m表示绿色字。
echo -e "\033[33m 棕色字oldboy trainning \033[0m" #<==33m表示棕色字(brown),和黄色字相近。
echo -e "\033[34m 蓝色字oldboy trainning \033[0m" #<==34m表示蓝色字。
echo -e "\033[35m 洋红字oldboy trainning \033[0m" #<==35m表示洋红色字(magenta),和紫色字相近。
echo -e "\033[36m 蓝绿色oldboy trainning \033[0m" #<==36m表示蓝绿色字(cyan),和浅蓝色字相近。
echo -e "\033[37m 白色字oldboy trainning \033[0m" #<==37m表示白色字。
 说明:不同的数字对应的字体颜色,见系统帮助(来源man console_codes命令的结果)。
 范例9_6: 给输出的字符串加不同的背景颜色。
 字的背景颜色对应的数字范围为40-47,代码如下。
echo -e "\033[40;37m 黑底白字oldboy\033[0m" #<==40m表示黑色背景。
echo -e "\033[41;37m 红底白字oldboy\033[0m" #<==41m表示红色背景。
echo -e "\033[42;37m 绿底白字oldboy\033[0m" #<==42m表示绿色背景。
echo -e "\033[43;37m 棕底白字oldboy\033[0m" #<==43m表示棕色背景(brown),和黄色背景相近。
echo -e "\033[44;37m 蓝底白字oldboy\033[0m" #<==44m表示蓝色背景。
echo -e "\033[45;37m 洋红底白字oldboy\033[0m" #<==45m表示洋红色背景(magenta),和紫色背景相近。
echo -e "\033[46;37m蓝绿底白字oldboy\033[0m" #<==46m表示蓝绿色背景(cyan),和浅蓝色背景相近。
echo -e "\033[47;30m 白底黑字oldboy\033[0m" #<==47m表示白色背景。

9.while


kill、killall、pkill:杀掉进程。
ps:查看进程。
pstree:显示进程状态树。
top:显示进程。
renice:改变优先权。
nohup:用户退出系统之后继续工作。
pgrep:查找匹配条件的进程。
strace:跟踪一个进程的系统调用情况。
ltrace:跟踪进程调用库函数的情况。
读文件
•方式1:在while循环结尾done通过输入重定向指定读取的文件。
while read line
do
    cmd
done

10.for循环

11. break、continue、exit、return的区别和对比

12.数组

12.1数组定义

•方法1:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔。
语法如下:
array=(value1 value2 value3 ... ) 
此为常用定义方法,需重点掌握。
示例如下:
[root@oldboy ~]# array=(1 2 3)    #<==用小括号将数组内容赋值给数组变量,数组元素用“空格”分隔开。
[root@oldboy ~]# echo ${array[*]} #<==输出上面定义的数组的所有元素值,注意语法。
1 2 3

•方法2:用小括号将变量值括起来,同时采用键值对的形式赋值。
语法如下:
array=([1]=one [2]=two [3]=three) 
此种方法为key-value键值对的形式,小括号里对应的数字为数组下标,等号后面的内容为下标对应的数组变量的值,此方法比较复杂,不推荐使用。
示例如下:
[root@oldboy ~]# array=([1]=one [2]=two [3]=three)
[root@oldboy ~]# echo ${array[*]} #<==输出上面定义的数组的所有元素值。 
one two three
[root@oldboy ~]# echo ${array[1]} #<==输出上面定义的数组的第一个元素值。
one
[root@oldboy ~]# echo ${array[2]} #<==输出上面定义的数组的第二个元素值。
two
[root@oldboy ~]# echo ${array[3]} #<==输出上面定义的数组的第三个元素值。
three

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

•方法4:动态地定义数组变量,并使用命令的输出结果作为数组的内容。
语法为:
array=($(命令))
或
array=(`命令`)
示例如下:
[root@oldboy data]# mkdir /array/ -p
[root@oldboy data]# touch /array/{1..3}.txt
[root@oldboy data]# ls -l /array/
总用量 0
-rw-r--r-- 1 root root 0 9月   6 09:38 1.txt
-rw-r--r-- 1 root root 0 9月   6 09:38 2.txt
-rw-r--r-- 1 root root 0 9月   6 09:38 3.txt
[root@oldboy data]# array=($(ls /array))
[root@oldboy data]# echo ${array[*]}
1.txt 2.txt 3.txt
说明:还可以使用declare -a array来定义数组类型,但是比较少这样用。

12.2操作数组元素

1.打印数组元素
此为常用知识点,需重点掌握。示例如下:
[root@oldboy data]# array=(one two three)
[root@oldboy data]# echo ${array[0]}
#<==打印单个数组元素用${数组名[下标]},当未指定数组下标时,数组的下标是从0开始。
one
[root@oldboy data]# echo ${array[1]}
two
[root@oldboy data]# echo ${array[2]}
three
[root@oldboy data]# echo ${array[*]}   #<==使用*或者@可以得到整个数组内容。
one two three
[root@oldboy data]# echo ${array[@]}   #<==使用*或者@可以得到整个数组内容。
one two three

2.打印数组元素的个数
此为常用知识点,需重点掌握。示例如下:
[root@oldboy data]# echo ${array[*]}   #<==使用*或者@可以得到整个数组内容。
one two three
[root@oldboy data]# echo ${#array[*]}  #<==用${#数组名[@或*]}可以得到数组长度,这和前文讲解的变量子串知识是一样的,因为数组也是变量,只不过是特殊的变量,因此也适合变量的子串替换等知识。
3
[root@oldboy data]# echo ${array[@]}   #<==使用*或者@可以得到整个数组内容。
one two three
[root@oldboy data]# echo ${#array[@]}  #<==用${#数组名[@或*]}可以得到数组长度,这和前文讲解的变量子串知识是一样的,因为数组也是变量,只不过是特殊的变量,因此也适合变量的子串替换等知识。
3

3.数组赋值
此知识不常用,了解即可。可直接通过“数组名[下标] ”对数组进行引用赋值,如果下标不存在,自动添加新一个数组元素,如果下标存在就覆盖原来的值。
示例如下:
[root@oldboy data]# array=(one two three)
[root@oldboy data]# echo ${array[*]}
one two three
[root@oldboy data]# array[3]=four       #<==增加下标为3的数组元素。
[root@oldboy data]# echo ${array[*]}
one two three four
[root@oldboy data]# array[0]=oldboy
[root@oldboy data]# echo ${array[*]}
oldboy two three four
[root@oldboy ~]# array[0]=oldboy        #<==修改数组元素。
[root@oldboy ~]# echo ${array[@]}
oldboy 2 3 4

4.数组的删除
因为数组本质上还是变量,因此可通过“unset 数组[下标]”清除相应的数组元素,如果不带下标,表示清除整个数组的所有数据。
示例如下:
[root@oldboy data]# echo ${array[*]}
oldboy two three four
[root@oldboy data]# unset array[1]   #<==取消下标为1的数组元素。
[root@oldboy data]# echo ${array[*]} #<==打印输出后发现数组元素“two”,不见了。
oldboy three four
[root@oldboy data]# unset array      #<==删除整个数组。
[root@oldboy data]# echo ${array[*]}
#<==没有任何内容了。

5.数组内容的截取和替换
这里和前文变量子串的替换是一样的,因为数组是特殊的变量。数组元素部分内容截取的示例如下:
[root@oldboy ~]# array=(1 2 3 4 5)
[root@oldboy ~]# echo ${array[@]:1:3}          #<==从下标为1的元素开始截取,共取3个数组元素。
2 3 4
[root@oldboy data]# array=({a..z})             #<==将变量的结果赋值给数组变量。
[root@oldboy data]# 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
[root@oldboy data]# echo ${array[@]:1:3}       #<==从下标为1的元素开始截取,共取3个数组元素。
b c d
[root@oldboy data]# echo ${array[@]:0:2}       #<==从下标为0的元素开始截取,共取2个数组元素。
a b
数组元素部分内容的替换如下:
[root@oldboy data]# array=(1 2 3 1 1)   
[root@oldboy data]# echo ${array[@]/1/b}    #<==把数组中的1替换成b,原数组未被修改,和sed很像。
b 2 3 b b
提示:调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数组。
数组元素部分内容的删除如下:
[root@oldboy data]# array=(one two three four five)
[root@oldboy data]# echo ${array[@]}               
one two three four five
[root@oldboy data]# echo ${array[@]#o*}    #<==从左边开始匹配最短的,并删除。 
ne two three four five
[root@oldboy data]# echo ${array1[@]##o*}  #<==从左边开始匹配最长的,并删除。 
two three four five
[root@oldboy data]# echo ${array[@]%f*}    #<==从右边开始匹配最短的,并删除。 
one two three
[root@oldboy data]# echo ${array[@]%%f*}   #<==从右边开始匹配最长的,并删除。
one two three
提示:数组也是变量,因此也适合于前面讲解过的变量的子串处理的功能应用。
数组的其他相关知识通过man bash然后搜Arrays来了解。

13.案例

13.1使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,创建的结果名称案例如下

产生随机数的几种方法
方法一

[root@m01 ~]# echo $RANDOM
 6283
范围是0-32767
方法二

[root@m01 ~]# openssl rand -base64 10
 YWUxX2qeGpYxTw==

[root@m01 ~]# openssl rand -base64 5
 5TFO28c=

[root@m01 ~]#
方法三

[root@m01 ~]# date +%s%N
 1554090050912930903
方法四

[root@m01 ~]# head /dev/urandom |cksum
 1387668414 1488
方法五

[root@m01 ~]# uuidgen
 acabc769-db56-4cf8-bfe2-df1fc3d66f69
方法六

[root@m01 ~]# cat /proc/sys/kernel/random/uuid
 44a2ba9c-0571-4723-8edc-3269bb433374
方法七
yum install -y expect

[root@m01 ~]# mkpasswd -l 11 -d 3 -C 3 -c 4
 wC304AbqCh>
-l长度
-d数字
-c小写字母
-C大写字母
-s特殊字符

[root@m01 ~]# echo "oldboy$RANDOM" |md5sum|tr '[0-9]' '[a-z]'|cut -c 2-11
 haiejeaaie

脚本内容
[root@m01 script]# cat 1.randomFileName.sh 
#!/bin/bash
##############################################################
# File Name: 1.randomFileName.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:18:13
# Description:
##############################################################
randomDir=/opt/randomFile
[ -d $randomDir ]||mkdir -p $randomDir
for ((i=0;i<10;i++));do
    lowerName=$(echo "oldboy$RANDOM" |md5sum|tr '[0-9]' '[a-z]'|cut -c 2-11)
    cd $randomDir
    touch ${lowerName}_oldboy.html
    echo "${lowerName}_oldboy.html has been touched!"
done
[root@m01 script]# ll /opt/randomFile/
total 0
-rw-r--r-- 1 root root 0 Apr  1 13:27 acaefhebdj_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 aijcddcebg_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 bhjdeifjcd_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 dfjgfccffe_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 diffjdacah_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 ehdfacbjdf_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 ghdhjbbgbe_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 iabafbcahh_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 jdidcffgeb_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 jhddaibhhd_oldboy.html

13.2批量改名,吧上面文件名中的oldboy改为oldgirl

[root@m01 script]# cat 2.rename.sh 
#!/bin/bash
##############################################################
# File Name: 2.rename.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:31:50
# Description:
##############################################################
randomDir=/opt/randomFile
files=$(ls $randomDir)
cd $randomDir
for file in $files;do
    newName=$(echo $file |sed 's#oldboy#oldgirl#g')
    mv $file $newName
    echo "$file change name to $newName!"
done
[root@m01 script]# sh 2.rename.sh 
acaefhebdj_oldgirl.html change name to acaefhebdj_oldgirl.html!
acgfcjcaaf_oldboy.html change name to acgfcjcaaf_oldgirl.html!
adefgffbfg_oldboy.html change name to adefgffbfg_oldgirl.html!
beabcafcdb_oldboy.html change name to beabcafcdb_oldgirl.html!
cebieaiadf_oldboy.html change name to cebieaiadf_oldgirl.html!
fbbdegebba_oldboy.html change name to fbbdegebba_oldgirl.html!
gcjafhcbbc_oldboy.html change name to gcjafhcbbc_oldgirl.html!
gibbcddcha_oldboy.html change name to gibbcddcha_oldgirl.html!
gjdebcjeba_oldboy.html change name to gjdebcjeba_oldgirl.html!
jdbifebcgj_oldboy.html change name to jdbifebcgj_oldgirl.html!

[root@m01 script]# ls -l /opt/randomFile/
total 0
-rw-r--r-- 1 root root 0 Apr  1 13:38 abbdcejieb_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 acaefhebdj_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 acgfcjcaaf_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 adefgffbfg_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 beabcafcdb_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 cebieaiadf_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 fbbdegebba_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 gcjafhcbbc_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 gibbcddcha_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 gjdebcjeba_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 jdbifebcgj_oldgirl.html

13.3批量添加用户oldboy01-oldboy10,并设置随机密码

版本一:
[root@m01 script]# cat 3.useradd.sh 
#!/bin/bash
##############################################################
# File Name: 3.useradd.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:41:32
# Description:
##############################################################
for i in {01..10};do
    passwd=$(mkpasswd -l 15 -d 2 -c 3)
    username=oldboy$i
    useradd $username
    echo "$passwd"|passwd --stdin $username
    echo "$username---$passwd">>./log/passwd.log
done
[root@m01 script]# 
[root@m01 script]# sh 3.useradd.sh
Changing password for user oldboy01.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy02.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy03.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy04.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy05.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy06.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy07.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy08.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy09.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy10.
passwd: all authentication tokens updated successfully.
[root@m01 script]# cat log/passwd.log 

oldboy01---vdloEpid47nXvp\
oldboy02---dgs0Qb@Cvw3onhf
oldboy03---ege7dabv=Lkz3jP
oldboy04---8grNTrbqdzct?1x
oldboy05---qYQlor-va2llhp1
oldboy06---Dkrfbbbukx&Uf90
oldboy07---"cKz6Fs9vbdihgx
oldboy08---az>./log/chpasswd.log
done
chpasswd <./log/chpasswd.log

[root@m01 script]# cat ./log/chpasswd.log 
oldboy11:Zrg/jho7XuCgQw==
oldboy12:1ISH686XhMEmLQ==
oldboy13:b+3QK+0wQTiJtQ==
oldboy14:KVVRytEJHWV/Tg==
oldboy15:WFQlIbMIjeYAMQ==

完美版
[root@m01 script]# cat 3.useradd.sh 
#!/bin/bash
##############################################################
# File Name: 3.useradd.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:41:32
# Description:
##############################################################
source /etc/init.d/functions
if [ $UID -ne 0];then
    echo "you can only use root to add new user!"
    exit 1
fi
for i in {12..17};do
    username=oldboy$i
    if [ $(grep $username /etc/passwd|wc -l) -eq 1 ];then
        action "oldboy$i has already exist!" /bin/false
    else
        useradd $username
        passwd=$(mkpasswd -l 15 -d 2 -c 3)
        echo "$passwd"|passwd --stdin $username
        echo "$username---$passwd">>./log/passwd.log
        action "$username has been added succesfully!" /bin/true
    fi
done
[root@m01 script]# 
[root@m01 script]# sh 3.useradd.sh 
3.useradd.sh: line 11: [: missing `]'
oldboy12 has already exist!                                [FAILED]
oldboy13 has already exist!                                [FAILED]
oldboy14 has already exist!                                [FAILED]
oldboy15 has already exist!                                [FAILED]
Changing password for user oldboy16.
passwd: all authentication tokens updated successfully.
oldboy16 has been added succesfully!                       [  OK  ]
Changing password for user oldboy17.
passwd: all authentication tokens updated successfully.
oldboy17 has been added succesfully!                       [  OK  ]

13.4扫描网络内存活的主机

方法一:

[root@m01 script]# nmap -sP 10.0.0.0/24

Starting Nmap 5.51 ( http://nmap.org ) at 2019-04-01 14:22 CST
 Nmap scan report for 10.0.0.1
 Host is up (0.00042s latency).
 MAC Address: 00:50:56:C0:00:08 (VMware)
 Nmap scan report for 10.0.0.61
 Host is up.
 Nmap scan report for 10.0.0.254
 Host is up (0.00014s latency).
 MAC Address: 00:50:56:E2:B0:A8 (VMware)
 Nmap done: 256 IP addresses (3 hosts up) scanned in 19.46 seconds
方法二:

[root@m01 script]# ping -c 1 -t 2 www.baidu.com2
 ping: unknown host www.baidu.com2

[root@m01 script]# echo $?
 2

[root@m01 script]# cat 4.ping.sh 
#!/bin/bash
##############################################################
# File Name: 4.ping.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 14:33:53
# Description:
##############################################################
source /etc/init.d/functions
for ip in {1..254};do
{
    ping -c 1 -w 3 10.0.0.$ip > /dev/null 2>&1
    [ $? -eq 0 ]&&{
    action "10.0.0.$ip can be accessed!" /bin/true
    }||{
    action "10.0.0.$ip can not be accessed" /bin/false
    }
} & -----这里用{} &意思是并发执行里面的内容,不过输出有些混乱。相比之下,顺序执行比较慢
done

13.5分库备份

常规方法:
mysqldump -B oldboy oldgirl test|gzip>bak.sql.gz
分库备份
mysqldump -B oldboy|gzip>bak.sql.gz
 mysqldump -B oldgirl|gzip>bak.sql.gz
 mysqldump -B test|gzip>bak.sql.gz

[root@m01 script]# vim 5.mysqlDatabase.sh
#!/bin/bash
##############################################################
# File Name: 5.mysqlDatabase.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 15:11:51
# Description:
##############################################################

mysqlCommand=/application/mysql/bin/mysql
mysqlDump=/application/mysql/bin/mysqldump
databases=$($mysqlCommand -uroot -poldboy123 -e "show databases" 2>/dev/null |grep -Ev 'Database|schema')
for database in $databases;do
    $mysqlDump -uroot -poldboy123 -B $database|gzip>${database}.sql.gz                                       
done

13.6分库分表

[root@m01 script]# cat 6.mysqlTable.sh 
#!/bin/bash
##############################################################
# File Name: 6.mysqlTable.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 15:39:12
# Description:
##############################################################
mysqlCommand="/application/mysql/bin/mysql  -uroot -poldboy123"
mysqlDump="/application/mysql/bin/mysqldump  -uroot -poldboy123"
databases=$($mysqlCommand  -e "show databases;" 2>/dev/null |grep -Ev 'Database|schema')
for database in $databases;do
    for table in $($mysqlCommand -e "show tables from $database;" 2>/dev/null|sed 1d );do

        $mysqlDump  -B $database $table |gzip>./log/${database}_${table}.sql.gz 2>/dev/null
    done
done

13.7SSH免秘钥批量分分发文件

[root@m01 script]# cat 7.distributeFile.sh 
#!/bin/bash
##############################################################
# File Name: 7.distributeFile.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 15:57:04
# Description:
##############################################################
source /etc/init.d/functions
[ $# -ne 2 ]&&{
echo "Usage $0 localpath remotepath"
exit 1
}
for ip in 7;do
    scp -r $1 [email protected].$ip:$2
    [ $? -eq 0 ]&&{
    action "10.0.0.$ip has recevied file" /bin/true
    }||{
    action "10.0.0.$ip has not received file" /bin/false
    }
done
[root@m01 script]# 
[root@m01 script]# sh 7.distributeFile.sh /oldboy/ /ol
10.0.0.7 has recevied file                                 [  OK  ]
[root@m01 script]# sh 7.distributeFile.sh /oldb /ol
/oldb: No such file or directory
10.0.0.7 has not received file                             [FAILED]

13.8破解RAND

这个是最快的,因为循环少了很多
[root@m01 script]# cat 8-2.encodeRandom.sh 
#!/bin/bash
##############################################################
# File Name: 8.encodeRandom.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 16:08:14
# Description:
##############################################################
array=(21029299 00205d1c a3da1677 1f6d12dd 890684b)

for i in {1..32767};do
    echo "$i $(echo "$i"|md5sum)">>log/encode.log
done

for md5Num in ${array[*]};do
    echo "$(grep "$md5Num" log/encode.log)"
done
[root@m01 script]# 
[root@m01 script]# sh 8-2.encodeRandom.sh 
25667 2102929901ee1aa769d0f479d7d78b05  -
1346 00205d1cbbeb97738ad5bbdde2a6793d  -
25345 a3da1677501d9e4700ed867c5f33538a  -
7041 1f6d12dd61b5c7523f038a7b966413d9  -
10082 890684ba3685395c782547daf296935f  -

不用数组
[root@m01 script]# cat 8.encodeRandom.sh 
#!/bin/bash
##############################################################
# File Name: 8.encodeRandom.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 16:08:14
# Description:
##############################################################
for i in {1..32767};do
    for md5Num in 21029299 00205d1c a3da1677 1f6d12dd 890684b;do
       num=$(echo "$i"|md5sum|grep "$md5Num"|wc -l)
       if [ $num -eq 0 ];then
           continue
       else
           echo "${i}----${md5Num}"
           continue
       fi
    done
done
使用数组
[root@m01 script]# cat 8-1.encodeRandom.sh 
#!/bin/bash
##############################################################
# File Name: 8.encodeRandom.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 16:08:14
# Description:
##############################################################
array=(21029299 00205d1c a3da1677 1f6d12dd 890684b)
for i in {1..32767};do
    for md5Num in ${array[*]};do
       num=$(echo "$i"|md5sum|grep "$md5Num"|wc -l)
       if [ $num -eq 0 ];then
           continue
       else
           echo "${i}----${md5Num}"
           continue
       fi
    done
done
[root@m01 script]# 
[root@m01 script]# sh 8-1.encodeRandom.sh 
1346----00205d1c
7041----1f6d12dd
10082----890684b
25345----a3da1677
25667----21029299

13.9监测url

[root@m01 script]# cat 9.checkUrl.sh 
#!/bin/bash
##############################################################
# File Name: 9.checkUrl.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 17:12:15
# Description:
##############################################################
source /etc/init.d/functions
url_list=(
http://blog.oldboyedu.com
http://blog.etiantian.org
http://oldboy.blog.51cto.com
http://10.0.0.7
)
checkUrl() {
    curl -s -t 3 -o /dev/null $1
    [ $? -eq 0 ]&&{
        action "$1 can be accessed!" /bin/true
    }||{
        action "$1 can not be accessed!" /bin/false
    }

}
dealUrl() {
    for url in ${url_list[*]};do
        checkUrl $url
    done
}
main() {
    dealUrl
}
main
[root@m01 script]# 
[root@m01 script]# sh 9.checkUrl.sh 
http://blog.oldboyedu.com can be accessed!                 [  OK  ]
http://blog.etiantian.org can not be accessed!             [FAILED]
http://oldboy.blog.51cto.com can be accessed!              [  OK  ]
http://10.0.0.7 can not be accessed!                       [FAILED]

13.10防止DOS

[root@m01 oldboy]# cat access_2010-12-8.log |awk -F '[ ]' '{IP[$1]++}END{for (key in IP) print key,IP[key]}'
59.33.26.105 44
123.122.65.226 31
124.115.4.18 40

[root@m01 script]# cat 10-Dos.sh 
#!/bin/bash
##############################################################
# File Name: 10-Dos.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 17:58:54
# Description:
##############################################################
awk '{IP[$1]++}END{for (key in IP) print key,IP[key]}' ./log/access_2010-12-8.log>./log/dosResult.log
exec < ./log/dosResult.log
while read line;do
    times=$(echo "$line"|awk '{print $2}')
    ip=$(echo "$line"|awk '{print $1}')
    if [ $times -gt 10 ];then
        iptables -A INPUT -s $ip -j DROP
    fi
done
[root@m01 script]#

13.11按单词排序

[root@m01 log]# awk -F "[ .,]" '{for (i=1;i

13.12MYSQL启动脚本

#!/bin/bash
# chkconfig: 2345 21 81
##############################################################
# File Name: mysqld
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
lockfile=/var/lock/subsys/mysqld
. /etc/init.d/functions
mysqld_pid_file_path="/application/mysql/data/web01.pid"
mysqld_safe=/application/mysql/bin/mysqld_safe

start(){

    /bin/sh $mysqld_safe --datadir=/application/mysql/data --pid-file=$mysqld_pid_file_path &>/dev/null &
    retval=$?
    sleep 2
    if [ $retval -eq 0 ]
    then
        action "mysql startup ok" /bin/true
        touch $lockfile
        return $retval
    else
        action "mysql startup fail" /bin/false
        return $retval
    fi
}
stop(){
    if test -s "$mysqld_pid_file_path"
    then
        mysqld_pid=`cat $mysqld_pid_file_path`
        if (kill -0 $mysqld_pid &>/dev/null)
        then
            kill $mysqld_pid
            retval=$?
            sleep 2
            if [ $retval -eq 0 ]
            then
                action "mysql stop ok" /bin/true
                rm $lockfile
                return $retval
            else
                action "mysql stop fail" /bin/false
                return $retval
            fi
         else
            echo " mysqld process is not exist."
            return 2
         fi
    else
        echo "$mysqld_pid_file_path is not exist,or mysqld does not startup."
    fi
}
case "$1" in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        sleep 2
        start
        retval=$?
        ;;
    *)
        echo "usage:$0 {start|stop|restart}"
        exit 1
esac
exit $retval

13.132.10通过awk同时分析出secure文件中每个用户被每个ip破解的次数通过awk同时分析access.log文件每个ip的重复数和每个ip使用的流量

[root@oldboyedu-01 ~]# cat /oldboy/access.log |awk '{array[$1]++;sum[$1]=sum[$1]+$10}END{for (ip in array) print ip,array[ip],sum[ip]}'
180.97.106.162 2 336
180.97.106.37 4 672

13.142.10通过awk同时分析出secure文件中每个用户被每个ip破解的次数

[root@oldboyedu-01 ~]# cat /oldboy/secure.txt |grep 'Failed'|awk '{array[$9,$11]++}END{for (i in array) print i,array[i]}'
oldboy10.0.0.1 2
oldboy10.0.0.3 1
root10.0.0.1 5
root10.0.0.2 3

你可能感兴趣的:(shell脚本)