linux shell相关 & 定时清除日志脚本

日志清除脚本clear_log.sh

Linux定时清理日志脚本(find ... exec rm -rf)

#!/bin/bash
# source /home/.bash_profile

# 日志目录数组,根据需要增删
log_dirs=(/home/.../logdir1 /home/.../logdir2 )
# 定义日志文件最大容量KB
max_size=1024*1024
# 循环定义的日志目录下的logs,超过1G则删除
for dir in ${log_dirs[@]}
do
  echo 日志目录:$dir > /dev/null
  cd $dir

# 超过定义大小,覆写nohup日志文件
  out='nohup*'
  out_size=`ls -s $out|awk '{print $2}'`
  out_file=`ls -s $out|awk '{print $2}'`
  if [ $out_size -ge  $max_size ]
  then
    :>$out_file
  fi

# 超过规定大小,清空logs文件夹
  file=logs
  if [ -e $file ]
    then
#    echo '日志目录logs存在'
#    if [ -f $file ]
#      then
#        echo "是文件"
#    elif    [ -d $file ]
#      then
#        echo "是目录"
        size=`du -s $file|awk '{print $1}'`
        if [ $size -ge $max_size ]
        then
          rm -rf $file
          echo 执行删除 > /dev/null
        fi
#    fi
  else
    echo "logs目录不存在"
#    exec ls -s $file
#  exit 0
  fi
    echo "结束"
done

Linux下,脚本实现:查找tomcat的进程号,并杀死该进程;通过查找绝对路径 ,启动tomcat并查看日志

添加到服务器定时任务执行 crontab

Linux crontab 命令

Linux set命令

最常用的两个参数就是 -e 与 -x ,一般写在 shell 代码逻辑之前,这两个组合在一起用,可以在 debug 的时候替你节省许多时间 。

  set -x 会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。

  set -e 会在执行出错时结束程序,就像其他语言中的“抛出异常”一样。

引自:shell中 set 指令的用法

  • -x  执行指令后,会先显示该指令及所下的参数。
vim set_test.sh

#!/bin/bash
set -x
echo $*
set +x

执行:
sh set_test.sh  123 abc

运行结果 
+ echo 123 abc
123 abc
+ set +x

Shell 教程

变量

定义变量时,变量名不加美元符号

变量名和等号之间不能有空格

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

  • 中间不能有空格,可以使用下划线(_)。

  • 不能使用标点符号。

使用一个定义过的变量,只要在变量名前面加美元符号即可

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

  • 使用 unset 命令可以删除变量。unset 命令不能删除只读变量。语法:

     unset variable_name

Shell 字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

 

双引号的优点:

  • 双引号里可以有变量

  • 双引号里可以出现转义字符

Shell 数组

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

 数组名=(值1 值2 ... 值n)

读取数组

读取数组元素值的一般格式是:

 ${数组名[下标]}
 ${#数组名[*/@]}

使用 @ 符号可以获取数组中的所有元素

shell 注释

#开头的行

多行注释

 :>>EOF     :>>'      :>>!
 ​
 注释内容
 ​
 EOF       '             !

 

 

 

shell基本运算符

  • 算数运算符

    • +

    • -

    • * 乘号(*)前边必须加反斜杠()才能实现乘法运算

    • /

    • %

  • =

    条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

    • ==

    • !=

  • 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

  • -eq

  • -ne

  • -gt

  • -lt

  • -ge

  • le

  • 布尔运算符

  • ! 非

  • -o 或

  • -a 与

  • &&

  • ||

  • 字符串运算符

  • = 检查字符串是否相等

  • !=

  • -z 字符串长度是否为0,是返回true。[ -z $str ]

  • -n 字符串长度是否不为0

  • $ 检测字符串是否为空,不为空返回 true。

  • 文件测试运算符

  • -d 检测文件是否是目录,如果是,则返回 true。

  • -f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

  • -p 检测文件是否是有名管道,如果是,则返回 true。

  • -e 检测文件(包括目录)是否存在,如果是,则返回 true

  • -s 检测文件是否为空(文件大小是否大于0),不为空返回 true。

  • -rwx 检测文件是否可读、可写、可执行

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

  • 完整的表达式要被 ` ` 包含

 

shell流程控制

sh 的流程控制不可为空(如果 else 分支没有语句执行,就不要写这个 else。)

if else

 if condition
 then
    command1
    command2
    ...
    commandN
 fi

写成一行(适用于终端命令提示符):if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi末尾的 fi 就是 if 倒过来拼写。

if else-if else

if else-if else 语法格式:

 if condition1
 then
    command1
 elif condition2
 then
    command2
 else
    commandN
 fi

 

for 循环

与其他编程语言类似,Shell支持for循环。

for循环一般格式为:

 for var in item1 item2 ... itemN
 do
    command1
    command2
    ...
    commandN
 done

写成一行:

 for var in item1 item2 ... itemN; do command1; command2… done;

 

while 语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:

 while condition
 do
    command
 done

 

until 循环

 

 

case ... esac

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case ... esac 语法格式如下:

 case 值 in
 模式1)
    command1
    command2
    ...
    commandN
    ;;
 模式2)
    command1
    command2
    ...
    commandN
    ;;
 esac

case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

 

shell中各种括号()、(())、[]、[[]]、{}的作用和区别

在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的,各自的优缺点和区别

${var...}  

  # 是去掉左边(在键盘上 # 在 $ 之左边)

  % 是去掉右边(在键盘上 % 在 $ 之右边)

  单一符号是最小匹配﹔两个符号是最大匹配。

 

${#var} 可计算出变量值的长度

 

$(( ))  用来作整数运算

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用

事实上,单纯用 (( )) 也可重定义变量值:

a=5; ((a++)) 可将 $a 重定义为 6

a=5; ((a–)) 则为 a=4

a=5; b=7; ((a < b)) 会得到 0 (true) 的返回值。

常见的用于 (( )) 的测试符号有如下这些:

<:小于

>:大于

<=:小于或等于

>=:大于或等于

==:等于

!=:不等于

 

awk 入门教程             Linux awk 命令

awk  -F 指定分隔符

awk '{print $n}'  将数据分割后的第n个字段(print)输出

 

原文地址:https://www.cnblogs.com/foolash/p/14436597.html