按要求生成随机数 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Description:create random alpha & number. while :; do echo -n -e "\033[31;1mplease input row:\033[0m" read ROW row1=$(echo "$ROW" |sed 's/[0-9]//g') #将用户的输入进行过滤 if [ -z $ROW ]; then echo "the input cannot be empty." continue #输入不能为空 elif [ "$row1" == "" ]; then break #满足输入条件退出循环 else continue #不满足条件继续循环 fi done while :; do echo -n -e "\033[31;1mplease input column:\033[0m" read COLUMN column1=$(echo "$COLUMN" |sed 's/[0-9]//g') #将用户的输入进行过滤 if [ -z $COLUMN ]; then echo "the input cannot be empty." continue #输入不能为空 elif [ "$column1" == "" ]; then break #满足输入条件退出循环 else continue #不满足条件继续循环 fi done while :; do echo -n -e "\033[31;1mplease input descriptor:\033[0m" read DS ds1=$(echo "$DS" |sed -r 's/([0-9]|[a-z]|[[:space:]])//g') #将用户的输入进行过滤 ds2=$(echo "$DS" |sed 's/[[:space:]]//g') if [ -z $ds2 ]; then echo "the input cannot be empty." continue #输入不能为空 elif [ "$ds1" == "" ]; then break #满足输入条件退出循环 else continue #不满足条件继续循环 fi done num1=0 #用于数组下标 for i in {a..z}; do #将a-z放入数组 alphabet[${num1}]=$i let num1++ done num2=0 #用于数组下标 for j in {0..9}; do #将0-9放入数组 number[${num2}]=$j let num2++ done discription=($DS) #将每一列的描述符放入数组 for i in `seq 10`; do for R in $(seq $ROW); do # for C in $(seq $COLUMN); do #取消循环,在遍历数组时已达到要求 for D in ${discription[*]}; do CL=$(echo $D |wc -L) for CHAR in $(seq $CL); do CH=$(echo "$D" |cut -c ${CHAR}) alpha=$(($RANDOM%26)) #获取字母数组的随机下标 num=$(($RANDOM%10)) #获取数字数组的随机下标 alpha1=alphabet[$alpha] num3=number[$num] eval array1=$(echo \${$alpha1}) eval array2=$(echo \${$num3}) echo "$CH" |grep "[[:digit:]]" > /dev/null if [ "$?" == "0" ]; then LINE="${LINE}${array2}" fi echo "$CH" |grep "[[:alpha:]]" > /dev/null if [ "$?" == "0" ]; then LINE="${LINE}${array1}" fi done LINE="${LINE} " done echo $LINE >> /tmp/${i}.txt unset LINE # done done done ``` shell脚本 2017-03-19 评论 2426 次浏览
允许远程登录的白名单 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:allow white list. #从键盘获取白名单 while :; do echo -e "\e[33m请输入允许的主机地址或网段,以空格或字母隔开:\e[0m" read IPADDR1 #使用正则去匹配用户的输入 JUDGE=$(echo $IPADDR1 |sed -r "s/([[:space:]]|[[:alpha:]])?([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])([[:space:]]|[[:alpha:]])?//g") if [ -z "$JUDGE" ]; then num1=$(echo $IPADDR1 |awk -F '[[:space:]]|[[:alpha:]]' "{printf NF}") for ((i=1;i<=$num1;i++)); do echo $IPADDR1 |awk -F '[[:space:]]|[[:alpha:]]' "{print \$$i}" >> /tmp/whitelist.txt done include /sh/whitelist.sh else echo -e "\e[31;1m你的输入有误,请重新输入!\e[0m" continue fi done ``` shell脚本 2017-03-18 评论 2383 次浏览
第二节——linux 初识 对于linux操作系统,怎么说呢?起初我并没有拿来感谢什么的想法,就是一个劲儿的死磕,从兄弟连的一百多集的教程到linux高级运维教程,再到铭哥linux,以及shell相关的课程,当然,还有马哥的详细的教程,除了马哥的教程,其余的都是在腾讯课堂上完成的,嗯,再次感谢腾讯课堂、网易云课堂、MOCC等教育类APP,给了我一个学习的机会,我没能在一个梦想中的大学里系统的学习计算机课程,是我的一大遗憾,没能迅速的把握住方向,是对兴趣爱好的渎职。嗯,这是我第五遍的学习linux操作系统,到目前为止我没有过多的仔细的取尝试假设大的服务,我不知道我为什么和这些基础杠上了,似乎冥冥中有那么一股力量指引着我一遍一遍不厌其烦的学习,记录下详细的笔记,虽然我们能很好的整理笔记。其实我写这些笔记的原因是我了方便自己查阅,当然我更希望看到是的一种可以量化的、看得见的积累,我选择了博客,有些过时的东西,但是对于我来说,足够了。我不是那么一个喜欢花里胡哨的人,但是我又不能接受没有章法的简单。简约风格,比花里胡哨更加需要创造力的一种风格,好像占据了我的审美。好吧,闲聊到此为止,开始说一说,我还不知道能拿来干些什么的linux操作系统。 开始记录之前,得声明一下,安装linux的过程就不放了,原因在第一节里面讲过了,就不再赘述,直接开始正文,也就是linux下经典的黑底白字界面,字符界面。 当我们进入linux字符界面,并成功登录的时候,会看见首部有一长串的字符,使用中括号括起来的‘[root@localhost ~]#’的字样,我们将这个称之为命令提示符。 # 表示为管理员 $ 表示为普通用户 在linux中管理员是无所不能的,甚至可以直接干掉(删除)操作系统,当然,我并不建议这样做。 命令提示符是拿来干甚的?肯定不是让咱们傻傻的看着的,既然是命令提示符,肯定就有命令。是的,在字符界面下,所有的操作都是依靠命令来完成的,命令的格式如下: COMMAND(命令名称) [options...](选项) [arguments...](参数) 命令:由英文字母组成,大多是英文的缩写,所以命令是需要记住的。 选项:用来调整或者启用、关闭命令的某个功能。选项又分为短选项,使用短横线作为前缀(-),长选项,使用两个短横线(--),作为某个单词的前缀。 一般来说,短选项是可以合并的,而长选项不能。 参数:命令的作用对象,参数其实就是向命令提供数据的。 #echo ${SHELL} 显示当前系统的shell #cat /etc/shells 查看当前系统上所有的shell #echo ${PS1} 显示提示符的格式 #which CAMMAND 查看命令的具体位置 命令的格式: COMMAND(命令) [options](选项) [arguments..](参数) 命令:命令就是我们之前使用的echo、ls、cat等等,其实就是一个个的小程序的名字,我们要做的就是记住它们。 选项:选项的作用是调整或者启用/关闭命令的某些功能,选项有短选项和长选项的区别: 短选项:短选项通常为一个短横线‘-’跟一个字符,在大多数情况下这些短选项是可以合并的,即一个短横线后跟上多个字符,如果不合并则要使用空格(空白字符)隔开。 长选项:长选项使用两个短横线‘--’跟上一个单词,长选项一般不能合并。 参数:参数为命令的作用对象,参数其实就是给命令提供数据的。 我们在初次使用命令的时候,很可能会因为少了参数而处于一个退不出去的界面下,比如在命令行下键入cat不给任何参数,就会出现一个很奇怪的现象,能输入,还能回车,但是没有任何反应,不论怎么按就是回不到刚才的命令提示符下。至于为什么cat命令会变成这样,等我们有一定的基础的时候再做讲解,这里只是说一说怎么退出这个界面。 ctrl + c 取消命令的执行,组合键的使用方法就不再赘述,当我们按下ctrl + c之后会发现我们从刚才的界面下退出来了!是不是很神奇?有了这个神器,在以后的学习环境下绝大多数情况下是可以退出的。 我们在命令行下输入命令回车时,实际上上时提请shell程序找到键入命令所对应的可执行程序或者代码,并由其分析后提交给内核分配资源使其运行起来,表现为一个或多个进程。 shell中可执行的命令有两类: 一个是外部命令,什么是外部命令?也就是我们之前使用which查看命令时能够显示出具体路径的命令,我们称为是外部命令。 一个是内建命令,内建命令是shell程序自带的,并且以命令的方式提供给用户,这些命令使用which是查询不到具体的路径的,例如#which cd 其实我们有更好的方法来实现命令的甄别,使用一个命令来实现: #type COMMAND 查看命令的类型 我们先来简单讲一讲文件系统: 我们知道在windows下文件都是有名称的,即按名存取,在linux下也是这样的,以文件名来进行区分不同的文件,在linux中,文件系统的查找是自上而下的方式,有点像倒置的树状结构,末端的我们称为叶子节点。 对于一个文件来说,它有两类数据,一个就是它本身存储的数据,另一个就是元数据(matedate,记录了与文件内容无关的信息:文件名称、大小、时间等等)。 在命令行下有两个特殊的命令: #./ 当前目录,是的就是一个点 #../ 上一级目录,或者说父目录,用两个点表示。 l 文件名严格区分大小写:file1,File1,FILE1是不同的 l 文件名可以使用除了/的任意字符,‘/’为根目录和路径分隔符,不建议使用特殊字符。 l 文件名的长度不能超过255个字符 l 所有以点‘.’开头的文件均为隐藏文件 获取命令的帮助文档: #help COMMAND查询内建命令的使用帮助文档 #man 查询外部命令的使用帮助 #COMMAND --help或者-h 获取自带的帮助 #info COMMAND 获取更详细的命令信息,文档中支持超链接 我们还可以到网上获取其官方文档(documentation)。 还可以获取发行版(red hat、centOS等等)的官方文档。 还有什么不懂可以google 帮助文档一般为纯文本文件,而纯文本文件压缩比较大,因此帮助文档都是压缩后的文档,一般存储在特定的位置:/usr/share/man,在/usr/share/man目录下,我们可以发现有man1-man9的目录,这是将不同权限的命令分门别类存放,当我们使用man COMMAND命令时,会到/usr/share/man下从man1开始寻找,最近的一个便作为结果,找到文档后解压缩至临时目录并打开。 man1 普通命令,用户命令 man2 系统调用 man3 库调用(c库) man4 设备文件及特殊文件 man5 配置文件格式 man6 与游戏相关 man7 杂项,不便归档的 man8 管理类命令 #man #(数字、章节数) COMMAND 指定查看章节数的命令 #whatis 查看命令属于哪几个章节,man默认打开的是排在前面的,也就是说,有些关键字并不是只在一个章节中存在,此时我们就需要指定章节中的手册。 man手册不一定会在/usr/share/man目录下,但是man命令是怎么知道其文档位置?可能大家猜到了,是由配置文件进行配置的。 man命令的配置文档在/etc/man.config,使用MANPATH定义man手册的位置。 MANPATH /path/to/somewhere 在/etc/man.config中添加一句定义即可/path/to/somewhere为文档位置(父目录),我们现在还没有将编辑器,于是使用命令向其中追: #echo ‘MANPATH /path/to/somewhere’>>/etc/man.config 我们需要知道的是,修改配置文件不会立即生效,需要重启主机或者服务后生效,也有其他的方法,但是此处不过多涉及。 我们可以使用man命令直接指定文档的位置搜索手册 #man –M /path/to/some COMMAND 帮助手册中的段落说明: NAME 程序的名字 SYNOPSIS 程序的简要使用说明 {} 大括号用于定界,方便区分 []中括号中的内容为可选内容 <>尖括号内的内容为必选内容 a|b多选一 .... 同一内容可以出现多次 DESCRIPTION 功能的详细描述 OPTIONS 选项 EXAMPLES 示例 AUTHOR 作者 man命令解压文档会调用less命令,其窗口操作同less命令,less命令是一个和cat一样的文档查看命令,但是less命令可以翻页查看长文档,而cat命令不行(如果硬要使用cat查看长文档也是可以的,但是效果很差)。 space,ctrl+v/V,ctrl+f/F 向文件尾部翻屏 b,ctrl+b/B 向文件首部翻屏 d,ctrl+d/D 向文件尾部翻半屏 u,ctrl+u/U 向文件首部翻半屏 enter/e/j 向文件尾部翻一行 y/k 向文件首部翻一行 q 退出 #(键入数字) 跳转至多少行 1G 回到文件头 G 翻至文件尾部 基础笔记二 2017-03-18 评论 1813 次浏览 第一节——linux开篇 因为是第五遍复习笔记,所以可能没有很详细的记载过程,看此篇内容的朋友需要有一点linux命令的基础,笔记的主要目的是方便小弟查阅、复习之用,若能帮助到路过的你,小弟深感荣幸,如果有不当之处,望发邮件指正,因为开放评论会有很多的广告,对此带来的不便小弟深感歉意。 要学习linux操作系统首先我们得有一个linux操作系统的环境,这个环境的搭建我们选择在windows操作系统上进行搭建,借助于虚拟化软件VMware,当然我们也可以使用Vbox,因为Vbox免费。虚拟机的使用算不上难,从官网下载安装包,像安装QQ等软件一样选择下一步就好,如果有需要,可以选择换个安装位置。 除了虚拟机,我们还需要准备好linux操作系统的镜像文件,用于在虚拟机中搭建linux学习环境。具体的操作方法很简单,因为本博客目前没有打算图文混合编排,空间有限,所以就不上图了,至于文字的描述安装过程,本人自认为还没有达到那样精确描述的高度,故不在此班门弄斧,大家可以在网上搜索虚拟机中linux操作系统的安装过程,虽然不能贴出像样的过程,但是可以给出镜像的下载地址,是阿里云的,本博客也是搭建在阿里云上的。 linux OS:https://opsx.alibaba.com/mirror 这里收录了很多开源的操作系统,本笔记所使用的版本为Cent OS 6.5,所以有出入的地方还请指正,本人邮箱:421466698@qq.com 基础笔记二 2017-03-17 评论 1677 次浏览 日系轮替 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:httpd logrotate. #日志的轮替不借助cron天计划任务 #思路,单独写一个脚本检测当昨天的日志是否轮替,将轮替的日期写入一个文件,通过grep去过滤当天的日期. #如果过滤不到天的日期则进行轮替操作,并且将时间记录到指定文件,死循环中使用sleep,每小时检测一次。 while :; do [ -e /tmp/httpd.date.txt ] || touch /tmp/httpd.date.txt DATE_YEAR=$(date -d "yesterday" "+%Y") #获取昨天的年份 DATE_MON=$(date -d "yesterday" "+%m") #获取昨天的月份 DATE_DAY=$(date -d "yesterday" "+%F") #获取昨天的日期 LOGDIR='/var/log/httpd' #日志的目录 LOGFILE='access_log' #日志的名称 DATE_YEST=$(date -d "yesterday" "+%F") #获取昨天的格式日期,用户判断日志是否轮替 YEST_VALUE=$(grep "$DATE_YEST" /tmp/httpd.date.txt) #提取之前是否轮替过日志 #判断日志是否轮替 if [ -f $LOGDIR/$LOGFILE ]; then if [ "$YEST_VALUE" != "0" ]; then mv ${LOGDIR}/${LOGFILE} ${LOGDIR}/${LOGFILE}_${DATE_YEST} #日志改名(轮替) touch ${LOGDIR}/${LOGFILE} #创建新的日志文件 echo "${LOGDIR}/${LOGFILE}轮替日志为${DATE_YEST}的日志" >>/tmp/httpd.date.txt #轮替完成打上标签 else echo "$(date) 检测完成,日志已经完成轮替" >> /tmp/logrecoed.log #检测日志是否经过轮替 fi else echo "$(date) 检测发现日志不存在,并新创建了日志。" >> ./tmp/logrecoed.log #日志文件不存在时创建日志 touch $LOGDIR/$LOGFILE fi #判断日志是否切割 if [ -f ${LOGDIR}/${LOGFILE}_${DATE_YEST} ]; then [ -d ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} ] || mkdir -p ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} SIZE=$(du -h ${LOGDIR}/${LOGFILE}_${DATE_YEST} |awk -F " " '{print $1}') #取日志的大小(真实大小) UNIT=$(echo $SIZE |awk -F "[[:digit:]]" '{print $NF}') #取日志大小的单位 VALUE=$(echo $SIZE |awk -F "K|M|G" '{print $1}') #取日志大小的数值 JUDGE=$(echo "$VALUE>10" |bc) #判断日志大小(仅数值判断),单位的判断放在if语句中 if [ "$JUDGE" == "1" -a "$UNIT" == "M" ]; then #判断轮替日志的大小,满足大于10M时切割 #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log elif [ "$JUDGE" == "1" -a "$UNIT" == "G" ]; then #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log else #如果不足4M直接移动到相应目录下 mv ${LOGDIR}/${LOGFILE}_${DATE_YEST} ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST} [ "$?" == "0" ] && echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成" >> /tmp/logrecord.log fi else echo "$(date) 执行了一次脚本" >>/tmp/logrecord.log #每正确执行一次该循环向文件中输入 fi sleep 1h #睡她一小时 done ``` shell脚本 2017-03-17 评论 1795 次浏览 计算两数值之间的和-第三版 ``` #!/bin/bash #Version:0.3.5 #Author:stone #Discription:get sum. a=1 #给变量赋初始值,用于case选择、数组下标和退出判断 sum=0 #用于累加 function sm() { #以下为调用数组for计算循环 for ((i=$1;i<=$2;i+=$3)); do sum=$(($sum+$i)) done echo $sum } function cho() #用于选择返回的输入值的位置 { while :; do case $1 in 2) echo -e "\033[32m1-返回最小值输入.\033[0m" #打印给用户的提示 echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m直接回车返回当前默认层.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #判断从键盘获取的是否为空,空则返回当前默认层级 n1=$(echo $n |sed 's/[0-9]//g') #过滤输入的值 if [ -z $n1 ]; then #判断过滤后的值是否为空 if [ $n -le 2 -a $n -ge 1 ]; then #判断用户输入是否符合当前层级 a=$n #返回用户指定的层级 continue 2 else echo -e "\033[31m请输入1或者2!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; 3) echo -e "\033[32m1-返回最小值输入.\033[0m" #打印给用户的提示 echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m3-返回增量值输入.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" #代替read -p颜色输出 read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #对获取的值进行判断 n1=$(echo $n |sed 's/[0-9]//g') #过滤用户的输入 if [ -z $n1 ]; then #判断过滤后的值是否为空,空则返回当前错误层级 if [ $n -le 3 -a $n -ge 1 ]; then #判断输入的数值是否符合当前层级范围 a=$n #返回用户指定的层级 continue 2 else echo -e "\033[31m请输入1或者2或者3!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; esac done } while :; do case $a in #case选择语句使用a变量进行修正每一次的值 1) echo -n -e "\033[31m请输入累加的初始值:\033[0m" read num1 ;; 2) echo -n -e "\033[31m请输入累加的最大值:\033[0m" read num2 ;; 3) echo -n -e "\033[31m请输入累加的自增量:\033[0m" read num3 ;; esac tnum=num${a} #变量的嵌套,将case语句选择后的值(num${a}中的值),赋值给tnum eval number=$(echo \$$tnum) #变量的嵌套,使用eval,将$$tnum当做两条命令执行,即$tnum的值作为前面"$"的参数 if [ ! -z "$number" ]; then #判断输入值是否不空,空则执行下一个循环 n=$(echo $number|sed 's/[0-9]//g') #判断输入是否是纯数字 if [ -z $n ]; then ar[$a]=$number #将输入的值赋值给数组 if [ $a -eq 2 ]; then #判断最大值是否已经赋值,如果已经赋值则判断大小 if [ ${ar[1]} -gt ${ar[2]} ]; then #判断起始数值是否大于结束数值 echo -e "\033[31m你输入的起始数字大于结束数字!\033[0m" a=2 #确定a的值,由于在上一层有过判断,此处可省 cho $a #函数的调用 fi fi if [ $a -eq 3 ]; then #判断赋值是否结束,结束则退出循环 price=$((${ar[2]}-${ar[1]})) if [ ${ar[3]} -gt $price ]; then #判断增量值(步长)是否符合标准 a=3 #确定a的值,由于在上一层有过判断,此处可省 echo -e "\033[31m你输入的增量值不符合要求!\033[0m" cho $a #函数的调用 else sm ${ar[*]} #调用函数进行计算 exit fi fi let a++ #变量用于数组下标,同时也用于case判断 continue else a=$a #任何一次输入不为纯数字时返回相应的case语句 echo -e "\033[31m你输入的不是纯数字\033[0m" continue fi else a=$a #任何一次输入为空时返回执行相应的case语句 echo -e "\033[31m输入不能为空!\033[0m" continue fi done ``` shell脚本 2017-03-16 评论 1812 次浏览 « 前一页1...11121314151617...33后一页 » 关于博主 几人行 纸上谈来终觉浅,绝知此事要躬行。 了解更多 文章分类 OpenStack+Ceph(5) Python笔记(0) CI/CD(4) Ansible(1) Docker笔记(3) shell脚本(24) Linux_quession&answer(2) 调优文档(4) 服务(6) 随手笔记(21) 妄尘集(20) 基础笔记二(8) 基础笔记综合整理(20) 给自己讲linux(114) 最受欢迎的文章 博客停更通知( 19,877 人看过 ) OpenStack(一)( 12,705 人看过 ) 情书( 11,307 人看过 ) 我的青春里没有爱情( 9,654 人看过 ) 操作系统原理--Linux篇(摘录)( 9,367 人看过 ) OpenStack+Ceph云平台卷清理操作( 9,268 人看过 ) OpenStack+Ceph磁盘解锁( 8,789 人看过 ) Docker container 修改MAC( 8,550 人看过 ) 防火墙规则笔记整理( 7,842 人看过 ) JumpServer简介( 7,464 人看过 ) 最近回复 wuzetian: alert("你好,我是一个警告框!"); wuzetian: function myFunction() { alert("你好,我是一个警告框!"); } wuzetian: http://fxme.top/index.php/page/2/ wuzetian: http://fxme.top/index.php/page/2/ wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习
第一节——linux开篇 因为是第五遍复习笔记,所以可能没有很详细的记载过程,看此篇内容的朋友需要有一点linux命令的基础,笔记的主要目的是方便小弟查阅、复习之用,若能帮助到路过的你,小弟深感荣幸,如果有不当之处,望发邮件指正,因为开放评论会有很多的广告,对此带来的不便小弟深感歉意。 要学习linux操作系统首先我们得有一个linux操作系统的环境,这个环境的搭建我们选择在windows操作系统上进行搭建,借助于虚拟化软件VMware,当然我们也可以使用Vbox,因为Vbox免费。虚拟机的使用算不上难,从官网下载安装包,像安装QQ等软件一样选择下一步就好,如果有需要,可以选择换个安装位置。 除了虚拟机,我们还需要准备好linux操作系统的镜像文件,用于在虚拟机中搭建linux学习环境。具体的操作方法很简单,因为本博客目前没有打算图文混合编排,空间有限,所以就不上图了,至于文字的描述安装过程,本人自认为还没有达到那样精确描述的高度,故不在此班门弄斧,大家可以在网上搜索虚拟机中linux操作系统的安装过程,虽然不能贴出像样的过程,但是可以给出镜像的下载地址,是阿里云的,本博客也是搭建在阿里云上的。 linux OS:https://opsx.alibaba.com/mirror 这里收录了很多开源的操作系统,本笔记所使用的版本为Cent OS 6.5,所以有出入的地方还请指正,本人邮箱:421466698@qq.com 基础笔记二 2017-03-17 评论 1677 次浏览
日系轮替 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:httpd logrotate. #日志的轮替不借助cron天计划任务 #思路,单独写一个脚本检测当昨天的日志是否轮替,将轮替的日期写入一个文件,通过grep去过滤当天的日期. #如果过滤不到天的日期则进行轮替操作,并且将时间记录到指定文件,死循环中使用sleep,每小时检测一次。 while :; do [ -e /tmp/httpd.date.txt ] || touch /tmp/httpd.date.txt DATE_YEAR=$(date -d "yesterday" "+%Y") #获取昨天的年份 DATE_MON=$(date -d "yesterday" "+%m") #获取昨天的月份 DATE_DAY=$(date -d "yesterday" "+%F") #获取昨天的日期 LOGDIR='/var/log/httpd' #日志的目录 LOGFILE='access_log' #日志的名称 DATE_YEST=$(date -d "yesterday" "+%F") #获取昨天的格式日期,用户判断日志是否轮替 YEST_VALUE=$(grep "$DATE_YEST" /tmp/httpd.date.txt) #提取之前是否轮替过日志 #判断日志是否轮替 if [ -f $LOGDIR/$LOGFILE ]; then if [ "$YEST_VALUE" != "0" ]; then mv ${LOGDIR}/${LOGFILE} ${LOGDIR}/${LOGFILE}_${DATE_YEST} #日志改名(轮替) touch ${LOGDIR}/${LOGFILE} #创建新的日志文件 echo "${LOGDIR}/${LOGFILE}轮替日志为${DATE_YEST}的日志" >>/tmp/httpd.date.txt #轮替完成打上标签 else echo "$(date) 检测完成,日志已经完成轮替" >> /tmp/logrecoed.log #检测日志是否经过轮替 fi else echo "$(date) 检测发现日志不存在,并新创建了日志。" >> ./tmp/logrecoed.log #日志文件不存在时创建日志 touch $LOGDIR/$LOGFILE fi #判断日志是否切割 if [ -f ${LOGDIR}/${LOGFILE}_${DATE_YEST} ]; then [ -d ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} ] || mkdir -p ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} SIZE=$(du -h ${LOGDIR}/${LOGFILE}_${DATE_YEST} |awk -F " " '{print $1}') #取日志的大小(真实大小) UNIT=$(echo $SIZE |awk -F "[[:digit:]]" '{print $NF}') #取日志大小的单位 VALUE=$(echo $SIZE |awk -F "K|M|G" '{print $1}') #取日志大小的数值 JUDGE=$(echo "$VALUE>10" |bc) #判断日志大小(仅数值判断),单位的判断放在if语句中 if [ "$JUDGE" == "1" -a "$UNIT" == "M" ]; then #判断轮替日志的大小,满足大于10M时切割 #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log elif [ "$JUDGE" == "1" -a "$UNIT" == "G" ]; then #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log else #如果不足4M直接移动到相应目录下 mv ${LOGDIR}/${LOGFILE}_${DATE_YEST} ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST} [ "$?" == "0" ] && echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成" >> /tmp/logrecord.log fi else echo "$(date) 执行了一次脚本" >>/tmp/logrecord.log #每正确执行一次该循环向文件中输入 fi sleep 1h #睡她一小时 done ``` shell脚本 2017-03-17 评论 1795 次浏览
计算两数值之间的和-第三版 ``` #!/bin/bash #Version:0.3.5 #Author:stone #Discription:get sum. a=1 #给变量赋初始值,用于case选择、数组下标和退出判断 sum=0 #用于累加 function sm() { #以下为调用数组for计算循环 for ((i=$1;i<=$2;i+=$3)); do sum=$(($sum+$i)) done echo $sum } function cho() #用于选择返回的输入值的位置 { while :; do case $1 in 2) echo -e "\033[32m1-返回最小值输入.\033[0m" #打印给用户的提示 echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m直接回车返回当前默认层.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #判断从键盘获取的是否为空,空则返回当前默认层级 n1=$(echo $n |sed 's/[0-9]//g') #过滤输入的值 if [ -z $n1 ]; then #判断过滤后的值是否为空 if [ $n -le 2 -a $n -ge 1 ]; then #判断用户输入是否符合当前层级 a=$n #返回用户指定的层级 continue 2 else echo -e "\033[31m请输入1或者2!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; 3) echo -e "\033[32m1-返回最小值输入.\033[0m" #打印给用户的提示 echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m3-返回增量值输入.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" #代替read -p颜色输出 read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #对获取的值进行判断 n1=$(echo $n |sed 's/[0-9]//g') #过滤用户的输入 if [ -z $n1 ]; then #判断过滤后的值是否为空,空则返回当前错误层级 if [ $n -le 3 -a $n -ge 1 ]; then #判断输入的数值是否符合当前层级范围 a=$n #返回用户指定的层级 continue 2 else echo -e "\033[31m请输入1或者2或者3!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; esac done } while :; do case $a in #case选择语句使用a变量进行修正每一次的值 1) echo -n -e "\033[31m请输入累加的初始值:\033[0m" read num1 ;; 2) echo -n -e "\033[31m请输入累加的最大值:\033[0m" read num2 ;; 3) echo -n -e "\033[31m请输入累加的自增量:\033[0m" read num3 ;; esac tnum=num${a} #变量的嵌套,将case语句选择后的值(num${a}中的值),赋值给tnum eval number=$(echo \$$tnum) #变量的嵌套,使用eval,将$$tnum当做两条命令执行,即$tnum的值作为前面"$"的参数 if [ ! -z "$number" ]; then #判断输入值是否不空,空则执行下一个循环 n=$(echo $number|sed 's/[0-9]//g') #判断输入是否是纯数字 if [ -z $n ]; then ar[$a]=$number #将输入的值赋值给数组 if [ $a -eq 2 ]; then #判断最大值是否已经赋值,如果已经赋值则判断大小 if [ ${ar[1]} -gt ${ar[2]} ]; then #判断起始数值是否大于结束数值 echo -e "\033[31m你输入的起始数字大于结束数字!\033[0m" a=2 #确定a的值,由于在上一层有过判断,此处可省 cho $a #函数的调用 fi fi if [ $a -eq 3 ]; then #判断赋值是否结束,结束则退出循环 price=$((${ar[2]}-${ar[1]})) if [ ${ar[3]} -gt $price ]; then #判断增量值(步长)是否符合标准 a=3 #确定a的值,由于在上一层有过判断,此处可省 echo -e "\033[31m你输入的增量值不符合要求!\033[0m" cho $a #函数的调用 else sm ${ar[*]} #调用函数进行计算 exit fi fi let a++ #变量用于数组下标,同时也用于case判断 continue else a=$a #任何一次输入不为纯数字时返回相应的case语句 echo -e "\033[31m你输入的不是纯数字\033[0m" continue fi else a=$a #任何一次输入为空时返回执行相应的case语句 echo -e "\033[31m输入不能为空!\033[0m" continue fi done ``` shell脚本 2017-03-16 评论 1812 次浏览