shell 基础与进阶 01

shell

1.查看shell

echo $SHELL

/ 根目录
/bin 存放常用命令
/boot 存放开机文件和启动文件
/dev 存放硬件设备文件和驱动文件
/etc  存放系统服务配置文件
/home 普通用户家目录
/mnt  用来挂载使用的目录
/var  存放日志目录
/lib /lib64 存放系统库文件
/root  root用户家目录
/tmp  存放临时文件
/proc  存放进程文件和系统信息
/sbin  存放管理命令
/usr  存放帮助手册和系统应用程序
/opt  存放应用软件

2.变量的设置规则

1,变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写,便于区分。
2,在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
3,变量用等号连接值,等号左右两侧不能有空格。
4,变量的值如果有空格,需要使用单引号或者双引号包括。

3.使用

# 定义变量
a=123
b=zs
# 调用标量
$
# 查看变量
echo $a
# 把这两个变量合起来
c=$a$b  # 结果为:123zs  # 不推荐
c=${a}${b}  # 推荐
c="$a""$b"  # 推荐 要是双引号
d=$a+$b  # 结果为:123+zs

# 环境变量
export 变量名=变量值
作用域:当前shell以及所有的子shell

4.位置参数名

# 注意使用 单''(表示的是字符串) 和 双 ""(会对里面的东西进行翻译一次)
# $n  n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,十以上的参数需要用大括号包含,如${10}。

# $*  代表命令行中所有的参数,把所有的参数看成一个整体。以"$1 $2 … $n"的形式输出所有参数

# $@  代表命令行中的所有参数,把每个参数区分对待。以"$1" "$2" … "$n" 的形式输出所有参数

# $#  代表命令行中所有参数的个数。添加到shell的参数个数

# 编写脚本 2.sh

#!/usr/bin/bash
echo '$0'=$0  # 2.sh
echo '$1'=$1  # a
echo '$2'=$2  # b

echo '\$*'=$*  # a b c d e
echo '\$@'=$@  # a b c d e
echo '\$#'=$#  # 5

for i in "$*"  # a
do # 执行		 # b 
echo $i		   # ....
done  # 结束

echo '@'  
for i in "$@"  # a b c d e
do
echo $i
done

# 调用脚本
bash 2.sh a b c d e
# 得到的结果看上面
$*$@的区别
$*$@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"$1" "$2""$n" 的形式输出所有参数
当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2$n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2""$n" 的形式输出所有参数

# shift
shift指令:参数左移,每执行一次,参数序列顺次左移一个位置,$# 的值减1,用于分别处理每个参数,移出去的参数不再可用

# 脚本3.sh
#!usr/bin/bash
echo '$1'=$1  # a
echo '$2'=$2  # b
echo '$3'=$3  # c
echo '\$#'=$#  # 4

shift  # 把第一个参数a移除掉

echo '$1'=$1  # b
echo '\$#'=$#  # c
# 执行脚本 bash 3.sh a b c d
# 执行得到的结果上看面

5.预定义变量

# $?  执行上一个命令的返回值,执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
# $$  当前进程的进程号(PID),即当前脚本执行时生成的进程号
# $!  后天运行的最后一个进程号(PID),最近一个被放入后台执行的进程  &

# 脚本1.sh
#!/usr/bin/bash
pwd
echo '\$?'=$?  # 0
echo '\$$'=$$  # 进程号
echo '\$!'=$!
# 执行脚本
bash 1.sh
# 得到结果

# && 和 || 的使用
bash 1.sh && echo $?  # 当前面的bash 1.sh执行成功后,后面的echo $?才会执行
bash 2.sh || echo $?  # 不管前面的bash 2.sh是否执行成功,后面的echo #?都会执行
bash 2.sh ;echo $? # 和 || 一样

# 组合使用
bash 1.sh && echo success || echo failed
# 当前面的bash 1.sh执行成功,会显示success,不成功会显示failed

5.read的使用

read [选项]read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) –s(隐藏输入)  
# 脚本 read.sh
#!/usr/bin/bash

read -t 30 -p 'please input your name:' name1 name2  # 等待30秒你输入名字,输入后的名字赋值给name
echo $name1 $name2  # 打印name

read -t 30 -sp 'please input your age:' age  # 隐藏输入age别人看不到,输入后的年龄赋值给age
echo $age  # 打印age

# read2.sh
#!/usr/bin/bash
read -t 30 -p 'please input your name:' name1 name2 # 等待30秒你输入名字,输入后的名字赋值给name1,name2
echo $name1 $name2

read -t 30 -sp 'please input your age:' age
echo $age

read -t 30 -n 1 -p 'please imput your gender[m|f]:' gender  # 只能输入一个字符
echo $gender

6.运算符

# 格式:expr m + n 或$((m+n)) 注意 expr 运算符要有空格
expr 命令:对整数型变量进行算术运算
(注意:运算符前后必须要有空格)
expr 3 + 5
expr 3 - 5
echo `expr 10 / 3`
expr 3 \* 5
`expr \`expr 3 + 5\` \* 3`

# 推荐,使用起来方便,不需要转义
$((3 + 5))
$((3 - 5))
$((10 / 3))
$((3 * 5))
$(((3 + 5) * 3))

7.** ( ) ∗ ∗ 与 ()**与 (){}的区别

$()的用途和反引号``一样,用来表示优先执行的命令
echo $(cat a.txt)

${}就是取变量了 echo ${PATH}

$((运算内容))适用于数值运算
echo $((3 + 1 * 4))

8.条件判断test

8.0.test使用
# 内置test美丽常用操作符[]表示,将表达式写在p[]中,如下:
[ expression ] 或者 test expression
注意:expression 首尾都有个空格
[ ];echo $?
测试范围:整数、字符串、文件
表达式的结果为真,则test的返回值为0,否则为非0
当表达式的结果为真时,则变量$?的值就位0,否则为非0
8.1.字符串测试
# 字符串你测试
test str1 == str2  # 测试字符串是否相等
test str1 != str2  # 测试字符串是否不相等
test str1  # 测试字符串是否不为空,不为空,true,false,不为空时返回true
test -n str1  # 测试字符串是否不为空
test -z str1  # 测试字符串是否为空

# 例如
num1=1
num2=2
num3=
test $num1 == $num2;echo $?  # 1 表示错误
test $num1 != $num2;echo $?  # 0 表示正确
test $num1;echo $?  # 0 表示正确,不为空
test $num3;echo $?  # 1 表示为空
test -z $num3;echo $?  # 0 为空时,表示正确

# []
[ $num1 == $num2];echo $?
8.2.整数测试
# 整数测试
test   int1 -eq  int2    测试整数是否相等 equals
test   int1 -ge  int2    测试int1是否>=int2
test   int1 -gt  int2    测试int1是否>int2
test   int1 -le  int2    测试int1是否<=int2
test   int1 -lt  int2    测试int1是否<int2
test   int1 -ne  int2    测试整数是否不相等

# 例如
[ 13 -ge 12];echo $?  # 0  表示正确
[ 13 -ge 15];echo $?  # 1  表示不正确
8.3.文件测试
# 文件测试
test  -d  file     指定文件是否为目录(即是否为文件夹)
test  –e  file     文件是否存在 exists
test  -f  file     指定文件是否常规文件(即是否为文件)
test –L File     文件存在并且是一个符号链接 (即是否为一个链接)

test  -r  file    指定文件是否可读
test  -w  file    指定文件是否可写
test  -x  file    指定文件是否可执行

# 例如
[ -d a ];echo $?  # 0 表示a是文件件
[ -f 1.txt ];echo $?  # 0 表示1.txt是文件
8.4.多重条件测试
# 条件1 –a 条件2 逻辑与  两个都成立,则为真
[ -d a -a -f 1.txt] && echo success || echo failed  

# 条件1 –o 条件2 逻辑或 	只要有一个为真,则为真
[ -d a -o -f 1.txt] && echo success || echo failed  

# ! 条件			逻辑非	取反
[ ! -d a ] && echo success || echo failed  

9.流程控制语句

9.1.if/else
if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
elif  [ 条件判断式2 ]  
    then      
        当条件判断式2成立时,执行程序2
...省略更多条件
else  # 不加then
    当所有条件都不成立时,最后执行此程序
fi  # 结束符

# 比较数值,使用(()),例如
#!/bin/bash
NUM1=${1}
NUM2=${2}

if ((${NUM1} > ${NUM2}));then
        echo "num1 > num2"
else
        echo "num1 < num2"
fi


# 脚本if.sh
#!/usr/bin/bash
read -t 30 -p "please your name:" name
echo $name

if [ $name == zs ]
	then 
		echo "zszszs"

elif [ $name == lisi ];then  # 也可以用这种语法
	echo "lisilisi"	
else
	echo "fengjie"
fi
9.1.1 调试sh脚本
sh -x 1.sh
9.2.case
# 脚本case.sh
#!/usr/bin/bash
a=$1

case "$a" in

zs) echo "zs"
;;

lisi) echo "lisi"
;;

*) echo "ww"

esac

# 启动脚本
bash case.sh zs
9.3.for循环
第一种:
for N in 1 2 3 
do
	echo $N
donefor N in 1 2 3; do echo $N; donefor N in {1..100}; do echo $N; done  # 这个可以从1到100

for N in `seq 1 100`;do echo $N; done  # ``里面执行命令,获取结果

第二种:
for ((i = 0; i <= 5; i++))  # i+=2
do
	echo "welcome $i times"
donefor ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

# 脚本for.sh
#!/usr/bin/bash

for((i=1;i<=10;i+=2))
do 
echo $i
done

sum=0
for((i=1;i<=100;i++))
do 
sum=$(($sum + $i))  # 计算
done
echo "sum="$sum
9.4.while
while expression
do
commanddone

# 脚本while.sh
while 2>1;do sleep 1;echo 1;done  # 条件不能加空格
while [ 2 -ge 1 ];do sleep 1;echo 1;done 

while [ 2 -ge 1 ]
do
echo 1
sleep 1
done

# 计算1到100的和
#!/usr/bin/bash
i=0
sum=0
while(($i<=100))
do
sum=$(($sum + $i))
i=$(($i + 1))
done
echo "sum="$sum

10.自定义函数

# vim 编译, 冒号进入,查看多少行 set nu,然后再冒号,再输入行数
如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
# 脚本func.sh
#!/usr/bin/bahs

function stop() {  # 定义函数
echo "stoping"
echo $1  # 局部变量,调用的时候传进来
return 12
}

function start() {
echo "starting"
}

stop $1  # 调用函数

# 执行脚本
bash func.sh a;echo $?
stoping 
a
12

字符串

运算符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

格式化
printf "%d %s\n" 1 "abc"

11.脚本调试

sh -x script
这将执行该脚本并显示所有变量的值。
在shell脚本里添加  
set -x  对部分脚本调试
sh -n script
不执行脚本只是检查语法的模式,将返回所有语法错误。
sh –v script
执行并显示脚本内容

12.四剑客

12.0.find
  • Find工具的语法格式:find paht(路径) -options(参数) action(动作)
  • PATH路径:可以任意路径,绝对路径,相对路径(/, /etc/, /home/)
  • options参数:-name(按照名称寻找),-type(类型),-mtime(时间),-size(大小),-perm(权限)等
  • Action动作:exec(承接),xargs(承接),print(打印)等;
# 查找以conf结尾,以us开头,不要us428.conf的文件,!表示否
find / -name *conf -name us* ! -name us428.conf 
# 拷贝查找到的文件
for I in `find / -name *conf -name us* ! -name us428.conf`;do
cp $I /tmp/;done

for I in $( find / -name *conf -name us* ! -name us428.conf );do
cp $I /tmp/;done
12.0.1.exec
#exec {}表示的就是find查找的结果 ,后面的\ 表示结束符
find / -name *conf -name us* ! -name us428.conf -exec cp {} /tmp/ \;
12.0.2.xargs
#xargs 可以理解把查找的结果转换为一个数组
find / -name *conf -name us* ! -name us428.conf | xargs
# -i表示参数传递,xargs的用法,把find找到的结果传递给{}
find / -name *conf -name us* ! -name us428.conf | xargs -i cp {} /tmp/;
# 删除,把前面的结果都进行删除
find /tmp/ -name *conf -name us* ! -name us428.conf | xargs -i rm -rf {};
find /tmp/ -name *conf -name us* ! -name us428.conf | xargs rm -rf;  # 此时可以省略
12.0.3.type
#type, f(文件),d(目录)等
find / -name nginx -type f;
# 查看权限
find / -name nginx -type f -exec ls -l {} \;
12.0.4.size
#size, 查找大于10M,小于20M
find / -name "*log" -size +10M -size -20M;
# 查看文件的大小
find / -name "*log" -size +1M -size -20M -exec du -sh {} \;
12.0.5.mtime
#mtime
-mtime -n +n  # 按文件更改时间来查找文件,-n指n天以内,+n指n天以前
# 查找30天以内的所有日志为念,并查看其信息
find / -name "*.log" -mtime -30 -type f -exec ls -l {} \;
# 删除30天以前的日志
find / -name "*.log" -mtime +30 -type f -exec rm -rf {} \;
12.0.grep
  • Grep工具的语法格式:grep -options(参数) word(字符) file(文件);
  • option参数:-a(文本形式,默认),-c(统计),-i(忽略大小写),-v(取反|排除),-n(行号),-o(打印匹配词),-E(扩展参数|egrep),-A(after匹配之后行),-B(before匹配之前行),-C(context 匹配前和后的行)等
  • File文件:匹配的对象,从什么地方进行匹配,文本文件,输出结果;
-a:文本形式,默认
-c:计算找到的符合行的次数
-i:忽略大小写
-n:行号
-v:取反|排除
-h:查询多文件时不显示文件名
-l:查询多文件时只输出包含匹配字符的文件名
-s:不显示不存在或无匹配文本的错误信息
-o:打印匹配词, 正则匹配的结果
-E:扩展参数|egrep ,正则表达式
-A:after匹配之后行
-B:before匹配之前行
-C:context 匹配前和后的行

# 查询多文件
grep "hello" 1.txt 2.txt
grep "nginx" $( find /etc/nginx/ -type f )
find /etc/nginx/ -type f -exec grep "nginx" {} \;

# -w 表示把80看成一个词,来进行寻找
netstat -nlp | grep -w 80

# -o 匹配ip, sort表示排序,uniq去重,head -3 取前三个
ifconfig | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq | head -3

# 正则,^$表示空行
ifconfig | grep -E "[0-9]{1,3}"  # 里面写正则表达式
grep -vE "#|^$" 1.txt
12.1.cut
cut [选项]  文件名        默认分割符是制表符
选项:
    -f 列号:    提取第几列
    -d 分隔符:    按照指定分隔符分割列

# 以:为分隔符,取1,2,3列
cut -d: -f 1,2,3 /etc/passwd
cut -d ":" -f 1,2,3 /etc/passwd

cut -f  2  aa.txt   提取第二列
cut -d: -f 1,3 /etc/passwd  以:分割,提取第1和第3列
cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1    获取所有可登陆的普通用户用户名
cut的局限性    不能分割空格   df -h  不能使用cut分割
df -h | grep sda1 | cut -f 5
12.2.awk
  • AWK工具的语法格式:awk -option ‘pattern + {action}’ file;
  • AWK语法中option参数:-F(格式化),-f(文件),-v(变量),-V(版本)等;
  • AWK语法中action参数:>, >>, print(打印输出),是AWK工具默认的动作;
12.2.0.awk初步使用
awk -F分隔符 '/正则表达式/ {执行动作}' 文件名  # 默认分隔符是空格

awk '/^/ {print $1,$2}' 2.txt
awk '{print $1,$2}' 2.txt  # 省略了正则表达式,表示该结果的所有
awk -F: '{print $1}' 1.txt  # 打印第一列,以:作为分隔符

BEGIN  在所有数据读取之前执行
awk 'BEGIN {printf "first Line \n"} {printf $2 }' aa.txt     在输出之前使用BEGIN输出内容

END 在所有数据执行之后执行
awk 'END {printf "The End \n"} {print $2}' aa.txt   所有命令执行完后,输出一句
# 打印印含root的的信息
df -h | awk '/root/ {print $0}'  # $0可以省略
df -h | awk '/root/ {print $1,$2}'

# 不写正则表示匹配所有
df -h | awk '{print}'

# 以空格,冒号,\t,分号为分割
awk -F'[:\t;]' '{print $1}' 1.txt
12.2.1.awk基本语法参数详解
  • 单引号’'是为了和shell命令区分开
  • 大括号{}表示一个命令分组
  • pattern是一个过滤器,表示匹配pattern条件的才进行action处理
  • action处理动作,常见动作为print
  • 使用#作为注释,pattern和action可以只有其一,但不能两者都没有
12.2.2.awk内置变量详解
  • FS分隔符,默认是空格
  • OFS输出分隔符
  • NR当前行数,从1开始
  • NF当前记录字段个数
  • $0当前记录
  • $1~$0当前记录第n个字段(列)
# 显示最后一列和倒数第二列
df -h | awk '{print $NF, $(NF-1)}' 

# 使用sed把:改为空格,然后使用awk
sed 's/\:/ /g' passwd | awk '{print $1}'

# 拼接字符 使用"",里面","表示空格
df -h | awk '{print NR":",$5}'

# 打印第1行至第三行
awk 'NR==1,NR==3 {print $0}' passwd  # 1至3行
awk 'NR==1;NR==3 {print $0}' passwd  # 只显示1和3行
awk 'NR>=2 {print $1}' passwd  # 从第二行开始显示
12.2.3.awk内涵函数详解
  • gsub(r,s):在$0中用s代替r
  • index(s,t):返回s中t的第一个位置
  • length(s):s的长度
  • match(s,r):s是否匹配r
  • split(s,a,fs):在fs上将s分成序列a
  • substr(s,p):返回s从p开始的子串
12.2.4.awk常用操作符,运算符及判断符
  • +±- 增加与减少(前置或后置)
  • ^** 指数(右结合性)
  • !± 非,一元(unary)加号,一元减号
  • ±*/% 加减乘除余数
  • < <= == != > >= 数组比较
  • && 逻辑and
  • || 逻辑or
  • = += -= *= /= 赋值
12.2.5.awk与流程控制语句
  • if(condition) {} else {}
  • while {}
  • do {} while {condition}
  • for (init;condition;step) {}
  • break/continue
# awk引用shell变量,使用-v或者双引号+单引号即可
awk -v WEB=http '{print WEB,$1}' /etc/passwd
WEB=http;awk '{print "'$WEB' "$1}' /etc/passwd

# 1一直加到10的和
seq 1 10 | awk 'BEGIN {ABC=0} {ABC+=$1}END{print ABC}'

# awk NR 行号除以2余数为0则跳过改行,继续执行下一行,打印在屏幕
awk -F: 'NR%2==0 {next} {print NR, $1}' /etc/passwd

# 条件语句
echo 1 2 3 | awk '{ if(($1>$2)||($2>$3)) {print $1} else {print $2} }'
12.3sed
语法:sed [选项] '[动作]' 文件名
sed '/正则表达式/命令(a c d i p g)' 文件名
常用选项:
-n  使用安静(silent)模式。显示经过sed特殊处理的数据。
-e  允许多点编辑。
-i  直接修改读取的档案内容,而不是由屏幕输出。
命令功能描述
a\新增, a 的后面可以接字串,在下一行出现
c\替换
d删除
i\插入, i 的后面可以接字串
p打印
s查找并替换,例如 1,20s/old/new/g
df -h | sed -n '1p'	接收命令结果数据
# s 字符串替换
sed 's/it/edu360/g' sed.txt  把sed.txt文件中的it替换为edu360,并输出
sed -e '1s/1/34/g;3s/yangmi/xx/g' sed.txt 	同时进行多个替换,把第1行和第3行进行替换
sed -e '1s/1/32/g' -e '3s/yangmi/xx/g' sed.txt
sed –i 's/it/edu360/g' sed.txt   	要想真正替换,需要使用-i参数

# p 打印
sed '2!p' sed.txt    # 显示第二行和所有数据
sed -n '2,5p' nginx.conf   # 显示2到5行
sed -n '2,5!p' nginx.conf   # 表示不显示2到5行的数据
sed -n '/^error_log/p' nginx.conf

# i 插入
sed '4i fengjie canglaoshi' nginx.conf # 在第4行之前添加数据
sed '/error_log/'i"hello world" nginx.conf # 在匹配到数据之前添加数据

# a 追加,在下一行出现
sed '2a liuyifei'sed.txt 在第二行后面添加数据
sed '/error_log/'a"hello world" nginx.conf

# c 替换
sed '2c this is replace'sed.txt 替换第二行数据
sed '/error_log/'c"hello world" nginx.conf
sed 's/error_log/hello world/g' nginx.conf

# d 删除
sed '2,5d' nginx.conf  # 删除2到5行
sed '/\#/d;/^$/d' nginx.conf  # 表示把#与空行删除掉,这里不是真正的删除

# & 添加数据
# 在nginx.conf查找error_log的行,在其行首添加字符串hello,^表示起始标识,$表示最后,&在sed中表示添加
# /^error_log/ 这一行先进行匹配,在把匹配的结果给s/^/&hello/g进行处理
sed "/^error_log/s/^/&hello/g" nginx.conf
sed -n "/^error_log/p" nginx.conf | sed "s/^/&hello/g"

sed "/^/s/^/&\#/g" nginx.conf  # 表示所有行前面都加上"#"
sed "s/^/&\#/g" nginx.conf # 表示所有行前面都加上"#"

# N 合并行
sed "N;s/\n/ /g" nginx.conf  # 以每2行一合并
sed "N;N;s/\n/ /g" nginx.conf  # 以每3行一合并

综合使用

# 查找范围 ,09:00-10:00,统计有多少行
sed -n '/2020:09:00/,/2020:10:00/'p nginx.log | wc -l
awk '/2020:09:00/,/2020:10:00/' nginx.log | wc -l

sort和uniq

cat 1.txt | sort | uniq -c | sort -n  
# uniq -c 统计重复的次数,sort -n 按照次数排序 -nr(倒叙) 

13.定时任务

# crontab
crontab命令格式
作用:用于生成cron进程所需要的crontab文件
crontab的命令格式
# crontab -e    
使用编辑器编辑当前的crontab文件。
  crontab文件格式
minute hour  day-of-month  month-of-year  day-of-week  commands
分< >< >< >< >星期< >要运行的命令     < >表示空格
其中
    Minute              一小时中的哪一分钟     [0~59] 
    hour                  一天中的哪个小时        [0~23] 
    day-of-month    一月中的哪一天           [1~31] 
    month-of-year   一年中的哪一月           [1~12] 
    day-of-week      一周中的哪一天           [0~6]     0表示星期天
    commands         执行的命令 

书写注意事项
1,全都不能为空,必须填入,不知道的值使用通配符*表示任何时间
2,每个时间字段都可以指定多个值,不连续的值用,间隔,连续的值用-间隔。
3,命令应该给出绝对路径
4,用户必须具有运行所对应的命令或程序的权限
如何使用crontab 运行多个任务:
方法1:在crontab -e 里 写多个
输入命令  crontab –e  

# 例如
分钟   小时   天   月   星期   命令/脚本
示例:
eg:4点备份
0      4        *      *     *

eg:每周二,周五,下午6点  的计划任务
0     18       *      *     2,5

eg:1到3月份,每周二周五,下午6点的计划任务
0     18       *     1-3   2,5

eg:周一到周五下午,5点半提醒学生15分钟后关机
30   17      *       *     1-5   /usr/bin/wall < /etc/issue
45   17      *       *     1-5  /sbin/shutdown -h now

eg:学校的计划任务, 12点14点,检查apache服务是否启动
*/2  12-14  *   3-6,9-12   1-5   
eg:再添加一个备份,把/etc目录备份到/backup下,然后把错误的情况也记录下来,正确的文件都丢到/dev/null下,看不见(相当于一个黑洞)
*/2  12-14  *   3-6,9-12   1-5   /bin/cp -r /etc  /backup/etc.20170407 2> /backup/etc.bak.err 
/dev/null

eg:每月 1、1 0、2 2日的4:45运行/apps/bin目录下的backup.sh
45  4  1,10,22  *  * /apps/bin/backup.sh

eg:每周六、周日的 1 : 10运行一个find命令
10  1  *  *  6,0  /bin/find -name "core" -exec rm {} \;

eg:在每天 18:00至23 :00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh
0,30  18-23  *  *  * /apps/bin/dbcheck.sh

eg:每星期六的 11:00 pm运行/apps/bin目录下的qtrend.sh
0  23  *  *  6  /apps/bin/qtrend.sh

14.history

history 历史命令
功能:帮助用户回忆执行过的命令
-c 清楚所有历史命令
-w 把缓存中的历史命令写入历史命令保存文件~/.bash_history
!命令号 执行这条历史命令
!字符串 执行以该字符串开头的最近的一条历史命令

历史命令默认会保存1000条,可以在环境变量配资文件/etc/profile中进行修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值