Shell脚本知识点整理

一、注释

“# ”开头的就是注释,被编译器忽略

单行注释: #

多行注释: :<<EOF … EOF 或者 :<<! … ! (:<< 标识多行注释开始,并指定一个标识符作为开始结束的标志)



二、变量

变量类型

运行shell时,会同时存在三种变量:

局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行




三、变量操作

创建普通变量: name=“test” (=两边不可有空格)

创建只可函数体中使用的局部变量: local name=“test” (使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用)

使用变量: echo $name 或者 echo ${name} (推荐使用大括号版)

变量重新赋值: name=“new_test” (将原值覆盖)

只读变量: name=“only_read” -> readonly name (使用readonly标识后的变量,不可被修改)

删除变量: unset name; (删除之后不可访问,删除不掉只读变量)




四、字符串变量

1)单引号

单引号变量var='test' ,只能原样输出,变量无效

单引号中不能出现一个单独的单引号,转义也不可以

2)双引号

双引号变量var="my name is ${name}",变量有效

可出现转义符

3)拼接字符串

中间无任何+,之类的字符

name=“this is”" my name"; name=“this is my name”; name=“this” is “my name” 等效

name=‘this is’’ my nam’; name=‘this is my name’; name=‘this’ is ‘my name’ 等效

4)获取字符串长度

在${}中使用“#”获取长度

name=“test”;

echo ${#name}; # 输出为4

5)提取子字符串

1:4 从第2个开始 往后截取4个字符

::4 从第一个字符开始 往后截取4个字符

name=“this is my name”;

echo ${name:1:4} #输出 his

echo ${name::4} #输出 this




五、数组

bash只支持一维数组,不支持多维数组

定义数组:array_name=(li wang xiang zhang) (小括号做边界、使用空格分离)

单独定义数组的元素: array_para[0]=“w”; array_para[3]=“s” (定义时下标不连续也可以)

赋值数组元素:array_name[0]=“zhao”;

获取数组元素:

array_name[0]=“li”

array_name[3]=“zhang”

echo ${array_name[0]} # 输出"li"

echo ${array_name[1]} # 输出" "

echo ${array_name[3]} # 输出"zhang"

echo ${array_name[@]} # 输出"li zhang" 输出数组所有元素,没有元素的下标省略

取得元素个数:${#array_name[@]} 或者 ${#array_name[*]}

取得单个元素长度:${#array_name[1]}




六、参数传递

获取参数值:

$0 : 固定,代表执行的文件名

$1 : 代表传入的第1个参数

$n : 代表传入的第n个参数

$#:参数个数

$*: 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数

$@:与$*相同,但是使用时加引号,并在引号中返回每个参数。

$$:脚本运行的当前进程号

$!:后台运行的最后一个进程的ID

$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$* 与 $@ 区别

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。



七、运算符




1、算数运算

+ 、-、*、\ : 乘号前必须加\进行转义才可以进行乘法运算

加法运算

val=`expr 2 + 2` (使用linux命令expr进行辅助运算)

val=$[2+2] (4个空格不是必要的,不同于条件判断)

val=$((2+2))

2、数字关系运算符

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

下面假定变量 a 为 10,变量 b 为 20

-eq :检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。

-ne: 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。

-gt: 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。

-lt : 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。

-ge: 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。

-le : 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

3、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

= :检测两个字符串是否相等,相等返回 true。 [ “$a” = “$b” ] 返回 false。

!= :检测两个字符串是否相等,不相等返回 true。 [ “$a” != “$b” ] 返回 true。

-z :检测字符串长度是否为0,为0返回 true。 [ -z “$a” ] 返回 false。

-n :检测字符串长度是否为0,不为0返回 true。 [ -n “$a” ] 返回 true。

$ :检测字符串是否为空,不为空返回 true。 [ “$a” ] 返回 true。




4、布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

! :非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。

-o :或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a :与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。




5、逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

&& :逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| :逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true




6、文件运算符

-b file :检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

-c file :检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。

-d file :检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。

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

-g file :检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。

-k file :检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。

-p file :检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。

-u file :检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。

-r file :检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。

-w file :检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。

-x file :检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。

-s file :检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。

-e file :检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。




八、执行相关



1、命令替换

命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

执行命令:

`ls /etc` : 反引号 (所有的unix系统都支持)

$(ls /etc) : $+() (部分unix系统不支持)

多个嵌套使用时,从内向外执行

for file in \s /etc\ 或 for file in $(ls /etc) 循环中使用

`dirname $0` 获取脚本文件所在的目录

path=$(cd `dirname $0`;pwd) : 获取脚本当前所在目录,并且执行cd命令到达该目录,使用pwd获取路径并赋值到path变量




2、算术运算

$[ ] : 加减乘除,不必添加空格

$(( )) :加减乘除等,不必添加空格




3、逻辑判断

[ ] : 中括号旁边和运算符两边必须添加空格 (可以使用,不推荐)

[[ ]]:中括号旁边和运算符两边必须添加空格 (字符串验证时,推荐使用)

(()) : 中括号旁边和运算符两边必须添加空格 (数字验证时,推荐使用)

[[]] 和 (()) 分别是[ ]的针对数学比较表达式和字符串表达式的加强版。

使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

[[ ]]中增加模式匹配特效;

(( ))不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号



4、输出

1、echo:   仅用于字符串的输出,没有使用printf作为输出的移植性好,建议使用printf

2、printf 不会像 echo 自动添加换行符,我们可以手动添加 \n

无大括号,直接以空格分隔

格式:printf format-string [arguments...] 其中(format-string: 格式控制字符串、arguments: 参数列表)

案例:printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

%s %c %d %f 都是格式替代符

d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错!

s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错

c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错

f:Float 浮点 对应位置参数必须是数字型 否则报错

%-10s : 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f :指格式化为小数,宽度为4个字符,其中.2指保留2位小数。

转义符:

\a :警告字符,通常为ASCII的BEL字符

\b :后退

\c :抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略

\f :换页(formfeed)

\n :换行

\r :回车(Carriage return)

\t :水平制表符

\v :垂直制表符

\ :一个字面上的反斜杠字符

\ddd :表示1到3位数八进制值的字符。仅在格式字符串中有效

\0ddd :表示1到3位的八进制值字符

九、转义字符的意义

  1. 表示换行:\n
  2. 表示回车:\r
  3. 表示水平的制表符:\t
  4. 表示垂直的制表符:\v
  5. 表示后退符:\b
  6. 表示”警告”:\a
  7. 翻译成ASCII码为八进制0xx所表示的字符:\0xx
  8. 表示引号(“)用:\”
  9. 表示美元符号($)用:\$
  10. 表示反斜杠(\)用:\\
  11. $(()):对变量进行操作

十、特殊符号的使用

eg:

  a=5;b=5

  s=a+b

  echo $s  输出:a+b

  echo $((a+b))  输出:10

  1. echo $? :看上条语句的命令是成功还是失败 返回0:成功 其余不为0的值为失败

  eg:

  echo false   输出:false

  echo $?      输出:0

  ls sss       输出:ls: cannot access sss: No such file or directory

  echo $?      输出:2

  1. {1. .10} 等价于 seq 1 10,表示1到10 (中间两个连续的点)

eg:  

[root@iZ2zefahl test]# for i in {1..3};do echo $i ;done;

  1

  2

  3

  1. seq 1 3 10 表示生成一个1到10,步进为3

eg:

[root@iZ2zefahl test]# for i in `seq 1 3 10`;do echo $i ;done;

  1

  4

  7

  10

十一、数字型变量操作

1、计算

 [root@iZ2]# i=1;echo $i;echo $((i+1))

  1

  2

只能进行整数计算,不支持浮点数运算

 [root@iZ2zefa]# echo $((1/3))

  0

浮点数运算使用awk

 [root@iZ2zefa]# awk 'BEGIN{print(1/3)}'

  0.333333

格式化展示使用awk ,printf格式化字符串

 [root@iZ2zefahlffrq9ahi3ykd2Z test]# awk 'BEGIN{printf("%.2f\n", 1/3)}'

  0.33

2、更新数值

 [root@iZ2]# i=1

 [root@iZ2]# ((i=i+1));echo $i

  2

十二、字符串操作

1、${value:offset} / ${ value: offset: length} : 从变量中提取子串

 [root@iZ2]# s="hello word"

 [root@iZ2]# echo ${s:6}

  word

 [root@iZ2]# echo ${s:6:3}

  wor

2、${#s} : 获取字符串长度

 [root@iZ2]# echo ${#s}

  10

3、${#array[*]}和${#array[@]}表示数组中元素的个数

 [root@iZ2]# a=(1 2 3 4)

 [root@iZ2]# echo ${#a[*]}

  4

 [root@iZ2]# echo ${#a[@]}

  4

4、掐头去尾与内容替换

${ value# pattern) 或 $(value## pattern) (#表示去头,## : 贪婪匹配)

 [root@iZ2]# s="hello world"

 [root@iZ2]# echo ${s#hell}

  o world

 [root@iZ2]# echo ${s#*l} //匹配到第一个l后,掐掉l以及l之前的字符串。*表示任意多个字符

  lo world

 [root@iZ2]# echo ${s##*l} //贪婪匹配,匹配到最后一个l

  d

5、${ value% pattern} ${ value%% pattern)( %表示去尾 , %%:贪婪匹配)

 [root@iZ2]# s="hello world"

 [root@iZ2]# echo ${s%world}

  hello

 [root@iZ2]# echo ${s%l*} //去尾,*号放后面。*表示任意多个字符

  hello wor

 [root@iZ2]# echo ${s%%l*} //贪婪匹配

  he

6、${ vaue/ pattern/ string} $ {value// pattern/ string} ( /表示替换 )

 [root@iZ2]# s="hello world"

 [root@iZ2]# echo ${s/hello/nohello}

  nohello world

 [root@iZ2]# echo ${s//o/ZZZ}  //所有o替换

  hellZZZ wZZZrld

#与##、%与%%、/与//的区别: 最短匹配模式VS最长匹配模式

十三、判断类型

1、算术判断

 [ 2 –eq 2 ] 相等

 [ 2 –ne 2 ] 不等

 [ 3 –gt 1 ] 大于

 [ 3 –ge 3 ] 大于等于 [ 3 –lt 4 ] 小于

 [ 3 –le 3 ] 小于等于

 (())也可以表示算术比较。((10>=8)) ,((10==10))

 [root@iZ2]# echo $((10>8))

  1

2、字符串比较

 [ str1 = str2 ] 如果两字符串相同,则结果为真

 [ str1 != str2 ] 如果两字符串不相同,则结果为真

 [ -n "$str" ] 如果字符串不是空,则结果为真

 [ -z "$str" ] 如果字符串是空,则结果为真

 //[[ "xxxx" == x* ]] 在表达式中表示0或者多个字符

 //[[ xxx == x?? ]] 在表达式中表示单个字符

 在引用变量的时候要加双引号[ -z "$a"] 否则当a未定义时会语法报错

3、逻辑判断

 [ 2 -ge 1 -a 3 -ge 4 ];echo $? 与

 [ 2 -ge 1 -o 3 -ge 4 ];echo $? 或

 [[ 2 -ge 1 && 3 -ge 4 ]];echo $? 与  //需要[[]]2层括号

 [[ 2 -ge 1 || 3 -ge 4 ]];echo $? 或

 [ ! 2 -ge 1 ];echo $? 非

 [[]]是[]的扩展语法,在老的sh里并不支持。推荐用[]

4、内置判断

 -e file 如果文件存在,则结果为真

 -d file 如果文件是一个子目录,则结果为真

 -f file 如果文件是一个普通文件,则结果为真

 -r file 如果文件可读,则结果为真

 -s file 如果文件的长度不为0,则结果为真

 -w file 如果文件可写,则结果为真

 -x file 如果文件可执行,则结果为真

————————————————







详解:







1、shell特殊变量:

$0 当前脚本的文件名或者解释器。

$n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。

$# 传递给脚本或函数的参数个数。

$* 传递给脚本或函数的所有参数。

$@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,$*的所有参数是一个数据,而$@一个参数就是一份数据

$? 上个命令的退出状态,或函数的返回值

$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

例如:

#!/bin/bash

#shell特殊变量

#$n: $0表示本脚本,$1表示输入的第一个参数:11,$2表示输入的第一个参数:22    

echo "$ 0: $0"

echo "a: $1"

echo "b: $2"

#$*: 输入的参数 11 22

echo "$ *: $*"

#$@: 输入的参数 11 22

echo "$ @: $@"

#$$: shell进程id

echo "$ $: $$"

#$#: 参数个数 2







2、shell中字符串的拼接

#!/bin/bash

#shell字符串的拼接

n1=ab

n2=cd

temp1=${n1}${n2}  #中间不能有空格

temp2="${n1}${n2}"

temp3="${n1}cdefg"

echo "${temp1}"

echo "${temp2}"

echo "${temp3}"

 





3、字符串的截取

${string: start :length}:字符串从左边start开始的位置截取length个字符,如果没有length,就从左边start开始到结束

${string: 0-start :length}:字符串从右边start开始的位置截取length个字符,如果没有length,就从右边数start开始到结束

${string#*chars}:字符串从左边开始的第一个chars开始的位置截取到右边结束,chars本身不在截取范围内

${string##*chars}:字符串从左边开始的最后一个chars开始的位置截取到右边结束,chars本身不在截取范围内

${string%*chars}:字符串从右边边开始的第一个chars开始的位置截取到左边结束,chars本身不在截取范围内

${string%%*chars}:字符串从右边开始的最后一个chars开始的位置截取到左边结束,chars本身不在截取范围内

#!/bin/bash

#shell截取字符串

str=http//:baidu.com/.c

echo "length: ${str:7:5}"   # baidu

echo "no length: ${str:7}"  # baidu.com/.c

echo "length: ${str:0-7:5}"  # .com/

echo "no length: ${str:0-7}" # .com/.c

echo "#: ${str#*/}"   # /:baidu.com/.c

echo "##: ${str##*/}" # .c

echo "%: ${str%/*}"   # http//:baidu.com

echo "%%: ${str%%/*}" # http







4、if基本语法

if [ 条件判断式 ];then

程序

fi

或者

if [ 条件判断式 ]

then

程序

elif [ 条件判断式 ]

then

程序

else

程序

fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格







5、if单分支:

    -eq 等于,如:if [ "$a" -eq "$b" ]

    -ne 不等于,如:if [ "$a" -ne "$b" ]

    -gt 大于,如:if [ "$a" -gt "$b" ]

    -ge 大于等于,如:if [ "$a" -ge "$b" ]

    -lt 小于,如:if [ "$a" -lt "$b" ]

    -le 小于等于,如:if [ "$a" -le "$b" ]

#!/bin/bash

#shell中if:

#if单分支第一中形式:if []

if [ 1 -eq 1 ] #[]里面的数据和中括号必须一个空格

then

        echo "first if:真"

fi

#if单分支第二中形式:if []; then

if [ 1 -eq 1 ]; then #then和if写在同一行必须要用;

        echo "second if:真"

fi

#if单分支第三中形式:if (())

if ((1==1))

then

        echo "third if:真"

fi

 





6、if多分支:

#!/bin/bash

#shell中if:

#if多分支

if ((1==0)) #判断1和o是不是相等

then

        echo "1=0;是真的"

elif ((1>0))

then

        echo "1>0;是真的"

else

        echo "1>0;是假的"

fi

#..............................

if [ 1 -eq 0 ] #判断1和o是不是相等

then

        echo "1=0;是真的"

elif [ 1 -gt 0 ]

then

        echo "1>0;是真的"

else

        echo "1>0;是假的"

fi







7、shell中的 case语句:

#!/bin/bash

#shell中的case

read VAILE #在屏幕中输入一个数,1或者2,如果不是这两个数就代表其他;*),

case ${VAILE} in

        "1")

                echo "我是1"

        ;;

        "2")

                echo "我是2"

        ;;

        *)

                echo "我不是1,也不是2"

        ;;

esac

8、隐藏打印结果

./test.sh 1>/dev/null 2>&1

1>/dev/null是标准输出, 标准输出输出到/dev/null就可以了

2>&1 是错误输出

9、shell脚本输出带颜色的字体

输出特效格式控制:

\033[0m  关闭所有属性  

\033[1m   设置高亮度  

\03[4m   下划线  

\033[5m   闪烁  

\033[7m   反显  

\033[8m   消隐  

\033[30m   --   \033[37m   设置前景色  

\033[40m   --   \033[47m   设置背景色

光标位置等的格式控制:

\033[nA  光标上移n行  

\03[nB   光标下移n行  

\033[nC   光标右移n行  

\033[nD   光标左移n行  

\033[y;xH设置光标位置  

\033[2J   清屏  

\033[K   清除从光标到行尾的内容  

\033[s   保存光标位置  

\033[u   恢复光标位置  

\033[?25l   隐藏光标

\33[?25h   显示光标

特别篇:

1.linux设置shell脚本开机自启

方法一:修改 /etc/rc.d/rc.local 文件  

/etc/rc.d/rc.local  文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要自己的脚本在开机后被运行的话,可以将自己脚本路径加到该文件里。

但是,首先需要确认你有运行这个文件的权限。

$ chmod +x /etc/rc.d/rc.local

为了演示,我们创建了一个脚本,当它被执行之后,将在家目录下写入有特定信息的文件。

$ vim auto_run_script.sh

#!/bin/bash

date >> /home/alvin/output.txt

hostname >> /home/alvin/output.txt

保存退出后,再给它赋予可执行权限:

$ chmod +x auto_run_script.sh

然后,我们再将脚本添加到  /etc/rc.d/rc.local  文件最后一行:

$ vim /etc/rc.d/rc.local

/home/alvin/auto_run_script.sh

接下来,我们就可以试试效果了。直接重启系统就可以了:

$ sudo reboot

重启之后,就会在家目录下看到脚本执行的结果了。

方法二:使用 crontab  

大家知道,crontab 是 Linux 下的计划任务,当时间达到我们设定的时间时,可以自动触发某些脚本的运行。

我们可以自己设置计划任务时间,然后编写对应的脚本。但是,有个特殊的任务,叫作  @reboot  ,我们其实也可以直接从它的字面意义看出来,这个任务就是在系统重启之后自动运行某个脚本。

那它将运行的是什么脚本呢?我们如何去设置这个脚本呢?我们可以通过  crontab -e  来设置。

$ crontab -e

@reboot /home/alvin/auto_run_script.sh

然后,直接重启即可。运行的效果跟上面类似。

2.liunx设置定时执行shell脚本

注:此cron命令适用于CentOS-7(定时任务shell输出结果不能打印在控制台)

(1)服务命令

1.检测cron定时服务是否自启用

systemctl is-enabled crond.service

结果展示如下:

enable表示已启用自启动

disable标识未启用自启动

2.如果未启用,则开启cron自启用

systemctl enable crond.service

3.如果已经启用,想要cron关闭自启动

systemctl disable crond.service

4.查看cron服务的启动状态

[只有cron的状态是active  running的,才表示cron服务是启动的]

systemctl status crond.service

5.启动cron服务[命令没有提示]

systemctl start crond.service

6.停止cron服务[命令没有提示]

systemctl stop crond.service

7.重启cron服务[命令没有提示]

systemctl restart crond.service

8.重新加载cron服务[命令没有提示]

systemctl reload crond.service

(2)操作命令

定时任务:

  *      *        *      *       *       command

minute   hour    day   month   week      command

分          时         天      月        星期       命令

————————————————

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

————————————————

特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

————————————————

1,crontab -e 编辑添加定时任务

2,*/2 * * * * /home/admin/jiaoben/buy/deleteFile.sh 每个两分钟执行一下脚本

3,crontab  -l 查看该用户下的定时任务

4,crontab -u 定某个用户的cron服务

  1. crontab -r 删除没个用户的cron服务

6.查看cron执行日志

tail -f -n 200 /var/log/cron

7,cron文件语法:

      分     小时    日       月       星期     命令

      0-59   0-23   1-31   1-12     0-6     command     (取值范围,0表示周日一般一行对应一个任务)

————————————————

(3)定时任务日志查看 

tail -f /var/log/cron 查看全部的

ps -ef | grep xxx.sh /var/log/cron  查看某个脚本执行日志

(4)定时任务结尾加>dev/null 2>&1

a、标准输入输出设备

/dev/null:是系统的空设备(也就是黑洞)

0:表示标准输入

1:表示标准输出,系统默认是1

2:表示标准错误

b、重定向

2>&1 :把标准错误重定向到标准输出

>/dev/null 2>&1等价于1>/dev/null 2>/dev/null也等价于&>/dev/null

>/dev/null 2>&1 &  ==  1>/dev/null 2>&1 &

/dev/null:表示Linux的空设备文件

>:表示重定向到哪里

&1:&表示等同于的意思,2>&1,表示2的输出重定向等于于1

&:表示后台执行,即这条指令执行在后台运行

1>/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。

2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

c、邮件服务容易导致邮件临时目录中小文件过多

由于CentOS5.x默认安装并开启邮件服务,如查不加>/dev/null 2>&1,有可能产生大量输出信息,导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量inode节点。CentOS6.x虽然默认不安装邮件服务,但有可能以后会手动安装邮件服务,也会导致上述问题。

3.查看磁盘占用情况

df -ah  整体预览

du -sh * | sort -n 查看当前目录下的

du -h --max-depth=1 |grep 'G' |sort  查看上GB的目录并且排序

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值