linux 快捷键汇总
1,快捷键
移动光标 Ctrl + a Ctrl + e Ctrl + f Ctrl + b 剪切,粘贴,清楚 Ctrl + Insert 复制 Shift + Insert 粘贴 Ctrl + k 剪切光标到行尾 Ctrl + u 剪切光标到行首 Ctrl + w 剪切光标前1个单词 Ctrl + y 粘贴剪切的文本 控制快捷键 Ctrl + s 锁定屏幕,无法写入 Ctrl + q 解锁屏幕 !号开头的快捷命令 !! 执行上一条命令 !pw 执行最近以pw开头的命令* !pw:p 执行最近以pw开头的命令*,仅仅是打印不执行 !num 执行历史命令列表的第num(数字)条命令 !$ 上一条命令的最后一个参数,相当于 Esc+.(点)
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server & && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2' | 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l,再如ps aux | grep nginx || 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail" Linux系统下Shell重复执行上条命令的 4 种方法: 1、使用上方向键,并回车执行。 2、按 !! 并回车执行。 3、输入 !-1 并回车执行。 4、按 Ctrl+P 并回车执行。 把一个命令的结果作为变量的内容赋值 变量名=`ls` 变量名=$(ls) a=$(date +%F) echo $a echo $(data +%F).tar.gz echo hello-$(data +%F).tar.gz awk 'BEGIN {print "'$ETT'"}' #awk 加单引号后再同时添加双引号 常用特殊位置的参数变量 $0 获取当前执行的shell脚本名称,如果执行了脚本包含了路径,那么就包含脚本路径 $n 获取当前执行的shell脚本的第n个参数值, n=1..9 ,当n为0时表示脚本的文件名;如果n大于9,则用大括号括起来,例如$(10),接的参数以空格隔开 $# 获取当前shell脚本后面接的参数的总个数 $* 获取当前shell脚本所有传参的参数,不加引号和$@相同;如果加引号"$@",相当于"$1 $2 $3" $@ 获取当前shell脚本所有传参的参数,不加引号和$@相同;如果加引号"$*",相当于"$1" "$2" "$3" ps1:$1 # cat p.sh echo $1 ]# sh p.sh old old ps2:$2 $3 ]# cat p.sh echo $1 $2 ]# sh p.sh log1 log2 log1 log2 ps3:\${1..15}, 当大于9的时候就不对了 [root@test01 ~]# echo \${1..15} $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@test01 ~]# echo \${1..15} >n.sh [root@test01 ~]# cat n.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@test01 ~]# echo {a..z} 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@test01 ~]# sh n.sh {a..z} n.sh: line 1: a: command not found [root@test01 ~]# cat n.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@test01 ~]# vi n.sh [root@test01 ~]# cat n.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@test01 ~]# sh n.sh {a..z} a b c d e f g h i a0 a1 a2 a3 a4 a5 #当大于9的时候就不对了 当位置大于9时,需要用大括号将数括起来 ]# cat n.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} [root@test01 ~]# sh n.sh {a..z} a b c d e f g h i j k l m n o
脚本名及路径 # cat n.sh echo $0 [root@test01 ~]# sh n.sh n.sh [root@test01 ~]# cat n.sh echo $0 [root@test01 ~]# sh n.sh n.sh [root@test01 ~]# basename n.sh n.sh [root@test01 ~]# dirname n.sh . [root@test01 ~]# vi n.sh [root@test01 ~]# sh n.sh . n.sh [root@test01 ~]# cat n.sh dirname $0 basename $0 条件表达式判断语句 # cat t1.sh [ $# -ne 2 ] && { #如果执行脚本传参的个数不等于2 echo "muse two args" exit 1 } echo hello [root@test01 ~]# sh t1.sh 1 2 hello [root@test01 ~]# sh t1.sh 1 muse two args if判断语句的语法 ]# cat t2.sh if [ $# -ne 2 ] #如果执行脚本传参的个数不等于2 then echo "USAGE:/bin/sh $0 arg1 arg2" #$0打印脚本名称 exit 1 fi echo $1 $2 [root@test01 ~]# sh t2.sh USAGE:/bin/sh t2.sh arg1 arg2 [root@test01 ~]# sh t2.sh aa bb aa bb # set -- "hello world" aa nb [root@test01 ~]# echo $# 3 [root@test01 ~]# echo $1 hello world [root@test01 ~]# echo $2 aa [root@test01 ~]# echo $3 nb [root@test01 ~]# [root@test01 ~]# [root@test01 ~]# echo $* hello world aa nb [root@test01 ~]# echo $# 3 [root@test01 ~]# echo $@ hello world aa nb # for i in $*;do echo $i;done hello world aa nb [root@test01 ~]# for i in $@;do echo $i;done hello world aa nb [root@test01 ~]# for i in "$*";do echo $i;done hello world aa nb [root@test01 ~]# for i in "$@";do echo $i;done #加双引号,这才是真正符合传入的参数需求 hello world aa nb Shell特殊进场中的特殊状态变量 $? 获取执行上一个指令状态返回值,(0为成功,非零为失败) $$ 获取当前执行的shell脚本的进程号(PID),这个变量不常用, $! 获取上一个在后台工作的进程的进程号(PID),不常用 $_ 获取在此之前执行的命令或脚本的最后一个参数,不常用 bash中如何实现条件判断? 条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式: [ expression ] ` expression ` test expression 整数比较: -eq(equal) : 测试两个整数是否相等;比如 $A -eq $B -ne(inequality) : 测试两个整数是否不等;不等,为真;相等,为假; -gt(greter than) : 测试一个数是否大于另一个数;大于,为真;否则,为假; -lt(less than) : 测试一个数是否小于另一个数;小于,为真;否则,为假; -ge(greter equal): 大于或等于 -le(less equal) :小于或等于 命令的间逻辑关系: 逻辑与: && 第一个条件为假时,第二条件不用再判断,最终结果已经有; 第一个条件为真时,第二条件必须得判断; 逻辑或: || 如果用户不存在,添加并给密码;否则,显示其已经存在 ~]# ! id xiaoming && useradd xiaoming && echo "xiaoming" |passwd --stdin xiaoming || echo "user exists" uid=1000(xiaoming) gid=1000(xiaoming) groups=1000(xiaoming) user exists $$特殊变量,获取当前执行脚本的进程号 ]# cat pid.sh #!/bin/sh pidpath=/tmp/a.pid if [ -f "$pidpath" ] then kill `cat $pidpath` >/dev/null 2>&1 rm -rf $pidpath fi echo $$ >$pidpath sleep 300 echo命令 -n 不换行输出内容 -e 解析转义字符 (转义字符) \n 换行 \r 回车 \t 制表符tab \b 退格 \v 纵向制表符 # echo "hello\txiaoming\nhello2\txiaohong" hello\txiaoming\nhello2\txiaohong [root@test01 ~]# echo -e "hello\txiaoming\nhello2\txiaohong" #加-e参数解析以"\"开头的字符 hello xiaoming hello2 xiaohong eval 当执行到eval时,shell读入参数args,并将组合成一个新的命令。 # cat noeval.sh echo \$$# [root@test01 ~]# sh noeval.sh arg1 arg2 $2 [root@test01 ~]# cat eval.sh eval "echo \$$#" [root@test01 ~]# sh eval.sh arg1 arg2 arg2 exec 能够在不创建新的子进程的前提下,转去执行指定的命令,当指定命令执行完毕后,该进程结束。 ~]# seq 5 >/tmp/tmp.log [root@test01 ~]# cat /tmp/tmp.log 1 2 3 4 5 [root@test01 ~]# vim exec.sh [root@test01 ~]# sh exec.sh 1 2 3 4 5 ok [root@test01 ~]# cat exec.sh exec </tmp/tmp.log while read line do echo $line done echo ok shift 将位置参数$1、$2等进行左移,($1、$2左移后变成$2) ]# cat n.sh echo $1 $2 if [ $# -eq 2 ];then shift echo $1 fi [root@test01 ~]# sh n.sh 1 2 1 2 2 #本来是1的,进行左移后变成2 变量值长度 通过在变量名前加#,就可以打印变量值的长度 ]# a="I am xiaoming" [root@test01 ~]# echo ${a} I am xiaoming [root@test01 ~]# echo $a I am xiaoming [root@test01 ~]# echo ${#a} 13
[root@test01 ~]# echo $a I am xiaoming ~]# echo $a |wc -l 1 [root@test01 ~]# echo $a| wc -L #-L 大写L可以,小写不行 13 ]# echo ${a:2} #截取变量的内容,从第2个字符之后开始截取后面全部 am xiaoming [root@test01 ~]# echo ${a} I am xiaoming [root@test01 ~]# echo ${a:1} am xiaoming [root@test01 ~]# echo ${a:3} m xiaoming [root@test01 ~]# echo ${a:2:2} ##截取变量的内容,从第2个字符之后开始截取2个字符 am [root@test01 ~]# echo ${a} | cut -c 3-4 #输出变量内容,管道交给cut 截取第3-4个位置的字符 am ]# echo ${b} abcABC123ABCabc [root@test01 ~]# echo ${b##a*c} #从开头开始删除最长匹配"a*c"的子串 [root@test01 ~]# echo ${b##a*C} #从开头开始删除最长匹配"a*C"的子串 abc 有关上述匹配删除的小结: # 表示从开头删除匹配最短 ## 表示从开头删除匹配最长 % 表示从结尾删除匹配最短 %% 表示从结尾删除匹配最短 a*c 表示匹配的字符串, * 表示匹配所有, a*c匹配a到c的字符串 ":=" 代表同时赋值给里边外部的没有定义的变量 # echo $b [root@test01 ~]# echo $bb [root@test01 ~]# bb=${b:=unix} [root@test01 ~]# echo $b unix [root@test01 ~]# echo $bb unix [root@test01 ~]# bb=${b=unix} [root@test01 ~]# echo $bb unix [root@test01 ~]# echo $b unix 使用-x可以跟踪详细的执行步骤 [root@test01 ~]# sh -x checkurl.sh + CheckUrl + timeout=5 + fails=0 + success=0 + true + wget --timeout=5 --tries=1 http://helloworld.com -q -O /dev/null + '[' 0 -ne 0 ']' + let success+=1 + '[' 1 -ge 1 ']' + echo success success + exit 0 expr计算 ~]# expr 2 + 2 4 [root@test01 ~]# i=5 [root@test01 ~]# i=`expr $i + 6` [root@test01 ~]# echo $i 11 ~]# i=5 [root@test01 ~]# expr $i + 6 &>/dev/null [root@test01 ~]# echo $? 0 返回值0,为整数 [root@test01 ~]# i=xiaoming [root@test01 ~]# expr $i + 6 &>/dev/null [root@test01 ~]# echo $? 2 返回值不为0,不是整数 通过传参判断输出的内容是否为整数 [root@test01 ~]# sh expr1.sh 2 int [root@test01 ~]# sh expr1.sh a chars [root@test01 ~]# cat expr1.sh #!/bin/sh expr $1 + 1 >/dev/null 2>&1 [ $? -eq 0 ] && echo int || echo chars 通过read读入持续等待输入的例子 ]# sh judge_int.sh Pls input: a chars Pls input: 11111 int Pls input: ^C [root@test01 ~]# cat judge_int.sh #!/bin/sh while true do read -p "Pls input: " a expr $a + 0 >/dev/null 2>&1 [ $? -eq 0 ] && echo int || echo chars done 判断参数是否为2,否,退出终止 判断传入的参数是否为整数,否,退出终止 做运算 [root@test01 ~]# sh -x test2.sh 11 2 + '[' 2 -ne 2 ']' + a=11 + b=2 + expr 11 + 2 + 110 + '[' 0 -ne 0 ']' + echo a-b=9 a-b=9 + echo a+b=13 a+b=13 + echo 'a*b=22' a*b=22 + echo a/b=5 a/b=5 + echo 'a**b=121' a**b=121 + echo a%b=1 a%b=1 [root@test01 ~]# sh test2.sh 11 2 a-b=9 a+b=13 a*b=22 a/b=5 a**b=121 a%b=1 [root@test01 ~]# cat test2.sh #!/bin/sh #no.1 [ $# -ne 2 ]&&{ echo $"USAGE $0 NUM1 NUM2" exit 1 } #no.2 a=$1 b=$2 expr $a + $b + 110 &>/dev/null if [ $? -ne 0 ] then echo "you must input two nums." exit 2 fi #no.3 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))" 正则表达式: 匹配数字 ^[0-9][0-9]*$ ]# cat t3.sh #!/bin/sh if [[ `expr match "$1" "[0-9][0-9]*$"` == 0 ]] then echo "$1 is not a num" else echo "$1 is a num" fi 打印下面语句中字符数不大于6的单词 ~]# cat word_length.sh #!/bin/sh for n in I am xiaoming linux welcome to our training do if [ `expr length $n` -le 6 ] then echo $n fi done [root@test01 ~]# sh word_length.sh I am linux to our 将bc用在命令行下面,以实现运算功能 ]# echo 3+5|bc 8 # i=2 [root@test01 ~]# i=`echo $i+6 | bc` [root@test01 ~]# echo $i 8 ]# echo {1..10}|tr "" "+" #{1..10}生成以空格为间隔的数字序列,并交给tr将空格替换为+号 1 2 3 4 5 6 7 8 9 10 [root@test01 ~]# echo {1..10}|tr " " "+" 1+2+3+4+5+6+7+8+9+10 [root@test01 ~]# seq -s '+' 10 #seq是生成数字序列, -s是指定数字序列之间的分隔符 1+2+3+4+5+6+7+8+9+10 [root@test01 ~]# echo `seq -s "+" 10`=`seq -s "+" 10|bc` #使用bc计算 1+2+3+4+5+6+7+8+9+10=55 [root@test01 ~]# echo "`seq -s '+' 10`="$((`seq -s '+' 10`)) 1+2+3+4+5+6+7+8+9+10=55 [root@test01 ~]# echo $((`seq -s '+' 10`)) #使用(()) 计算 55 [root@test01 ~]# echo `seq -s '+' 10`=`seq -s " + " 10|xargs expr` #使用expr计算 1+2+3+4+5+6+7+8+9+10=55 [root@test01 ~]# echo `seq -s "+" 10`=$(echo $[`seq -s "+" 10`]) #使用$[]计算 1+2+3+4+5+6+7+8+9+10=55 [root@test01 ~]# echo $[1+2] #使用$[]计算 3 用awk进行运算 ~]# echo "7.2 8.3" |awk '{print ($1-$2)}' -1.1 [root@test01 ~]# echo "222 100" | awk '{print ($1-3)/$2}' 2.19 [root@test01 ~]# echo "3 9" | awk '{print ($1+3)*$2}' 54 $[] 的运算 [root@test01 ~]# i=5 [root@test01 ~]# i=$[i+6] [root@test01 ~]# echo $i 11 [root@test01 ~]# echo $[2*3] 6 [root@test01 ~]# echo $[2**3] 8 [root@test01 ~]# echo $[2/3] 0 read命令 read 参数 变量 -p prompt:设置提示信息 -t timeout: 设置输入等待的时间,单位默认为秒 [root@test01 ~]# read -t 10 -p "Pls input one num:" num Pls input one num:2 [root@test01 ~]# echo $num 2 [root@test01 ~]# read -t 10 -p "Pls input two num:" num1 num2 Pls input two num:1 2 [root@test01 ~]# echo $num1 $num2 1 2 [root@test01 ~]# sh test_2.sh please input two number:1 2 a-b=-1 a+b=4 a*b=2 a/b=0 [root@test01 ~]# cat test_2.sh #!/bin/sh read -t 15 -p "please input two number:" a b echo "a-b=$(($a-$b))" echo "a+b=$(($b+$b))" echo "a*b=$(($a*$b))" echo "a/b=$(($a/$b))" 利用read读入判断 [root@test01 ~]# sh read_size01.sh Pls input two number:1 2 a-b=-1 a+b=4 a*b=2 a/b=0 [root@test01 ~]# [root@test01 ~]# cat read_size01.sh #!/bin/sh read -t 15 -p "Pls input two number:" a b #no.1 [ ${#a} -le 0 ]&&{ echo "the firest num is null" exit 1 } [ ${#b} -le 0 ] && { echo "the secound num is null" exit 1 } #no.2 expr $a + 1 &>/dev/null RETVAL_A=$? expr $b + 1 &>/dev/null RETVAL_B=$? if [ $RETVAL_A -ne 0 -o $RETVAL_B -ne 0 ];then echo "one of the num is not num,pls input again" exit 1 fi #no.3 echo "a-b=$(($a-$b))" echo "a+b=$(($b+$b))" echo "a*b=$(($a*$b))" echo "a/b=$(($a/$b))"
[root@test01 ~]# sh read_size02.sh USAGE:sh read_size02.sh num1 num2 [root@test01 ~]# sh read_size02.sh 1 2 a-b=-1 a+b=4 a*b=2 a/b=0 a/b =0 %b =1 [root@test01 ~]# sh read_size02.sh 1 0 USAGE:sh read_size02.sh num1 num2 [root@test01 ~]# sh read_size02.sh 1 s USAGE:sh read_size02.sh num1 num2 [root@test01 ~]# cat read_size02.sh #!/bin/sh a=$1 b=$2 Usage(){ echo $"USAGE:sh $0 num1 num2" exit 1 } if [ $# -ne 2 ];then Usage fi #no.2 expr $a + 1 &>/dev/null 2>&1 [ $? -ne 0 ] && Usage expr $b + 0 &>/dev/null 2>&1 [ $? -ne 0 ] && Usage #no.3 echo "a-b=$(($a-$b))" echo "a+b=$(($b+$b))" echo "a*b=$(($a*$b))" echo "a/b=$(($a/$b))" if [ $b -eq 0 ] then echo "you input does not allow to run." echo "a/b =error" echo "a%b =error" else echo "a/b =$(($a/$b))" echo "%b =$(($a%$b))" fi 条件测试方法 语法1:test <测试表达式> 语法2:[<测试表达式>] 语法3:[[<测试表达式>]] 语法4:(()) 一般用于if语句里 注:语法1、语法2是等价的,语法3为扩展的test命令。 在[[]]中可以使用通配符等进行模式匹配,,其他的1-3语法不行 在[[]]中也可以&& || > <等;在[]中一般用-a -o -gt(用于整数)、lt(用于整数)代替上述操作符。 对应整数的关系运算,也可以使用shell的运算符(()) test命令使用-f选项测试文件(文件存在且为普通文件则表达式成立) ~]# test -f file && echo ture || echo false test命令使用-z选项测试字符串(如果测试字符串的长度为0,则表达式成立) [root@test01 ~]# test -z "aaa" && echo 1 || echo 0 0 [root@test01 ~]# char="" [root@test01 ~]# test -z "$char" && echo 1 || echo 0 1 [] 条件语法测试 []使用-f选项测试文件(文件存在且为普通文件则表达式成立) ~]# [ -f /tmp/1.txt ] && echo 1 || echo 0 0 ~]# [[ -f /tmp/1.txt ]] && echo 1 || echo 0 0 常用的文件测试操作符 -d 文件, (directory) ,文件存在且为目录则真,即测试表达式成立 -f 文件,(file), 文件存在且为普通文件则真,即测试表达式成立 -e 文件, (exists), 文件存在则为真,(目录和文件同时辨别) -r 文件, (read), 文件存在且可读为真 -w 文件, (write), 文件存在且可写为真 -x 文件, (executable), 文件存在且可执行为真 -s 文件, (size), 文件存在且文件大小不为0为真 -L 文件, (link), 文件存在且为链接文件为真 f1 -nt f2 ,(nt,newer than), 文件f1 比文件f2新则为真,即测试表达式成立。根据修改的时间来计算 f1 -ot f2 ,(older than),文件f1 比文件f2旧则为真,即测试表达式成立。根据修改的时间来计算 对单个文件,单个目录测试 用[]测试变量时,如果被测试的变量不加引号,测试结果可能不正确。 [root@test01 ~]# [ -f $old ] && echo 1 || echo 0 1 [root@test01 ~]# [ -f "$old" ] && echo 1 || echo 0 0 特殊条件测试表达式(替代if语句) 1, 当条件1成立时,同时执行命令1,2,3,不用if测试表达式的格式 [ 条件1 ] && { 命令1 命令2 命令3 } [[ 条件1 ]] && { 命令1 命令2 命令3 } test 条件1 && { 命令1 命令2 命令3 } 以上判断相当于 if [ 条件1 ] then 命令1 命令2 命令3 fi 当条件不成立时,执行大括号里的多条命令,要使用逻辑操作符"||" [ 条件1 ] || { 命令1 命令2 命令3 } ~]# [ -f /etc/services ] && { echo "hello"; echo "world"; } hello world 字符串测试表达式 字符串操作符 -n "字符串" #若字符串长度不为0,则为真,即测试表达式成立,n可以理解为no zero -z "字符串" #若字符串长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写 "字符串1"="字符串2" #若字符串1等于字符串2,则为真,即测试表达式成立,可以用"=="代替"=" "字符串1"!="字符串2" #若字符串1不等于字符串2,则为真,即测试表达式成立,可以用"!=="代替"!=" 注: 字符串比较时若等号两端没有空格,则会导致判断出现逻辑错误。 [root@test01 ~]# [ -n "abc" ] && echo 1 || echo 0 1 [root@test01 ~]# test -n "abc" && echo 1 || echo 0 1 [root@test01 ~]# var="xiaoming" [root@test01 ~]# [ -n "$var" ] && echo 1 || echo 0 1 [root@test01 ~]# [ -n $var ] && echo 1 || echo 0 1 [root@test01 ~]# var="xiaoli" [root@test01 ~]# [ -z "$var" ] && echo 1 || echo 0 0 [root@test01 ~]# [ "abc" = "abc" ] && echo 1 || echo 0 1 [root@test01 ~]# [ "abc" = "abcd" ] && echo 1 || echo 0 0 [root@test01 ~]# [ "$var" = "abc" ] && echo 1 || echo 0 0 [root@test01 ~]# [ "$var" = "xiaoli" ] && echo 1 || echo 0 1 [root@test01 ~]# [ "$var" == "xiaoli" ] && echo 1 || echo 0 1 [root@test01 ~]# [ "$var" !== "xiaoli" ] && echo 1 || echo 0 -bash: [: !==: binary operator expected 0 [root@test01 ~]# [ "$var" != "xiaoli" ] && echo 1 || echo 0 0 逻辑操作符 在[]和test中使用的操作符 在[[]]和(())中使用的操作符 说明 -a && and,与,两端都为真,则结果为真 -o || or, 或,两端有一个为真,则结果为真 ! ! not,非,两端相反,则结果为真 [root@test01 ~]# m=2;n=3 [root@test01 ~]# m=21;n=38 [root@test01 ~]# ((m>20&&n>30)) && echo 1 ||echo 0 1 [root@test01 ~]# [ $m -gt 20 -a $n -lt 30 ] && echo 1 || echo 0 0 [root@test01 ~]# [ $m -gt 20 ] || [ $n -lt 30 ] && echo 1 || echo 0 1 [root@test01 ~]# [ $m -gt 20 || $n -lt 30 ] && echo 1 || echo 0 -bash: [: missing `]' -bash: 38: command not found 0 [root@test01 ~]# [ $m -gt 20 ] || [ $n -lt 30 ] && echo 1 || echo 0 1 #egrep -wn "\-a|\-o" /etc/init.d/nfs # for n in `ls /etc/init.d/*`;do egrep -wn "\[\[ " $n&&echo$n;done [root@test01 ~]# sh test3.sh pls input a char:1 1 [root@test01 ~]# sh test3.sh pls input a char:3 error [root@test01 ~]# sh test3.sh pls input a char:2 2 [root@test01 ~]# [root@test01 ~]# sh test3.sh pls input a char:4 error [root@test01 ~]# cat test3.sh #!/bin/sh echo -n "pls input a char:" read var [ "$var" == "1" ] && { echo 1 exit 0 } [ "$var" == "2" ] && { echo 2 exit 0 } [ "$var" != "2" -a "$var" != "1" ] && { echo error exit 0 } [root@test01 ~]# sh test4.sh error [root@test01 ~]# sh test4.sh 2 2 [root@test01 ~]# sh test4.sh 1 1 [root@test01 ~]# sh test4.sh 3 error [root@test01 ~]# cat test4.sh #!/bin/sh var=$1 [ "$var" == "1" ] && { echo 1 exit 0 } [ "$var" == "2" ] && { echo 2 exit 0 } [ "$var" != "2" -a "$var" != "1" ] && { echo error exit 0 } 采用read方法 [root@test01 ~]# sh test5.sh Pls input two num:-1 Pls input two num again. [root@test01 ~]# sh test5.sh Pls input two num:1 2 1 < 2 [root@test01 ~]# sh test5.sh Pls input two num:3 1 3 > 1 [root@test01 ~]# sh test5.sh Pls input two num:-1 -3 -1 > -3 [root@test01 ~]# sh test5.sh Pls input two num: 0 2 0 < 2 [root@test01 ~]# sh test5.sh Pls input two num:0 0 0 = 0 0 [root@test01 ~]# cat test5.sh #!/bin/sh read -p "Pls input two num:" a b #no1 [ -z "$a" ] || [ -z "$b" ] && { echo "Pls input two num again." exit 1 } #no2 expr $a + 10 &>/dev/null 整数判断 RETVAL1=$? expr $a + 10 &>/dev/null 整数判断 RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 || { echo "Pls input two 'num' again." exit 2 } #no3 [ $a -lt $b ] && { echo "$a < $b" exit 0 } #no4 [ $a -eq $b ] && { echo "$a = $b" echo 0 } #no5 [ $a -gt $b ] && { echo "$a > $b" } 菜单安装选项 [root@test01 ~]# sh test6.sh 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you want: 3 bye. [root@test01 ~]# sh test6.sh 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you want: 1 start installing lamp. /server/scripts/lamp.s does not exist or can not be exec. [root@test01 ~]# sh test6.sh 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you want: 2 start installing LNMP. /server/scripts/lnmp.sh does not exist or can not be exec. [root@test01 ~]# cat test6.sh #!/bin/sh path=/server/scripts [ ! -d "$path" ] && mkdir $path -p #menu cat <<END 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you want: END read num #接收用户选择的数字 expr $num + 1 &>/dev/null #判断是否为整数 [ $? -ne 0 ] && { #根据返回值进行判断 echo "the num you input must be {1|2|3}" exit 1 } [ $num -eq 1 ] && { echo "start installing lamp." sleep 2. [ -x "$path/lamp.sh" ] ||{ echo "$path/lamp.s does not exist or can not be exec." exit 1 } $path/lamp.sh #source $path/lamp.sh exit $? } [ $num -eq 2 ] && { echo "start installing LNMP." sleep 2; [ -x "$path/lnmp.sh" ] ||{ echo "$path/lnmp.sh does not exist or can not be exec." exit 1 } $path/lnmp.sh #source $path/lnmp.sh exit $? } [ $num -eq 3 ] && { echo bye. exit 3 } 不同符合测试表达式[] [[]] (()) test的区别 测试表达式符合 [] test [[]] (()) 边界是否需要空格 需要 需要 需要 不需要 逻辑操作符 !、-a、-o !、-a、-o !、&&、|| !、&&、|| 整数比较操作符 -eq、-gt、-lt、 -eq、-gt、-lt -eq、-gt、-lt = > < >= <= -ge、-le 、-ge、-le 、-ge、-le或 = > < >= <= 字符串比较符 =、==、!= =、==、!= =、==、!= =、==、!= 是否支持通配符 不支持 不支持 支持 不支持
if条件语句 if 条件表达式 then 指令集1 fi if 条件表达式 then 指令集1 else 指令集2 fi if 条件表达式 then 指令集1 elif 条件表达式 then 指令集 elif 条件表达式 then 指令集 else 指令集2 fi 服务器本地监控端口命令netstat、ss、lsof ~]# netstat -lntup | grep mysql #检测服务是否正常 ~]# netstat -lnt|grep 22|awk -F "[ :]+" '{print $5}' #根据具体的列取值判断方法 [root@test01 ~]# netstat -ntplu |grep 22|wc -l 2 [root@test01 ~]# netstat -ntplu |grep 22 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6505/sshd tcp6 0 0 :::22 :::* LISTEN 6505/sshd [root@test01 ~]# ss -ntplu |grep 22 tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=6505,fd=3)) tcp LISTEN 0 128 :::22 :::* users:(("sshd",pid=6505,fd=4)) 利用lsof检查tcp协议的22端口 [root@test01 ~]# lsof -i tcp:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 6505 root 3u IPv4 44583 0t0 TCP *:ssh (LISTEN) sshd 6505 root 4u IPv6 44594 0t0 TCP *:ssh (LISTEN) sshd 9833 root 3u IPv4 116052 0t0 TCP test01:ssh->192.168.113.1:58396 (ESTABLISHED) [root@test01 ~]# lsof -i tcp:22 |wc -l 4 从远端监控服务器监控本地端口的命令有telnet、nmap、nc [root@test01 ~]# nmap 127.0.0.1 -p 22 Starting Nmap 6.40 ( http://nmap.org ) at 2022-08-19 16:59 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.000055s latency). PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds [root@test01 ~]# nmap 127.0.0.1 -p 22 |grep open |wc -l 1 [root@test01 ~]# echo -e "\n"|telnet 127.0.0.1 22 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Connection closed by foreign host. [root@test01 ~]# echo -e "\n"|telnet 127.0.0.1 22 2>/dev/null |grep Connection|wc -l 0 ~]# nc -w 127.0.0.1 22 &>/dev/null 客户端模拟用户访问方式进行监控 ~]# wget --spider --timeout=10 --tries=2 www.baidu.com Spider mode enabled. Check if remote file exists. --2022-08-19 17:06:36-- http://www.baidu.com/ Resolving www.baidu.com (www.baidu.com)... 36.152.44.96, 36.152.44.95 Connecting to www.baidu.com (www.baidu.com)|36.152.44.96|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 2381 (2.3K) [text/html] Remote file exists and could contain further links, but recursion is disabled -- not retrieving. 在wget后加url的检测方法, &>/dev/null 表示不输出,只看返回值。--spider的意思是模拟爬取,--timeout=10的意思是10秒超时,--tries=2表示如果不成功,则重试2次 [root@test01 ~]# echo $? #查看返回值,0为成功。 0 [root@test01 ~]# wget -T 10 -q --spider http://www.baidu.com >&/dev/null #用法和同一个方法一样,-q表示安静的。 [root@test01 ~]# echo $? 0 [root@test01 ~]# cat mysqlm1.sh #!/bin/sh echo method1------------------------------------ if [ `netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'` -eq 3306 ];then echo "Mysql is Running." else echo "Mysql is Stopped." /etc/init.d/mysqld start fi [root@test01 ~]# cat mysqlm2.sh #!/bin/sh echo method2------------------------- if [ "`netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'`" = "3306" ];then echo "mysql is Running ." else echo "mysql is stopping." /etc/init.d/mysqld start fi [root@test01 ~]# cat mysqlm3.sh #!/bin/sh echo method3------------- if [ `netstat -lntup |grep mysqld|wc -l` -gt 0 ];then echo "Mysql is Running" else echo "Mysql is Stopped." /etc/init.d/mysqld start fi [root@test01 ~]# cat mysqlm4.sh #!/bin/sh echo method4-------------- if [ `lsof -i tcp:3306|wc -l` -gt 0 ];then echo "Mysql is running." else echo "Mysql is stopped." /etc/init.d/mysqld start fi [root@test01 ~]# cat mysqlm5.sh #!/bin/sh echo method5----------------- [ `rpm -qa nmap|wc-l` -lt 1 ] && yum install nmap -y &>/dev/null if [ `nmap 127.0.0.1 -p 3306 2>/dev/null| grep open |wc -l` -gt 0 ] then echo "Mysql is running." else echo "Mysql is stopped" /etc/init.d/mysqld start fi [root@test01 ~]# cat mysqlm6.sh #!/bin/sh echo method6------------------------ [ `rpm -qa nc|wc -l` -lt 1 ] && yum install nc -y &>/dev/null if [ `nc -w 2 127.0.0.1 3306 &>/dev/null && echo ok | grep ok |wc -l` -gt 0 ] then echo "Mysql is Running." else echo "Mysql is Stopped." fi [root@test01 ~]# cat mysqlm7.sh #!/bin/sh echo method7------------------------- if [ `ps -ef|grep -v grep|grep mysql|wc -l` -gt 0 ] then echo "Mysql is running." else echo "Mysql is stopped." /etc/init.d/mysqld start fi 采取监控端口的方式 # netstat -lnt |grep -w 22 |awk -F "[ :]+" '{print $5}' 22 * [root@test01 ~]# netstat -ntplu|grep ssh |grep -v "tcp6" tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6505/sshd [root@test01 ~]# netstat -ntplu|grep ssh |grep -v "tcp6"|wc -l 1 [root@test01 ~]# lsof -i tcp:22 |wc -l [root@test01 ~]# ss -ntplu |grep sshd|wc -l 2 在远端监控服务器本地端口的命令有telnet nmap nc [root@test01 ~]# nmap 127.0.0.1 -p 22 Starting Nmap 6.40 ( http://nmap.org ) at 2022-08-22 09:31 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.000068s latency). PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds [root@test01 ~]# nmap 127.0.0.1 -p 22 |grep open|wc -l 1 [root@test01 ~]# echo -e "\n"|telnet 127.0.0.1 22 2>/dev/null |grep Collected|wc -l 0 [root@test01 ~]# nc Ncat: You must specify a host to connect to. QUITTING. [root@test01 ~]# nc -w 2 127.0.0.1 22 &>/dev/null ^C [root@test01 ~]# echo $? 130 对服务进程或进程数进行监控方式(适合本地服务器) [root@test01 ~]# ps -ef|grep nginx|grep -v grep|wc -l 0 [root@test01 ~]# ps -C sshd --no-header 6505 ? 00:00:00 sshd 9833 ? 00:00:01 sshd 10552 ? 00:00:00 sshd [root@test01 ~]# ps -C nginx --no-header |wc -l 0 在客户端模拟用户访问的监控方式。先通过wget或curl命令进行测试。执行wget或curl命令之后,再看返回值$?,为0 则成功。 [root@test01 ~]# wget --spider --timeout=10 --tries=2 http://127.0.0.1 &>/dev/null [root@test01 ~]# echo $? 4 [root@test01 ~]# wget -T 10 -q --spider http://127.0.0.1 &>/dev/null [root@test01 ~]# echo $? 4 [root@test01 ~]# curl -s -o /dev/null http://127.0.0.1 [root@test01 ~]# echo $? 7 以下是获取字符串的方式(判断获取字符串是否和事先设定的相等) [root@test01 ~]# curl http://www.baidu.com 以下是根据HTTP相应header的结果进行判断(200 301 302都表示正常) [root@test01 ~]# curl -I -s -w "%{http_code}\n" -o /dev/null http://www.baidu.com 200 监控nginx web服务脚本 [root@test01 ~]# cat ng1.sh #!/bin/sh #1 echo http method1---------------- if [ `netstat -lnt|grep 80 |awk -F"[ :]+" '{print $5}'` -eq 80 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #2 echo http method2--------------------- if [ "`netstat -lnt|grep 80|awk -F "[ :]+" '{print $5}'`" = "80" ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #3 echo http method3------------------- if [ `netstat -lntpu|grep nginx|wc -l` -gt 0 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #4 echo http method4--------------------------- if [ `lsof -i tcp:80|wc -l` -gt 0 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #5 echo http method5------------------------ [ `rpm -qa nmap |wc -l` -lt 1 ] && yum install nmap -y &>/dev/null if [ `nmap 127.0.0.1 -p 80 2>/dev/null|grep open|wc -l` -gt 0 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #6 echo http method6----------------------- [ `rpm -qa nc|wc -l` -lt 1 ] && yum install nmap -y &>/dev/null if [ `nc -w 127.0.0.1 80 &>/dev/null&&echo ok|grep ok|wc -l` -gt 0 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #7 echo http method7-------------------- if [ `ps -ef|grep -v grep|grep nginx|wc -l` -ge 1 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #8 echo http method8--------------------- if [[ `curl -I -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1` =~[23]0[012] ]] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #9 echo http method9--------------------- if [ `curl -I http://127.0.0.1 2>/dev/null|head -l|egrep "200|302|301"|wc -l` -eq 1 ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi #10 echo http method10-------------------- if [ "`curl -s http://127.0.0.1`" = "oldboy" ] then echo "Nginx is running." else echo "Nginx is stopped." /etc/init.d/nginx start fi 计算 [root@test01 ~]# sh testif1.sh 3 2 3>2 [root@test01 ~]# sh testif1.sh 1 2 1<2 [root@test01 ~]# sh testif1.sh 2 2 2=2 [root@test01 ~]# cat testif1.sh #!/bin/sh a=$1 b=$2 #no.1 if [ $# -ne 2 ];then echo "USAGE:$0 arg1 arg2" exit 2 fi #no.2 expr $a + 1 &>/dev/null RETVAL1=$? expr $b + 1 &>/dev/null RETVAL2=$? if [ $RETVAL1 -ne 0 -a $RETVAL2 -ne 0 ];then echo "please input two int again." exit 3 fi #3 if [ $a -lt $b ];then echo "$a<$b" elif [ $a -eq $b ];then echo "$a=$b" else echo "$a>$b" fi 计算2 [root@test01 ~]# sh testif3.sh Pls input two num:2 1 2>1 [root@test01 ~]# sh testif3.sh Pls input two num:0 0 Pls input two num again. [root@test01 ~]# sh testif3.sh Pls input two num:1 0 Pls input two num again. [root@test01 ~]# sh testif3.sh 2 3 Pls input two num:1 Pls input two num again. [root@test01 ~]# sh testif3.sh Pls input two num:2 3 2<3 [root@test01 ~]# cat testif3.sh #!/bin/sh read -p "Pls input two num:" a b #no2 expr $a + 0 &>/dev/null RETVAL1=$? expr $b + 0 &>/dev/null RETVAL2=$? if [ -z "$a" ] || [ -z "$b" ] then echo "Pls input two num again." exit 1 elif test $RETVAL1 -ne 0 -o $RETVAL2 -ne 0 then echo "Pls input two "num" again." exit 2 elif [ $a -lt $b ] then echo "$a<$b" elif [ $a -eq $b ] then echo "$a=$b" else echo "$a>$b" fi 判断字符串是否为数字的多种思路 1,使用sed加正则表达式 [root@test01 ~]# [ -n "`echo helloxiaoming|sed 's/[0-9]//g'`" ] && echo char || echo int char [root@test01 ~]# [ -n "`echo 123|sed 's/[0-9]//g'`" ] && echo car || echo int int [root@test01 ~]# [root@test01 ~]# [ -z "`echo 123|sed 's/[0-9]//g'`" ] && echo int || echo char int [root@test01 ~]# [ -z "`echo xiaoming123|sed 's/[0-9]//g'`" ] && echo int || echo char char 使用变量子串替换方法 [root@test01 ~]# num=xiaoming123 [root@test01 ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo int || echo char char [root@test01 ~]# echo "${num//[0-9]/}" xiaoming [root@test01 ~]# num=123 [root@test01 ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo int || echo char int [root@test01 ~]# echo "${num//[0-9/]}" 123 变量子串加正则表达式 -n "$sum" #如果sum长度不为0,则表达式成立。 "$sum" = "${num//[^0-9]/}" #把sum中的非数字部分删除(即把字母删除),然后看结果是不是等于num本身,如果两者都成立,就是数字。 ps1:对于非数字xiaoming123,删除xiaoming,就是123了,肯定不等于xiaoming123 ps2: 如果是数字123,删除非数字部分,结果还是123,肯定等于123 [root@test01 ~]# num=123 [root@test01 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num" it is num [root@test01 ~]# num=xiaoming123 [root@test01 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num" [root@test01 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num" || echo char char 通过expr计算判断 [root@test01 ~]# expr xiaoming + 1 &>/dev/null [root@test01 ~]# echo $? 2 [root@test01 ~]# expr 123 + 1 &>/dev/null [root@test01 ~]# echo $? 0 [root@test01 ~]# expr 0 + 0 &>/dev/null [root@test01 ~]# echo $? 1 利用"=~"符合判断 [root@test01 ~]# [[ xiaoming123 =~ ^[0-9]+$ ]] && echo int || echo char char [root@test01 ~]# [[ xiaoming123 =~ [^0-9]+$ ]] && echo int || echo char char [root@test01 ~]# [[ 123 =~ ^[0-9]+$ ]] && echo int || echo char int 利用bc判断字符串为整数(有bug不推荐) [root@test01 ~]# echo xiaom|bc 0 [root@test01 ~]# echo 123|bc 123 [root@test01 ~]# echo xiaom123|bc 0 [root@test01 ~]# echo 123xiaom|bc (standard_in) 1: syntax error 判断字符串长度是不是为0的多种方法 使用字符串表达式-z和-n的语法 [root@test01 ~]# [ -z "xiaoming" ] && echo 1 || echo 0 0 [root@test01 ~]# [ -n "xiaoming" ] && echo 1 || echo 0 1 使用变量子串判断的语法(通过在变量名前加#,就可以打印变量值的长度) [root@test01 ~]# char=xiaoming [root@test01 ~]# [ ${#char} -eq 0 ] && echo 1 || echo 0 0 使用expr length函数判断的语法 [root@test01 ~]# [ `expr length "xiaoming"` -eq 0 ] && echo 1 || echo 0 0 [root@test01 ~]# expr length "xiaoming" 8 使用wc的-L参数统计的语法 [root@test01 ~]# [ `echo xiaoming|wc -L` -eq 0 ] && echo 1 || echo 0 0 [root@test01 ~]# echo "xiaoming"|wc -L 8 使用awk length函数判断的语法 [root@test01 ~]# [ `echo xiaoming|awk '{print length}'` -eq 0 ] && echo 1 || echo 0 0 监控memcached服务是否正常,模拟用户(web客户端)检测 [root@test01 ~]# cat memcached1.sh #!/bin/sh printf "del key\r\n"|nc 127.0.0.1 11211 &>/dev/null printf "set key 0 0 10 \r\nxiaoming\r\n"|nc 127.0.0.1 11211 &>/dev/null McValues=`printf "get key\r\n"||nc 127.0.0.1 11211|grep xiaoming123|wc -l` if [ $McValues -eq 1 ];then echo "memcached status is ok" else echo "memcached status is bad" fi 开发rsync服务的启动脚本 [root@test01 ~]# rpm -qa rsync rsync-3.1.2-10.el7.x86_64 [root@test01 ~]# vim /etc/rsyncd.conf [root@test01 ~]# rsync --daemon 启动rsync服务命令 [root@test01 ~]# netstat -lnt|grep 873 过滤873端口 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN tcp6 0 0 :::873 :::* LISTEN [root@test01 ~]# pkill rsync #停止方法 [root@test01 ~]# netstat -lnt|grep 873 [root@test01 ~]# rsync --daemon #启动方法 [root@test01 ~]# netstat -lnt|grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN tcp6 0 0 :::873 :::* LISTEN [root@test01 ~]# 脚本 [root@test01 ~]# cat /etc/init.d/rsyncd #!/bin/sh if [ $# -ne 1 ] then echo $"usage:$0 {start|stop|restart}" exit 1 fi if [ "$1" = "start" ] then rsync --daemon sleep 2 if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ] then echo "rsyncd is started." exit 0 fi elif [ "$1" = "stop" ] then killall rsync &>/dev/null sleep 2 if [ `netstat -ntplu|grep rsync|wc -l` -eq 0 ] then echo "rsyncd is stopped." exit 0 fi elif [ "$1" = "restart" ] then killall rsync sleep 1 killpro=`netstat -ntplu|grep rsync|wc -l` rsync --daemon sleep 1 startpro=`netstat -ntplu|grep rsync|wc -l` if [ $killpro -eq 0 -a $startpro -ge 1 ] then echo "rsyncd is restarted." exit 0 fi else echo $"usage:$0 {start|stop|restart}" exit 1 fi 使用chkconfig来管理开机自启动。 表示脚本在2345级别为启动状态,20是脚本的开始启动顺序,80是脚本的停止顺序,这两个数字不超过99的数字 [root@test01 ~]# chkconfig --list rsyncd Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'. service rsyncd does not support chkconfig [root@test01 ~]# chkconfig --add rsyncd service rsyncd does not support chkconfig [root@test01 ~]# chkconfig --list rsyncd 函数的常见语法格式 function 函数名(){ 指令。。 return n } 简写: function 函数名{ 指令。。 return n } 简写2: 函数名(){ 指令。。 return n } $0比较特殊,它仍然是父脚本的名称 [root@test01 ~]# cat f1.sh #!/bin/sh xiaoming () { echo "xiaoming is a boy." } function xiaoli(){ echo "xiaoli is a girl" } xiaoming xiaoli [root@test01 ~]# sh f1.sh xiaoming is a boy. xiaoli is a girl [root@test01 ~]# sh f2.sh sh: f2.sh: No such file or directory [root@test01 ~]# vim f2.sh [root@test01 ~]# sh f2.sh f2.sh: line 2: xiaoli: command not found xiaoli is a grirl [root@test01 ~]# cat f2.sh #!/bin/sh xiaoli function xiaoli(){ echo "xiaoli is a grirl" } xiaoli [root@test01 ~]# cat >>/etc/init.d/functions <<- EOF > xiaoming(){ > echo "xiaoming is a boy" > } > EOF [root@test01 ~]# [root@test01 ~]# tail -3 /etc/init.d/functions xiaoming(){ echo "xiaoming is a boy" } [root@test01 ~]# cat f3.sh #!/bin/sh [ -f /etc/init.d/functions ] && . /etc/init.d/functions ||exit 1 xiaoming URL检测脚本 [root@test01 ~]# [root@test01 ~]# sh f4_1.sh usage:f4_1.sh url [root@test01 ~]# sh f4_1.sh www.baidu.com www.baidu.com is yes [root@test01 ~]# cat f4_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 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结尾的$*传到这里 } main $* #这里的$*就是把命令行接收的所有参数作为函数参数传给函数内部,是一种常用的手法。 [root@test01 ~]# cat f4 f4_1.sh f4.sh [root@test01 ~]# cat f4.sh #!/bin/sh if [ $# -ne 1 ] then echo $"usage:$0 url" exit 1 fi wget --spider -q -o /dev/null --tries=1 -T 5 $1 if [ $? -eq 0 ] then echo "$1 is yes." else echo "$1 is no." fi 显示高亮 [root@test01 ~]# cat f5.sh #!/bin/sh . /etc/init.d/functions function usage(){ echo $"usage:$0 url" exit 1 } function check_url(){ wget --spider -q -o /dev/null --tries=1 -T 5 $1 if [ $? -eq 0 ];then action "$1 is yes." /bin/true else action "$1 is no." /bin/false fi } function main(){ if [ $# -ne 1 ];then usage fi check_url $1 } main $* [root@test01 ~]# sh f5.sh 11 11 is no. [FAILED] [root@test01 ~]# sh f5.sh www.baidu.com www.baidu.com is yes. [ OK ]
开发linux系统优化脚本 0,更改yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup &&\ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyum.com/repo/Centos7.repo 1,关闭SELinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config grep SELINUX=disabled /etc/selinux/config setenforce 0 getenforce 2,关闭iptables chkconfig --list iptables /etc/init.d/iptables stop chkconfig iptables off 3,精简开机自启动服务 chkconfig |awk '{print "chkconfig",$1,"off"}'|bash chkconfig|egrep "crond|sshd|network|rsyslog|sysstat"|awk '{print "chkconfig",$1,"on"}'|bash export LANG=en chkconfig --list|grep 3:on 4,提取xiaoming可以sudo useradd xiaoming echo 123456|passwd --stdin xiaoming \cp /etc/sudoers /etc/sudoers.ori echo "xiaoming ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers tail -1 /etc/sudoers visudo -c 5, 中文字符集 6,时间同步 echo "#time sync by xiaoming at 2022" >>/var/spool/cron/root echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2&>1' >>/var/spool/cron/root crontab -l 7,命令行安全 8,加大文件描述 echo '* - nofile 65535' >>/etc/security/limits.conf tail -1 /etc/security/limits.conf 9, 内核优化 net.ipv4 [root@test01 ~]# cat /etc/init.d/rsyncd1 #!/bin/sh #chkconfig 2345 20 80 #description : Rsyncd startup scripts by xiaoming . /etc/init.d/functions function usage(){ echo $"usage:$0 {start|stop|restart}" exit 1 } function start(){ rsync --daemon sleep 1 if [ `netstat -ntplu|grep rsync|wc -l` -eq 1 ];then action "rsyncd is started." /bin/true else action "rsyncd is stopped." /bin/false fi } function stop(){ killall rsync &>/dev/null sleep 2 if [ `nestat -ntplu|grep rsync|wc -l` -eq 0 ];then action "rsyncd is stopped." /bin/false else action "rsyncd is started." /bin/true fi } function main(){ if [ $# -ne 1 ];then usage fi if [ "$1" = "start" ];then start elif [ "$1" = "stop" ] then stp elif [ "$1" = "restart" ] then stop sleep 1 stop else usage fi } main $* case条件语句 相当于if elif else条件语句,看起来更规范工整 case "变量" in 值1) 指令1。。。 ;; 值2) 指令2。。。 ;; *) 指令3。。。 ;; esac 使用case判断:根据用户输入判断是哪个数字 [root@test01 ~]# sh c1.sh Please input a number:1 The num you inputis 1 [root@test01 ~]# sh c1.sh Please input a number:4 The num you inputis 4 [root@test01 ~]# cat c1.sh #!/bin/sh # read -p "Please input a number:" ans case "$ans" in 1) echo "The num you inputis 1" ;; 2) echo "The num you inputis 2" ;; [3-9]) echo "The num you inputis $ans" ;; *) echo "Please input [1-9] int" exit; ;; esac 当用户输入数字选择对应的水果 [root@test01 ~]# cat plush_color.sh #!/bin/sh RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1;33m' BLUE_COLOR='\E[1;34m' RES='\E[0m' #echo -e "$RED_COLOR xiaoming $RES" #echo -e "$YELLOW_COLOR xiaoming $RES" echo ' ############################### 1, apple 2, pear 3, banana 4, cherry ############################## ' read -p "Pls select a num:" num case "$num" in 1) echo -e "${RED_COLOR}apple${RES}" ;; 2) echo -e "${GREEN_COLOR}apple${RES}" ;; 3) echo -e "${YELLOW_COLOR}apple${RES}" ;; 4) echo -e "${BLUE_COLOR}apple${RES}" ;; *) echo -e "muse be (1|2|3|4)" ;; esac [root@test01 ~]# sh plush_color.sh ############################### 1, apple 2, pear 3, banana 4, cherry ############################## Pls select a num:1 apple [root@test01 ~]# sh plush_color.sh ############################### 1, apple 2, pear 3, banana 4, cherry ############################## Pls select a num:2 apple 菜单安装选项 [root@test01 ~]# sh plush_color.sh 1.apple 2.peer 3.banana Pls select a num:1 apple [root@test01 ~]# sh plush_color.sh 1.apple 2.peer 3.banana Pls select a num:2 pear [root@test01 ~]# sh plush_color.sh 1.apple 2.peer 3.banana Pls select a num:3 banana [root@test01 ~]# sh plush_color.sh 1.apple 2.peer 3.banana Pls select a num: USAGE: plush_color.sh {1|2|3|4} [root@test01 ~]# cat plush_color.sh #!/bin/sh RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1;33m' BLUE_COLOR='\E[1;34m' RES='\E[0m' #echo -e "$RED_COLOR xiaoming $RES" #echo -e "$YELLOW_COLOR xiaoming $RES" #echo ' # ############################### # 1, apple # 2, pear # 3, banana # 4, cherry # ############################## #' function usage(){ echo "USAGE: $0 {1|2|3|4}" exit 1 } function menu(){ cat <<END 1.apple 2.peer 3.banana END } function chose(){ read -p "Pls select a num:" fruit case "$fruit" in 1) echo -e "${RED_COLOR}apple${RES}" ;; 2) echo -e "${GREEN_COLOR}pear${RES}" ;; 3) echo -e "${YELLOW_COLOR}banana${RES}" ;; # 4) # echo -e "${BLUE_COLOR}apple${RES}" # ;; *) # echo -e "muse be (1|2|3|4)" usage ;; esac } function main(){ menu chose } main 给输出的字符串加颜色 [root@test01 ~]# [root@test01 ~]# echo -e "\033[30m 黑色字体 xiaoming \033[0m" 黑色字体 xiaoming [root@test01 ~]# echo -e "\033[31m 红色字体 xiaoming \033[0m" 红色字体 xiaoming [root@test01 ~]# echo -e "\033[32m 绿色字体 xiaoming \033[0m" 绿色字体 xiaoming [root@test01 ~]# echo -e "\033[33m 棕色字体 xiaoming \033[0m" 棕色字体 xiaoming [root@test01 ~]# echo -e "\033[34m 蓝色字体 xiaoming \033[0m" 蓝色字体 xiaoming [root@test01 ~]# echo -e "\033[35m 洋红色字体 xiaoming \033[0m" 洋红色字体 xiaoming [root@test01 ~]# echo -e "\033[36m 蓝绿色字体 xiaoming \033[0m" 蓝绿色字体 xiaoming [root@test01 ~]# echo -e "\033[37m 白色字体 xiaoming \033[0m" 白色字体 xiaoming 通过定义变量的方式给字体加颜色(推荐) [root@test01 ~]# sh plush_color2.sh ======read color======== ====green color======= ====yellow color===== ======blue color======= ============pink color======= [root@test01 ~]# cat plush_color2.sh #!/bin/sh RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1;33m' BLUE_COLOR='\E[1;34m' PINK='\E[1;35m' RES='\E[0m' echo -e "${RED_COLOR}======read color========${RES}" echo -e "${GREEN_COLOR}====green color=======${RES}" echo -e "${YELLOW_COLOR}====yellow color=====${RES}" echo -e "${BLUE_COLOR}======blue color=======${RES}" echo -e "${PINK}============pink color=======${RES}" 结合case语句给输出的字符串加颜色 [root@test01 ~]# sh plush_color3.sh I am xiaoming [root@test01 ~]# vim plush_color3.sh [root@test01 ~]# cat plush_color3.sh #!/bin/sh plus_color(){ RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1;33m' BLUE_COLOR='\E[1;34m' PINK='\E[1;35m' RES='\E[0m' if [ $# -ne 2 ];then echo "Usage $0 content {red|yellow|blue|green|pink}" exit 0 fi case "$2" in red|RED) echo -e "${RED_COLOR}$1${RES}" ;; yellow|YELLOW) echo -e "${YELLOW_COLOR}$1${RES}" ;; green|GREEN) echo -e "${GREEN_COLOR}$1${RES}" ;; blue|BLUE) echo -e "${BLUE_COLOR}$1${RES}" ;; pink|PINK) echo -e "${PINK}$1${RES}" ;; *) echo "Usage $0 content {red|yellow|blue|green|pink}" exit esac } plus_color "I" red plus_color "am" green plus_color "xiaoming" blue #!/bin/sh function AddColor(){ RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1;33m' BLUE_COLOR='\E[1;34m' PINK='\E[1;35m' RES='\E[0m' if [ $# -ne 2 ];then echo "Usage $0 content {red|yellow|blue|green|pink}" exit 0 fi case "$2" in red|RED) echo -e "${RED_COLOR}$1${RES}" ;; yellow|YELLOW) echo -e "${YELLOW_COLOR}$1${RES}" ;; green|GREEN) echo -e "${GREEN_COLOR}$1${RES}" ;; blue|BLUE) echo -e "${BLUE_COLOR}$1${RES}" ;; pink|PINK) echo -e "${PINK}$1${RES}" ;; *) echo "Usage $0 content {red|yellow|blue|green|pink}" exit esac } function main(){ AddColor $1 $2 } main $* 给输出的字符串加背景颜色(man console_codes) [root@test01 ~]# [root@test01 ~]# echo -e "\033[40;37m 黑底白字 xiaoming\033[0m" 黑底白字 xiaoming [root@test01 ~]# echo -e "\033[41;37m 红底白字 xiaoming\033[0m" 红底白字 xiaoming [root@test01 ~]# echo -e "\033[42;37m 绿底白字 xiaoming\033[0m" 绿底白字 xiaoming [root@test01 ~]# echo -e "\033[43;37m 棕底白字 xiaoming\033[0m" 棕底白字 xiaoming [root@test01 ~]# echo -e "\033[44;37m 蓝底白字 xiaoming\033[0m" 蓝底白字 xiaoming [root@test01 ~]# echo -e "\033[45;37m 洋红底白字 xiaoming\033[0m" 洋红底白字 xiaoming [root@test01 ~]# echo -e "\033[46;37m 蓝绿底白字 xiaoming\033[0m" 蓝绿底白字 xiaoming [root@test01 ~]# echo -e "\033[47;37m 白底白字 xiaoming\033[0m" 白底白字 xiaoming [root@test01 ~]# echo -e "\033[47;30m 白底黑字 xiaoming\033[0m" 白底黑字 xiaoming [root@test01 ~]# cat add-openvpn-user #!/bin/sh #create #time #source function library . /etc/init.d/functions #config file path FILE_PATH=/etc/openvpn_authfile.conf [ ! -f $FILE_PATH ] && touch $FILE_PATH usage(){ cat <<EOF USAGE: `basename $0` {-add|-del|-search} username EOF } #judge run user if [ $UID -ne 0 ];then echo "you are not supper user,please call root!" exit 1; fi #judge arg bumbers if [ $# -ne 2 ];then #传入的参数必须是2个 usage exit 2 fi #满足条件后进入case语句判断 case "$1" in -a|-add) shift if grep "^$1$" ${FILE_PATH} >/dev/null 2>&1 then action $"vpnuser,$1 is exist" /bin/false exit else chattr -i ${FILE_PATH} /bin/cp ${FILE_PATH} $FILE_PATH.${date +%F%T} echo "$1" >> ${FILE_PATH} [ $? -eq 0 ] && action $"Add $1" /bin/true chattr +i ${FILE_PATH} fi ;; -d|-del) shift if [ `grep "\b$1\b" ${FILE_PATH}|wc -l` -lt 1 ] then action $"vpnuser,$1 is not exist." /bin/false exit else chattr -i ${FILE_PATH} /bin/cp ${FILE_PATH} $FILE_PATH.${date +%F%T} sed -i "/^${1}$d" ${FILE_PATH} [ $? -eq 0 ] && action $"Add $1" /bin/true chattr +i ${FILE_PATH} exit fi ;; -s|-search) shift if [ `grep -w "$1" ${FILE_PATH}|wc -l` -lt 1 ] then echo $"vpnuser,$1 is not exist.";exit else echo $"vpnuser,$1 is exist.";exit fi ;; *) usage exit ;; esac grep精确过滤单词 [root@test01 ~]# grep -w "usage" add-openvpn-user usage(){ [root@test01 ~]# grep "\usage\b" add-openvpn-user [root@test01 ~]# grep "^usage$" add-openvpn-user while循环语句 while <条件表达式> do 指令1。。。 done [root@test01 ~]# while true;do uptime && sleep 2;done 17:24:13 up 9 days, 3:19, 2 users, load average: 0.00, 0.01, 0.05 17:24:15 up 9 days, 3:19, 2 users, load average: 0.00, 0.01, 0.05 17:24:18 up 9 days, 3:19, 2 users, load average: 0.00, 0.01, 0.05 sh w1.sh & 后台执行 bg 把当前任务放在后台执行 fg 把当前任务放在前台执行 jobs 查看当前执行的脚本 kill killall pkill 杀掉进程 ps 查看进程 pstree 显示进程状态树 renice 改变优先权 nohup 用户退出后继续工作 pgrep 查找匹配条件的进程 strace 跟踪一个进程的系统调用情况 ltrace 跟踪进程调用库函数的情况 [root@test01 ~]# cat w2.sh #!/bin/sh i=5 while ((i>0)) do echo "$i" ((i--)) done [root@test01 ~]# sh w2.sh 5 4 3 2 1 [root@test01 ~]# cat w2.sh #!/bin/sh i=5 while [[ $i > 0 ]] do echo "$i" ((i--)) done [root@test01 ~]# cat w2.sh #!/bin/sh i="$1" while [ $i -gt 0 ] do echo $i ((i--)) done [root@test01 ~]# sh w2.sh 5 5 4 3 2 1 [root@test01 ~]# cat w2.sh #!/bin/sh i=5 until [[ $i < 1 ]] do echo $i ((i--)) done [root@test01 ~]# sh w2.sh 5 4 3 2 1 [root@test01 ~]# cat w3.sh #!/bin/sh i=1 sum=0 while ((i<=100)) do ((sum=sum+i)) ((i++)) done [ "$sum" -ne 0 ] && printf "totalsum is: $sum\n" [root@test01 ~]# sh w3.sh totalsum is: 5050 [root@test01 ~]# cat w3.sh #!/bin/sh i=100 ((sum=i*(i+1)/2)) echo $sum [root@test01 ~]# sh w3.sh 5050 [root@test01 ~]# cat w6.sh #!/bin/sh sum=1000 i=15 while ((sum>=i)) do ((sum=sum-i)) [ $sum -lt $i ] && break echo "send message, left $sum" done echo "money is not enough:$sum" [root@test01 ~]# cat w6.sh #!/bin/sh sum=1000 i=15 while ((sum>=i)) do ((sum=sum-i)) [ $sum -lt $i ] && ( echo "send message,left $sum money is not enough" break ) echo "send message,left $sum" done [root@test01 ~]# cat wd1.sh #!/bin/sh file=$1 while true do awk '{print $1}' $1 | grep -v "^$"|sort|uniq -c >/tmp/tmp.log exec </tmp/tmp.log while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` if [ $count -gt 500 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ];then iptables -I INPUT -s $ip -j DROP echo "$line is dropped." >>/tmp/droplist_$(date +%F).log fi done sleep 3600 done for循环语法 for 变量名 in 变量取值列表 do 指令。。。 done # for num in {1..9};do echo $num;done # for i in `seq 5 -1 1`;do echo $i;done # cd /tmp && for filename in `ls`;do echo $filename;done [root@test01 tmp]# echo $filename yum_save_tx.2022-09-01.14-25.BKvcCR.yumtx [root@test01 tmp]# echo $filename |cut -d . -f1 #取出文件名部分(排除扩展名) yum_save_tx wd1.sh wd1 sh word_length.sh word_length sh 批量取值 [root@test01 ~]# ls |awk -F "." '{print $0,$1,$2}' wd1.sh wd1 sh word_length.sh word_length sh 批量修改名 [root@test01 ~]# ls|awk -F "." '{print "mv",$0,$1"_finished."$2}'|bash [root@test01 ~]# ls 1_finished.txt jisuan_finished.sh p_finished.sh 批量改名 [root@test01 ~]# rename "_finished" "" *.sh [root@test01 ~]# ls f3.sh mysqlm2.sh plush_color2.sh [root@test01 ~]# cat for1.sh #!/bin/sh COLOR='\E[47;30m' RES='\E[0m' for num1 in `seq 9` do for num2 in `seq 9` do if [ $num1 -ge $num2 ] then if ((num1*num2>9)) then echo -en "${COLOR}${num1}x${num2}=$((num1*num2))$RES " else echo -en "${COLOR}${num1}x${num2}=$((num1*num2))$RES " fi fi done echo " " done [root@test01 ~]# sh for1.sh 1x1=1 2x1=2 2x2=4 3x1=3 3x2=6 3x3=9 4x1=4 4x2=8 4x3=12 4x4=16 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81 [root@test01 ~]# for ((i=0; i<5; i++));do curl http://www.baidu.com;done >>1.txt % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2381 100 2381 0 0 27291 0 --:--:-- --:--:-- --:--:-- 27367 for循环实现mysql分库备份的脚本 #mysql -uroot -pxiaoming123 -S /data/3306/mysql.sock -e "create database xiaoming;" 批量创建数据库 [root@test01 ~]# cat for2.sh #!/bin/sh PATH="/application/mysql/bin:$PATH" MYUSER=root MYPASS=xiaoming123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" for dbname in xiaoming1 xiaoming2 xiaoming3 do $MYCMD -e "create database $dbname" done 备份每个库文件脚本 [root@test01 ~]# cat for2.sh #!/bin/sh PATH="/application/mysql/bin:$PATH" DBPATH=/server/backup MYUSER=root MYPASS=xiaoming123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" MYDUMP="mysqldump -u$MYUSER -p$MYPASS -sSOCKET" [ ! -d "$DBPATH" ] && mkdir $DBPATH for dbname in `$MYCMD -e "show databases;" |sed '1,2d'|egrep -v "mysql|schema"` do $MYDUMP $dbname|gzip >$DBPATH/${dbname}_$(date +%F).sql.gz done ## mysqldump -uroot -pxiaoming123 -S /data/3306/mysql.sock xiaoming lgzip >/server/backup/xiaoming_$(date +%F).sql.gz ### 批量建表并插入数据 [root@test01 ~]# cat for2.sh #!/bin/sh PATH="/application/mysql/bin:$PATH" MYUSER=root MYPASS=xiaoming123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" for dbname in xiaoming1 xiaoming2 xiaoming3 do $MYCMD -e "use $dbname;create table test(id int,name varchar(16); insert into test values(1,'testdata');)" done 批量查看测试数据结果 [root@test01 ~]# cat for2.sh #!/bin/sh PATH="/application/mysql/bin:$PATH" MYUSER=root MYPASS=xiaoming123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" for dbname in xiaoming1 xiaoming2 xiaoming3 do $MYCMD -e "use $dbname;select * from $(dbname).test;" done
[root@test01 ~]# cat for2.sh #!/bin/sh PATH="/application/mysql/bin:$PATH" DBPATH=/server/backup MYUSER=root MYPASS=xiaoming123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" MYDUMP="mysqldump -u$MYUSER -p$MYPASS -sSOCKET" [ ! -d "$DBPATH" ] && mkdir $DBPATH for dbname in `$MYCMD -e "show databases;" |sed '1,2d'|egrep -v "mysql|schema"` #登录获取所有的数据库名 do mkdir $DBPATH/$(dbname)_$(date +%F) -p #创建对应目录 for table in `$MYCMD -e "show tables from $dbname;"|sed '1d'` #获取每个库里的所有表然后循环 do $MYDUMP $dbname $table |gzip >$DBPATH/${dbname}_$(date +%F)/$(dbname)_${table}.sql.gz done done 批量检查web服务是否正常,并发送相关邮件或手机报警信息 #!/bin/sh path=/server/scripts #定义脚本路径 MAIL_GROUP='111@qq.com 222@qq.com' #邮件列表,以空格隔开 PAGER_GROUP='111 122' #手机列表,以空格隔开 LOG_FILE='/tmp/web_check.log' #日志路径 [ ! -d "$path" ] && mkdir -p $path #创建目录 function UrlList(){ #url列表函数 cat >$path/domain.list<<EOF http://www.11.com http://www.baidu.com EOF } function CheckUrl(){ #检测url的函数 FAILCOUNT=0 #初始化失败的次数为0次 for ((i=1;$i<=3;i++)) #检测3次 do wget -T 5 --tries=1 --spider $1 >/dev/null 2>&1 #具体访问url的命令,不输出信息 if [ $? -ne 0 ] #返回值如果不为0,则表示访问url失败了 then let FAILCOUNT+=1 #将失败的次数+1 else break #如果返回值为0,则表示url成功了,跳出for循环,不做3次检测了 fi done return $FAILCOUNT #将失败次数作为返回值,凤凰函数外的脚本中 } function MAIL(){ #定义邮件函数 local SUBJECT_CONTENT=$1 #将函数的第1个传参赋值给主题变量 for MAIL_USER in `echo $MAIL_GROUP` #遍历邮件列表 do mail -s "$SUBJECT_CONTENT " $MAIL_USER <$LOG_FILE #发邮件 done } function PAGER(){ #定义手机函数 for PAGER_USER in `echo $PAGER_GROUP` #遍历手机列表 do TITLE=$1 #函数的第1个传参赋值给主题变量 CONTACT=$PAGER_USER #手机号赋值给CONTACT变量 HTTPGW=http://www.baidu.com #发短信地址,可以用微信替代 #send message curl -d cdkey=5ADF-EFA -d password=xiaoming -d phone=$CONTACT -d message='$TITLE[$2]' $HTTPGW #发送短信报警。 done } function SendMsg(){ #定义发送消息的函数 if [ $1 -ge 3 ];then #如果失败的次数大于等于3,那么这里的$1是函数的传参,接收访问url失败的次数。 RETVAL=1 NOW_TIME=`date +"%Y-%m-%d %H:%M:%S"` #报警时间 SUBJECT_CONTENT='http://$2 is error,${NOW_TIME}.' #报警主题 echo -e "$SUBJECT_CONTENT" |tee $LOG_FILE #输出信息,并记录到日志 MAIL $SUBJECT_CONTENT #发送报警邮件,$SUBJECT_CONTENT将作为函数参数传给MAIL函数体的$1 PAGER $SUBJECT_CONTENT $NOW_TIME #发送报警邮件,$SUBJECT_CONTENT将作为函数参数传给MAIL函数体的$1,$NOW_TIME作为函数体给$2 else #如果失败的次数不大于3,则认为url是好的 echo "http://$2 is ok" #打印ok RETVAL=0 #以0作为返回值 fi return $RETVAL } function main(){ #定义函数 UrlList #加载url列表 for url in `cat $path/domain.list` #读取url列表 do CheckUrl $url #传入url给检测url的函数进行检查 SendMsg $? $url #传入第1参数$?,即CheckUrl里的返回值(用检测失败的次数作为返回值),传入的第2个参数为检测的url done } main 批量创建用户及密码 [root@test01 ~]# cat p1.sh #!/bin/sh . /etc/init.d/functions user="xiaoming" passfile="/root/user.log" for num in `seq -w 11 15` do pass="`echo "test $RANDOM"|md5sum|cut -c3-11`" useradd $user$num &>/dev/null &&\ echo "$pass"|passwd --stdin $user$num &>/dev/null &&\ echo -e "user:$user$num\tpasswd:$pass" >>$passfile if [ $? -eq 0 ] then action "$user$num is ok" /bin/true else action "$user$num is fail" /bin/false fi done echo -------------------- cat $passfile && >$passfile [root@test01 ~]# sh p1.sh xiaoming11 is ok [ OK ] xiaoming12 is ok [ OK ] xiaoming13 is ok [ OK ] xiaoming14 is ok [ OK ] xiaoming15 is ok [ OK ] -------------------- user:xiaoming11 passwd:6a09827f1 user:xiaoming12 passwd:72a2ec4e0 user:xiaoming13 passwd:37de721c2 user:xiaoming14 passwd:6d2edc2c3 user:xiaoming15 passwd:806f1ad6f 批量删除用户 [root@test01 ~]# for i in `seq 11 15`;do userdel xiaoming$i;done 通过openssl产生的随机数 [root@test01 ~]# openssl rand -base64 8 vbOq7O8cYLo= [root@test01 ~]# openssl rand -base64 80 I+gOFdH2U6asmgcbPwqT1pzoJJIbvCP8a3GpkWlWz+6PoAPhiCm0bK/5c0Ut1P22 /SUeL4LWFNb81m+2D6eEsiPXXSlKyJMjcdvXOLaTYmY= 通过date获得的随机数 [root@test01 ~]# date +%s%N 1663209984094487150 [root@test01 ~]# date +%s%N 1663210021560285280 通过获得的随机数 [root@test01 ~]# head /dev/urandom |cksum 2933324643 2509 [root@test01 ~]# head /dev/urandom |cksum 294941461 2490 通过UUID获得的随机数 [root@test01 ~]# cat /proc/sys/kernel/random/uuid 9c1c6461-6238-4358-9c43-b3edbccf45c0 使用expect附带的mkpasswd生成随机数 通过读取txt文件的文件名,批量创建用户及密码 [root@test01 ~]# cat p1.sh #!/bin/sh . /etc/init.d/functions user="/root/ps1.txt" passfile="/root/user.log" for num in `cat $user` do pass="`echo "test $RANDOM"|md5sum|cut -c3-11`" useradd $num &>/dev/null &&\ echo "$pass"|passwd --stdin $num &>/dev/null &&\ echo -e "user:$num\tpasswd:$pass" >>$passfile if [ $? -eq 0 ] then action "$num is ok" /bin/true else action "$num is fail" /bin/false fi done echo -------------------- cat $passfile && >$passfile [root@test01 ~]# cat ps1.txt xiaoming xiaoli xiaogang xiaohong 执行脚本 [root@test01 ~]# sh p1.sh xiaoming is ok [ OK ] xiaoli is ok [ OK ] xiaogang is ok [ OK ] xiaohong is ok [ OK ] -------------------- user:xiaoming passwd:ba0c17690 user:xiaoli passwd:9bbb0eafd user:xiaogang passwd:3c22129e8 user:xiaohong passwd:0de2cbfe6 批量删除用户 [root@test01 ~]# for i in `cat ps1.txt`;do userdel $i;done select循环语句 select 变量名 [ in 菜单取值列表 ] do 指令。。。 done #select name [in word];do list;done 在此结构中"in 变量取值列表" 可省略,省略时相当于使用in "$@",使用for i就相当于使用for i in "$@" [root@test01 ~]# select name in xiaoming xiaoli xiaohong;do echo $name;done 1) xiaoming 2) xiaoli 3) xiaohong #? 1 xiaoming #? 2 xiaoli #? 3 xiaohong #? test #输入错误则返回空 # select name in `ls /root`;do echo $name;done 循环控制和状态返回值的应用 break n 如果省略n,则表示跳出整个循环,n 表示跳出循环的层数 continue n 如果省略你,则表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环。n 表示退到第n层继续循环 exit n 退出当前shell程序,n为上一次程序执行的状态返回值。在下一个shell里可以通过$?接收exit n 的n值 return n 用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个shell里可以通过$?接收return n的n值 route add -net 10.176.8.0 netmask 255.255.255.0 gw 10.176.8.247 [root@test01 ~]# cat b1.sh #!/bin/sh if [ $# -ne 1 ];then echo $"usage:$0 {break|continue|exit|return}" exit 1 fi test(){ for ((i=0; i<=5; i++)) do if [ $i -eq 3 ];then $*; #接收函数外的参数,就是{break|continue|exit|return}其中的一个 fi echo $i done echo "I am in func." } test $* #为函数的传参 func_ret=$? #接收并测试函数的返回值 if [ `echo $*|grep return|wc -l` -eq 1 ];then echo "return's exit status:$func_ret" fi echo "OK" [root@test01 ~]# sh b1.sh usage:b1.sh {break|continue|exit|return} [root@test01 ~]# sh b1.sh break 0 1 2 I am in func. OK [root@test01 ~]# sh b1.sh continue 0 1 2 4 5 I am in func. OK [root@test01 ~]# sh b1.sh exit 0 1 2 [root@test01 ~]# sh b1.sh return 0 1 2 return's exit status:0 OK shell数组 语法 array=(value1 value2 value3 ...) [root@test01 ~]# array=(1 2 3) #用小括号将数组内容赋值给数组变量,数组元素用空格分隔开。 [root@test01 ~]# echo $array 1 [root@test01 ~]# echo $array[*] 1[*] [root@test01 ~]# echo ${array[*]} #输出上面定义的数组的所有元素值,注意语法;使用*或@ky 得到整改数组的内容 1 2 3 方法2用小括号将变量值括起来,同时采用键值对的形式赋值 [root@test01 ~]# array=([1]=one [2]=two [3]=three) [root@test01 ~]# echo ${array[*]} one two three [root@test01 ~]# echo ${array[1]} one [root@test01 ~]# echo ${array[2]} two [root@test01 ~]# echo ${array[3]} three 方法3 [root@test01 ~]# array[0]=a;array[1]=b;array[2]=c [root@test01 ~]# echo ${array[0]} a [root@test01 ~]# echo ${array[2]} c 方法4 [root@test01 ~]# mkdir array -p [root@test01 ~]# touch array/{1..3}.txt [root@test01 ~]# ls -l array/ total 0 -rw-r--r-- 1 root root 0 Sep 19 10:10 1.txt -rw-r--r-- 1 root root 0 Sep 19 10:10 2.txt -rw-r--r-- 1 root root 0 Sep 19 10:10 3.txt [root@test01 ~]# array=($(ls array)) [root@test01 ~]# echo ${array[*]} #使用*或@ky 得到整改数组的内容 1.txt 2.txt 3.txt [root@test01 ~]# echo ${array[@]} #使用*或@ky 得到整改数组的内容 1.txt 2.txt 3.txt [root@test01 ~]# echo ${array[0]} 1.txt [root@test01 ~]# echo ${array[1]} 2.txt [root@test01 ~]# echo ${array[2]} 3.txt 数组的删除 unset 数组[下标] unset array[1] [root@test01 ~]# unset array[1] [root@test01 ~]# echo ${array[*]} 1.txt 3.txt [root@test01 ~]# ll array/ #并没有删除2.txt,只是删除了数组的元素 total 0 -rw-r--r-- 1 root root 0 Sep 19 10:10 1.txt -rw-r--r-- 1 root root 0 Sep 19 10:10 2.txt -rw-r--r-- 1 root root 0 Sep 19 10:10 3.txt 数组的添加 [root@test01 ~]# array[1]=5.txt [root@test01 ~]# echo ${array[*]} 1.txt 5.txt 3.txt 数组内容的截取和替换 [root@test01 ~]# array=(1 2 3 4 5) [root@test01 ~]# echo ${array[@]:1:3} #截取1号到3号数组元素 2 3 4 [root@test01 ~]# array=($(echo {a..z})) #将变量的结果赋值给数组 [root@test01 ~]# 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@test01 ~]# echo ${array[@]:1:3} #截取下标为1到3的数组元素 b c d [root@test01 ~]# echo ${array[@]:0:2} #截取下标为0到2的数组元素 a b [root@test01 ~]# array=(1 2 3 1 1) [root@test01 ~]# echo ${array[@]/1/b} #把数组中的1替换成b,原数组未被修改,和sed相似 b 2 3 b b [root@test01 ~]# echo ${array[*]} 1 2 3 1 1 删除数组元素部分内容 [root@test01 ~]# array=(one two three four five) [root@test01 ~]# echo ${array[@]} one two three four five [root@test01 ~]# echo ${array[@]#o*} #从左边开始匹配最短的数组元素,并删除 ne two three four five [root@test01 ~]# echo ${array[@]} one two three four five [root@test01 ~]# echo ${array[@]##o*} #从左边开始匹配最长的数组元素,并删除 two three four five [root@test01 ~]# echo ${array[@]} one two three four five [root@test01 ~]# echo ${array[@]%f*} #从右边开始匹配最短的数组元素,并删除 one two three [root@test01 ~]# echo ${array[@]%%f*} #从右边开始匹配最长的数组元素,并删除 one two three 通过C语音型的for循环打印数组元素 [root@test01 ~]# cat a1.sh #!/bin/sh array=(1 2 3 4 5) for ((i=0;i<${#array[*]};i++)) do echo ${array[i]} done [root@test01 ~]# sh a1.sh 1 2 3 4 5 通过普通的for循环打印数组元素 [root@test01 ~]# cat a2.sh #!/bin/sh array=(1 2 3 4 5) for n in ${array[*]} do echo $n done [root@test01 ~]# sh a2.sh 1 2 3 4 5 使用while循环打印数组元素 [root@test01 ~]# cat a3.sh #!/bin/sh array=(1 2 3 4 5) i=0 while ((i<${#array[*]})) do echo ${array[i]} ((i++)) done [root@test01 ~]# sh a3.sh 1 2 3 4 5 对于元素特别长的情况,可以将其竖向列出来,看起来更规范工整 [root@test01 ~]# cat a4.sh #!/bin/sh array=( xiaoming xiaoli xiaohong xiaobai ) for ((i=0; i<${#array[*]}; i++)) do echo "This is num $i, then content is ${array[$i]}" done [root@test01 ~]# sh a4.sh This is num 0, then content is xiaoming This is num 1, then content is xiaoli This is num 2, then content is xiaohong This is num 3, then content is xiaobai [root@test01 ~]# cat a5.sh #!/bin/sh dir=($(ls array)) #把ls array的结果放进数组里 for ((i=0; i<${#dir[*]}; i++)) #${#dir[*]} 为数组的长度 do echo "This is NO.$i,filename is ${dir[$i]}" done [root@test01 ~]# sh a5.sh This is NO.0,filename is 1.txt This is NO.1,filename is 2.txt This is NO.2,filename is 3.txt 数组的重要命令 (1)定义命令 静态数组 array=(1 2 3) 动态数组 array=($(ls)) 为数组赋值 array[2]=3 (2)打印命令 打印所有元素 ${array[@]} 或${array[*]} 打印数组长度 ${#array[@]}或${#array[*]} 打印单个元素 ${array[i]} #是数组的下标 (3)循环打印的常用基本语法 #!/bin/sh arr=( 10.0.0.1 10.0.0.2 10.0.0.3 ) C语言for循环语法 for ((i=0; i<${#array[@]}; i++)) do echo "${arr[$i]}" done echo ---------------------- 普通for循环语法 for n in ${arr[*]} do echo "$n" done 计算变量内容的长度,4种 [root@test01 ~]# char=xiaoming [root@test01 ~]# echo $char|wc -L 8 [root@test01 ~]# echo ${#char} 8 [root@test01 ~]# expr length $char 8 [root@test01 ~]# echo $char|awk '{print length($0)}' 8 打印字母数不大于6的单词 [root@test01 ~]# cat a6.sh #!/bin/sh arr=(I am xiaoming teacher welcome to xiaoming training class) for ((i=0; i<${#arr[@]}; i++)) do if [ ${#arr[$i]} -lt 6 ] then echo "${arr[$i]}" fi done echo ------------------- for word in ${arr[*]} do if [ `expr length $word` -lt 6 ] then echo $word fi done [root@test01 ~]# sh a6.sh I am to class ------------------- I am to class 同时检测多个URL是否正常 [root@test01 ~]# cat a7.sh #!/bin/sh . /etc/init.d/functions check_count=0 url_list=( #定义检测url数组,包含多个url地址 http://www.baidu.com http://abc.com http://123.com ) function wait (){ #定义 3 2 1 倒计时函数 echo -n '3秒后,执行检测URL操作。'; for ((i=0; i<3; i++)) do echo -n ".";sleep 1 done echo } function check_url(){ #定义检测url函数 wait #执行倒计时函数 for ((i=0; i<`echo ${#url_list[*]}`; i++)) #循环数组元素 do wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1 #检测是否可以访问数组元素的地址 if [ $? -eq 0 ] #如果返回值为0, 则表示访问成功 then action "${url_list[$i]}" /bin/true #优雅的显示成功结果 else action "${url_list[$i]}" /bin/false #优雅的显示失败结果 fi done ((check_count++)) #检测次数加1 } main(){ #定义主函数 while true #开启一个持续循环 do check_url #加载检测url的函数 echo "-----------check count:${check_count}--------" sleep 10 #间歇10秒 done } main #调用主函数运行程序 [root@test01 ~]# sh a7.sh 3秒后,执行检测URL操作。... http://www.baidu.com [ OK ] http://abc.com [ OK ] http://123.com [FAILED] -----------check count:1-------- 3秒后,执行检测URL操作。... http://www.baidu.com [ OK ] http://abc.com [ OK ] http://123.com [FAILED] 利用echo调试一个简单的判断脚本 [root@test01 ~]# cat e1.sh #!/bin/sh read -p "pls input two num:" a b echo $a $b exit ##### #if [ $a -lt $b ] if (($a < $b)) then echo "$a < $b" elif [ $a -eq $b ] then echo "$a = $b" else echo "$a > $b" fi [root@test01 ~]# sh e1.sh pls input two num:2 3 2 3 [root@test01 ~]# sh e1.sh pls input two num:3 5 3 5 3 < 5 使用bash命令参数调试 sh [-nvx] scripts.sh -n 不会执行该脚本,仅检查脚本语法是否有问题,并给出错误提示 -v 在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示 -x 将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数 配置文件.vimrc的重要参数介绍 #~/.vimrc ########## #全局设置 #关闭兼容模式 set nocompatible 设置历史记录步数 set history=100 开启相关插件 filetype on filetype plugin on filetype indent on 当文件在外部被修改时,自动更新该文件 set autoread 激活鼠标的使用 set mouse=a ############ #字体和颜色 #开启语法 syntax enable 设置字体 set guifount=dejaVu\ Sans\ MONO\ 10 设置颜色 colorscheme desert 高亮显示当前行 set cursorline hi cursorline guibg=#00ff00 hi CursorColumn guibg=#00ff00 ############# #代码折叠功能 #激活折叠功能 set foldenable #设置安装语法方式折叠(可简写set fdm=XX) #有6种折叠方法 #manual 手工折叠 #indent 更多的缩进表示更高级别的折叠 #expr 用表达式来定义折叠 #syntax 用语法高亮来定义折叠 #diff 对没有更改的文本进行折叠 #marker 对中文的标志进行折叠 set foldmethod=manual #设置折叠区域的宽度 #如果不为0, 则在屏幕左侧显示一个折叠标识列 #分别'-'和'+'来表示打开和关闭的折叠 set foldcolumn=0 设置折叠层数为3 setlocal foldlevel=3 设置为自动关闭折叠 set foldclose=all 用空格键来代替zo和zc快捷键实现开关折叠 #zo O-pen a fold 打开折叠 #zc C-lose a fold 关闭折叠 #zf F-old creation 创建折叠 nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> ############ #文字处理 #使用空格来替换Tab set expandtab #设置所有的Tab和缩进为4个空格 set tabstop=4 #设定<< 和 >> 命令移动时的宽度为4 set shiftwidth=4 #使得按退格键时可以一次删掉4个空格 set softtabstop=4 set smarttab #缩进,自动缩进(继承前一行的缩进) #set autoindent命令关闭自动缩进,是下面配置的缩写 #可使用autoindent命令的简写,即 ":set ai" 和 ":set noai" #还可以使用" :set ai sw=4" 在一个命令中打开缩进并设置缩进级别 set ai #智能缩进 set si #自动缩进 set wrap #设置软宽度 set sw=4 ############# #vim #Turn on WiLd menu set wildmenu #显示标尺 set ruler #设置命令行的高度 set cmdheight=1 #显示行数 set nu #Do not redraw, whe running macros.. lazyredraw set lz #设置退路 set backspace=eol,start,indent #Bbackspace and cursor keys wrap to set whichwrap+=<,>,h,l #Set magic on(设置魔术) set magic #关闭遇到错误时的声音提示 #关闭错误信息响铃 set noerrorbells #关闭使用可视响铃代替呼叫 set novisualbell #显示匹配的括号({[和]}) set showmatch #how many tenths of a secound to blink set mat=2 #搜索时高亮显示搜索到的内容 set hlsearch #搜索时不区分大小写 #还可以使用简写(':set ic' and ':set noic') set ignorecase ############## #编码设置 set encoding=utf-8 #设置文件编码 set fileencodings=utf-8 #设置终端编码 set termencoding=utf-8 ############# #其他设置 ############# #开启新行时使用智能自动缩进 set smartindent set cin set showmatch #隐藏工具栏 set guioptions-=T #隐藏菜单栏 set guioptions-=m #置空错误铃声的终端代码 set vb t_vb= #显示状态栏(默认值为1,表示无法显示状态栏) set laststatus=2 #粘贴不换行问题的解决方法 set pastetoggle=<F9> #设置背景色 set background=dark #设置高亮相关 highlight Search ctermbg-black ctermfg=white guifg=while guigb=black 在shell脚本的开头自动增加解释器及作者的相关版权信息 autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call Set Title()" func SetTitle() if expand("%:e") == 'sh' call setline(1, "#!/bin/bash") call setline(2, "#Author:xiaoming") call setline(3, "#Blog:http://xiaoming.com") call setline(4, "#Time:".strftime("%F %T")) call setline(5, "#Name:".expand("%")) call setline(6, "#Version:V1.0") call setline(7, "Description:This is a test script.") endif endfunc [root@test01 ~]# cat /root/.vimrc set nocompatible set history=100 filetype on filetype plugin on filetype indent on set autoread set mouse=a syntax enable colorscheme desert set cursorline set foldenable set foldmethod=manual set foldcolumn=0 setlocal foldlevel=3 set foldclose=all nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> set expandtab set tabstop=4 set shiftwidth=4 set softtabstop=4 set smarttab set ai set si set wrap set sw=4 set wildmenu set ruler set cmdheight=1 set nu set lz set backspace=eol,start,indent set whichwrap+=<,>,h,l set magic set noerrorbells set novisualbell set showmatch set mat=2 set hlsearch set ignorecase set encoding=utf-8 set fileencodings=utf-8 set termencoding=utf-8 set smartindent set cin set showmatch set guioptions-=T set guioptions-=m set vb t_vb= set laststatus=2 set pastetoggle=<F9> set background=dark autocmd BufNewFile *.py,*.cc,*.java exec ":call Set Title()" func SetTitle() if expand("%:e") == 'sh' call setline(7, "Description:This is a test script.") endif endfunc P307 vim编辑器常用操作 并发ping方案 [root@test01 ~]# cat ping1.sh #!/bin/sh CMD="ping -W 2 -c 2" Ip="10.227.6." for n in $(seq 254) do { $CMD $Ip$n &> /dev/null if [ $? -eq 0 ];then echo "$Ip$n is ok" fi }& done 监控缓存服务 [root@test01 ~]# cat memcached2.sh #!/bin/sh if [ `netstat -ntlpu|grep 11211|wc -l` -lt 1 ] then echo "Memcached Service is error." exit 1 fi printf "del key\r\n"|nc 127.0.0.1 11211 &>/dev/null printf "set key 0 0 10 \r\nxiaoming123\r\n"|nc 127.0.0.1 11211 &>/dev/null McValues=`printf "get key\r\n"|nc 127.0.0.1 11211|grep xiaoming123|wc -l` if [ $McValues -eq 1 ] then echo "Memcached status is ok" else echo "Memcached status is bad" fi [root@test01 ~]# printf "get key\r\n"|nc 127.0.0.1 11211|grep xiaoming123|wc -l 0 脚本实现入侵检测和报警 (1)建立测试数据 [root@test01 ~]# mkdir /var/html/www -p [root@test01 ~]# cp -a /etc/a* /var/html/www/ [root@test01 ~]# cp -a /etc/b* /var/html/www/ [root@test01 ~]# ls /var/html/www/ adjtime aliases.db anacrontab audisp bash_completion.d binfmt.d aliases alternatives asound.conf audit bashrc [root@test01 ~]# 建立初始的文件指纹库 [root@test01 ~]# find /var/html/www/ -type f|xargs md5sum >/opt/zhiwei.db.org [root@test01 ~]# tail /opt//zhiwei.db.org 199eaa1e43fa9139f0910bdb64fd219e /var/html/www/audisp/plugins.d/af_unix.conf 57421191efe78160bd7e085de99bf5cd /var/html/www/audisp/plugins.d/syslog.conf 45dc8b93a8b644d96197dc87b7b2b392 /var/html/www/audit/audit-stop.rules 29f4c6cd67a4ba11395a134cf7538dbd /var/html/www/audit/auditd.conf 36ffbc8f4c0800b1b8fbd35191782d82 /var/html/www/audit/rules.d/audit.rules f1c2a2ef86e5db325cd2738e4aa7df2c /var/html/www/audit/audit.rules 1215cec8b7cc508972f66f19e46f65b1 /var/html/www/bash_completion.d/iprutils 7ca61969ad2fbb5fe8ce81f0be130f13 /var/html/www/bash_completion.d/yum-utils.bash b8343ef4bb32a1573a472d6623228791 /var/html/www/bash_completion.d/perf 3f48a33cc1fce59ff2df86429151c0e0 /var/html/www/bashrc 建立初始的文件库 [root@test01 ~]# find /var/html/www/ -type f >/opt/wenjian.db.ori [root@test01 ~]# tail /opt/wenjian.db.ori /var/html/www/audisp/plugins.d/af_unix.conf /var/html/www/audisp/plugins.d/syslog.conf /var/html/www/audit/audit-stop.rules /var/html/www/audit/auditd.conf /var/html/www/audit/rules.d/audit.rules /var/html/www/audit/audit.rules /var/html/www/bash_completion.d/iprutils /var/html/www/bash_completion.d/yum-utils.bash /var/html/www/bash_completion.d/perf /var/html/www/bashrc 按单词出现的频率 awk数组法 [root@test01 ~]# awk -F "[,. ]" '{for(i=1;i<NF;i++)array[$i]++} END{for(key in array)print array[key],key|"sort -nr"}' 2.txt|column -t sort排序法 [root@test01 ~]# tr "[ ,.]" "\n"<2.txt|grep -v "^$"|sort|uniq -c |sort -rn tr配合awk数组法 [root@test01 ~]# tr "[ ,.]" "\n"<2.txt|sed '/^$/d'|awk '{++S[$0]}END{for(key in S)print S[key]" " key|"sort -rn"}' 按字母出现的频率降序排序 awk数组法 [root@test01 ~]# tr "{ |,|.}" "\n" <2.txt|awk -F "" '{for(i=1;i<=NF;i++)array[$i]++}END{for(key in array)print array[key],key|"sort -nr"}' grep及sort排序法 [root@test01 ~]# grep -o "[^ ]" 2.txt|sort|uniq -c|sort -rn -k1 检测服务是否正常2 [root@test01 ~]# cat pingts1.sh #!/bin/sh #ping test WEB1=www.baidu.com while true do ping -w2 -c2 $WEB1 >/dev/null 2>&1 if [ $? -ne 0 ];then echo "`date +"%Y-%m-%d %H:%M:%S"` sorry, ping not done1 !" else echo "`date +"%Y-%m-%d %H:%M:%S"` yes,baidu.com is good !" fi sleep 5 done
2,常用命令汇总
关机: 一分钟后关机 #shutdown -h +1 (1代表1分钟) 重启 #shutdown -r now /etc/inittab 0代表关机,6表示重启 shutdown -r 11:00 (11:00表示11点重启) halt 、 poweroff、reboot # ll /sbin/poweroff lrwxrwxrwx 1 root root 16 Mar 16 17:22 /sbin/poweroff -> ../bin/systemctl [root@yt-stor-r60-25 ~]# ll /sbin/halt lrwxrwxrwx 1 root root 16 Mar 16 17:22 /sbin/halt -> ../bin/systemctl cd 参数 - # cd - 切换到上一个旧目录 # cd ~ 切换到家目录 tree #tree -a /tmp 显示目录下的所有内容(-a) #tree -d /tmp 显示目录下目录,不显示文件(-d) -f 显示完整路径名称, -i 显示完整路径名称,则不显示树形部分 #tree -f /tmp #tree -i /tmp # # cat /etc/resolv.conf nameserver 10.176.13.90 # showmount -e ifswh8.wh2.local # mkdir /ifswh8 # mount ifswh8.wh2.local:/ifs/data/all /ifswh8 find命令和xargs命令 xargs 传参 将一个命令输出转成命令参数传递给后续命令 选项: -a 从文件中读入作为输入 -n 后面加次数,表示执行一次用几个参数,默认使用 -t 先打印,再执行 -I 或者i看系统支持{ }替换字符,表示文件内容 ~]#ls -l |xargs ls -lhi ~]#ls -l |xargs -t ls -lhi ~]#find . -type f|xargs sed -i 's#xxxxxx##g' 查找文件后,替换xxxxxx为空
3,脚本