Shell学习笔记
1.shell中输入输出重定向,>、>>、<、<<、>/dev/null、2>&1、<<end、<<EOF等
> :覆盖
>>:追加
https://blog.csdn.net/qq_31073871/article/details/80810306?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&utm_relevant_index=2
^a :以a开头,前边不能加输出行号(-n)
a$ :以a结尾,前边可以加输出行号(-n)
文件描述符
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:
| 类型 | 文件描述符 | 默认情况 | 对应文件句柄位置 |
|---|---|---|---|
| 标准输入(standard input) | 0 | 从键盘获得输入 | /proc/self/fd/0 |
| 标准输出(standard output) | 1 | 输出到屏幕(即控制台) | /proc/self/fd/1 |
| 错误输出(error output) | 2 | 输出到屏幕(即控制台) | /proc/self/fd/2 |
所以我们平时在执行shell命令中,都默认是从键盘获得输入,并且将结果输出到控制台上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。比如我们将1指向文件,那么标准的输出就会输出到文件中。
输出重定向
输出重定向的使用方式很简单,基本的一些命令如下:
| 命令 | 介绍 |
|---|---|
| command >filename | 把标准输出重定向到新文件中 |
| command 1>filename | 同上 |
| command >>filename | 把标准输出追加到文件中 |
| command 1>>filename | 同上 |
| command 2>filename | 把标准错误重定向到新文件中 |
| command 2>>filename | 把标准错误追加到新文件中 |
我们使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。
cat:查看文件的内容、连接文件、创建一个或多个文件和[重定向](https://so.csdn.net/so/search?q=重定向&spm=1001.2101.3001.7020)输出到终端或文件 用法:cat [选项] [文件]
\1. $ cat hello.txt
显示hello.txt文本文件中的内容
\2. $ cat -n file
-n选项,可以显示文件的内容和行号
\3. $ cat -b file
-b选项,与-n类似,但只标识非空白行的行号(空白行仍显示)
\4. $ cat -e file
-e选项,将在每一行的末尾显示“$”字符,在需要将多行内容转换成一行时非常有用。
\5. $ cat
只输入cat命令的话,它只是接收标准输入的内容并在标准输出中显示,所以在输入一行并按回车后会在接下来的一行显示相同的内容。
如:$ cat
hello world!
hello world!
$
重定向的话:
$ cat >hello
hello world!
(ctrl+D组合键退出,输入的内容 hello world! 会写入到文件hello中)
$ cat hello
hello world!
$
重定向操作符有两个: >和>>,前者是内容覆盖,后者是在文件的最后追加。
\6. 连接多个文件的内容到一个新文件
$ cat test test1 > test2
$ cat test2
结果将显示test和test1中的内容。
shell变量
1.本地变量
变量被单引号和双引号引起来的区别:单引号直接输出,单引号里面是啥会原字符串输出,双引号先解析里面的内容然后再输出。
2.全局变量(当前系统下所有环境都生效的变量)
使用env可以查看当前系统下所有的全局变量
env |grep 变量 查看全局变量的值
定义方式:
方法一: 变量=值
export 变量
方法二:export 变量=值(最常用)
3.内置变量(bash内部直接定义好的特殊参数,我们可以直接拿过来用)。
man bash 查看内置变量
$0 获取当前脚本文件名
$n 获取当前执行脚本的第n个参数值,n大于10,用${10}
$? 获取当前脚本上一条命令的返回值,执行成功返回0,执行失败非0
$# 获取当前脚本参数总个数
## 精确截取
格式:${变量名:起始位置:截取长度} 注意:第一个位置从0开始
echo ${file:0-8,3} 从倒数第八个开始截取3个字符。
默认值
v a r : − s t r i n g , {var:-string}, var:−string,{var:+string}, v a r : = s t r i n g , {var:=string}, var:=string,{var:?string}
1. ${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
2. ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
3. ${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
命令变量
( ) 和 反 引 号 推 荐 使 用 ()和反引号 推荐使用 ()和反引号推荐使用()使用命令变量。
删除变量
unset 变量名
第二章 shell核心知识
2.1.1测试语句
应用场景
判断条件是否成立
语句格式
A test 条件表达式
[root@zh ~]# test 1 = 1
[root@zh ~]# echo $?
0
B 【 条件表达式 】(推荐)
[root@zh ~]# [ 1 = 1 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 = 2 ]
[root@zh ~]# echo $?
1
注意:[]和条件表达式之间有空格隔开,=两边有空格
2.1.2 条件表达式
逻辑表达式
逻辑表达式常用于多个条件之间
常用的逻辑符号 && 和 ||
[root@zh ~]# [ 1 = 1 ] && echo "条件成立"
条件成立
[root@zh ~]# [ 1 = 2 ] && echo "条件成立"
[root@zh ~]# [ 1 = 2 ] || echo "条件不成立"
条件不成立
文件表达式
-f 是否是个文件
[root@zh ~]# [ -f a.sh ] && cat a.sh
-d 是否是个目录
#判断是否有backup这个目录,如果没有这个目录就创建该目录
[root@zh ~]# [ -d backup ] || mkdir backup
[root@zh ~]# ls
apache-maven-3.3.9 appconf.conf a.sh backuo backup b.sh dumplog.sh jdk1.8.0_11 read.sh test.txt
-x 是否有执行权限
[root@zh ~]# [ -x a.sh ] && ./a.sh
else
数值表达式
-gt -lt -eq -ne -le -ge
注意:生产中ne和eq使用的频率较高
[root@zh ~]# [ 1 -eq 2 ]
[root@zh ~]# echo $?
1
[root@zh ~]# [ 2 -eq 2 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 -ne 2 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 -le 2 ]
[root@zh ~]# echo $?
0
字符串表达式
字符串内容是否一致
一致 ==
不一致 !=
[root@zh ~]# [ aaa == aaa ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ aaa == bbb ]
[root@zh ~]# echo $?
1
2.1.3 计算表达式
计算格式
格式一:$(())
注意:括号里面的空格没事
[root@zh ~]# echo $((1+3))
4
格式二:let 变量名a=变量名a+1
[root@zh ~]# a=1
[root@zh ~]# let j=a+4
[root@zh ~]# echo $j
5
[root@zh ~]# let j= a + 4
-bash: let: j=: syntax error: operand expected (error token is "=")
注意:对于let表达式必须是个整体,不能有空格
2.1.4 数组操作
数组简介
bash支持一维数组,不支持多维数据,并且没有限定数组的大小。数组元素的下标从零开始计算。获取数组元素要利用下标,下标可以是整数或者表达式,其值应该大于或者等于0
定义格式
array_name=(val1…valn)
值之间使用空格进行隔开
#单行定义
[root@zh ~]# arr1=(a b c)
#多行定义
[root@zh ~]# arr2=(
> q
> e
> )
#单元素定义
[root@zh ~]# arr3[1]=nihao
[root@zh ~]# arr3[2]=d
[root@zh ~]# echo ${#arr3[@]}
2
[root@zh ~]# echo ${!arr3[@]}
1 2
信息查看
数组获取方式
查看内容
[root@zh ~]# echo ${arr1[0]}
a
[root@zh ~]# echo ${arr1[1]}
b
[root@zh ~]# echo ${arr1[*]}
a b c
[root@zh ~]# echo ${arr1[@]}
a b c
获取下标
[root@zh ~]# echo ${!arr1[@]}
0 1 2
获取数组长度
[root@zh ~]# echo ${#arr1[@]}
3
[root@zh ~]# echo ${#arr2[@]}
2
增删改
增
[root@zh ~]# arr3[1]=nihao
[root@zh ~]# arr3[2]=d
获取元素
[root@zh ~]# arr3[12]=sdsddgfgfhghgjhkkj
[root@zh ~]# echo ${arr3[11]}
[root@zh ~]# echo ${arr3[12]}
sdsddgfgfhghgjhkkj
[root@zh ~]# echo ${arr3[12]:2:4}
sddg
改
元素整体替换
[root@zh ~]# arr3[12]=gaile
[root@zh ~]# echo ${arr3[12]}
gaile
元素部分替换
[root@zh ~]# echo ${arr3[12]/ai/haha}
ghahale #并没有真正修改
[root@zh ~]# echo ${arr3[12]}
gaile
删除
部分删除
[root@zh ~]# unset arr3[12]
[root@zh ~]# echo ${arr3[12]}
整体删除
[root@zh ~]# echo ${arr1[@]}
a b c
[root@zh ~]# unset arr1
[root@zh ~]# echo ${arr1[@]}
重定向
将左侧内容以覆盖的方式输出到右侧文件中。
将左侧内容以追加的方式输出到右侧文件中。
管道符 |
信息传递使用的
使用格式
命令1 | 命令2 将管道符左侧的内容传递到管道符右侧的命令去使用
其他符号
& 将一个命令从前台转移到后台去执行。
使用格式:
命令 &
后台展示 &
信息符号
2 错误信息
1 正确信息
2>&1 所有信息
特殊设备
/dev/null 黑洞,将一些无用信息输出到其中丢弃
/dev/zero 写入它的输出会丢失不见 ,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件
简单流程控制
if语句
if [ 条件 ]
then
指令
fi
if [ 条件 ]
then
指令1
else
指令2
fi
#!/bin/bash
if [ $1 == "nan" ]
then
echo "性别男"
else
echo "性别女"
fi
if [ 条件 ]
then
指令1
elif [ 条件 ]
then
指令2
else
指令3
fi
#!/bin/bash
if [ "$1" == "start" ]
then
echo "服务启动中"
elif [ "$1" == "stop" ]
then
echo "服务关闭中"
elif [ "$1" == "restart" ]
then
echo "服务重启中"
else
echo "脚本$0的使用方式:/bin/bash $0 [ start | stop |restart ]"
fi
case语句
case 变量 in
值1)
echo 1
;;
值2)
echo 2
;;
值3)
echo 10
;;
*)
echo else
;;
esac
注意:分号不能少
#/bin/bash
case $1 in
"start")
echo "服务启动中"
;;
"stop")
echo "服务停止中"
;;
"restart")
echo "服务重启中"
;;
*)
echo "脚本$0的使用方式:/bin/bash $0 [ start | stop |restart ]"
;;
esac
循环语句
1)for语句
for i in $(ls /root)
do
echo $i
done
2)while语句
#!/bin/bash
a=2
while [ $a -lt 5 ]
do
echo $a
a=$(($a+1))
done
3)until语句
只要条件不成立,就一直运行下去
#!/bin/bash
a=1
until [ $a -eq 5 ]
do
echo $a
a=$(($a+1))
done
循环退出
break 跳出所有循环
#!/bin/bash
# 脚本进入死循环,直到用户输入的数字大于5
while :
do
echo -n "请输入您的数字,最好在1-5之间"
read anum
case $anum in
1|2|3|4|5)
echo "您输入的数字为:$anum"
;;
*)
echo "您输入的数字不在范围内,退出"
break
;;
esac
done
while : 表示死循环
break n 跳出第n个循环 跳出嵌套循环
#!/bin/bash
#break n 演示
for var1 in {1..5}
do
for var2 in {0..4}
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo " $var1 $var2 "
fi
done
done
-a 就是&&意思,两个条件同时满足才往下执行
演示结果:
[root@zh ~]# /bin/bash breakn.sh
1 0
1 1
1 2
1 3
1 4
continue 跳出当前循环
#!/bin/bash
while :
do
echo -n "请输入您的数字,最好在1-5之间"
read anum
case $anum in
1|2|3|4|5)
echo "您输入的数字为:$anum"
;;
*)
continue
echo "您输入的数字不在范围内,退出"
;;
esac
done
演示结果:
[root@zh ~]# /bin/bash continue.sh
请输入您的数字,最好在1-5之间1
您输入的数字为:1
请输入您的数字,最好在1-5之间2
您输入的数字为:2
请输入您的数字,最好在1-5之间3
您输入的数字为:3
请输入您的数字,最好在1-5之间4
您输入的数字为:4
请输入您的数字,最好在1-5之间5
您输入的数字为:5
请输入您的数字,最好在1-5之间6
请输入您的数字,最好在1-5之间^C
[root@zh ~]#
exit 退出程序
#!/bin/bash
#break n 演示
for var1 in {1..5}
do
for var2 in {0..4}
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
exit
else
echo " $var1 $var2 "
fi
done
done
复杂流程控制语句
函数
函数样式
简单函数
函数名(){函数体}
[root@zh ~]# cat simple-fun.sh
#!/bin/bash
#简单函数定义和调用
diaoyong(){
echo "我是周浩"
}
diaoyong
[root@zh ~]# /bin/bash simple-fun.sh
我是周浩
传参函数
函数名(){
函数体 $n
}
[root@zh ~]# cat chuancan.sh
#!/bin/bash
#传参函数的定义和调用
chuancan(){
arg=$1
echo "你好,我是"$arg
}
chuancan aaa
chuancan bbb
[root@zh ~]# /bin/bash chuancan.sh
你好,我是aaa
你好,我是bbb
脚本传参 函数调用
[root@zh ~]# cat jbcc.sh
#!/bin/bash
#脚本函数的定义和调用
chuancan(){
xingming=$1
echo "你好,我是"$xingming
}
chuancan $1
[root@zh ~]# /bin/bash jbcc.sh zh
你好,我是zh
脚本传参 生产中用
#!/bin/bash
#脚本函数的定义和调用 生产中用的方式 使用局部变量的方式传参
arg=$1
chuancan(){
xingming=$1
echo "你好,我是"$xingming
}
chuancan $arg
shell常用的命令
grep
grep [参数] [关键字] 【文件名】
-c 只输出匹配行的计数
-n 显示匹配行及行号
-v 取反,显示不匹配行的内容
-i 忽略大小写
-r 递归获取内容
[root@zh ~]# grep -rn nihao /root/*
/root/file.txt:1:nihao
/root/file.txt:2:nihao
/root/test:1:aaa nihao
egrep 将带有nihao或者AAA的行显示出来,支持正则
[root@zh ~]# egrep 'nihao|AAA' test
aaa nihao
AAA DFDF
sed
格式详解
sed [参数] ‘<匹配条件> [动作]’ 【文件名】
参数详解:
-i 表示对文件进行编辑
-n 取消静默输出
匹配条件
关键字匹配格式:
‘/关键字/’
注意:隔离符号/可以替换成@、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。
动作详解
a 在匹配到内容的下一行追加内容
i 在匹配到内容的当前行追加内容
d 删除匹配到的内容
s 替换匹配到的内容
p 查看指定内容
[root@zh ~]# sed -n '/SED4/p' sed.txt
nihao SED4 SED5 SED6
[root@zh ~]# cat sed.txt
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
[root@zh ~]# sed '3p' sed.txt
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
nihao sed7 sed8 sed9
sed默认会将原文全部显示出来然后再将想要的显示出来。
[root@zh ~]# sed -n '3p' sed.txt
nihao sed7 sed8 sed9
使用-n参数取消静默输出,这样原文就不会显示了。
替换内容
样式一、
sed -i ‘行号s#原内容#替换内容#列号’ 文件名
注意:行号不写表示所有行,列好不写表示第一个匹配到的列。
[root@zh ~]# sed 's#sed#SED#' sed.txt
nihao SED1 sed2 sed3
nihao SED4 sed5 sed6
nihao SED7 sed8 sed9
不加-i表示对文件进行模拟操作
[root@zh ~]# cat sed.txt
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
[root@zh ~]# sed -i 's#sed#SED#' sed.txt
[root@zh ~]# cat sed.txt
nihao SED1 sed2 sed3
nihao SED4 sed5 sed6
nihao SED7 sed8 sed9
样式二、
sed -i ‘s#原内容#替换内容#g’ 文件名
g 表示所有匹配到的 样式二表示全文替换
[root@zh ~]# sed -i 's#sed#SED#g' sed.txt
[root@zh ~]# cat sed.txt
nihao SED1 SED2 SED3
nihao SED4 SED5 SED6
nihao SED7 SED8 SED9
增加实践
格式
sed -i ‘行号a\增加的内容’ 文件名
注意:如果增加多行,可以在行号处写个范围值,彼此之间用逗号隔开,例如:
sed -i ‘1,3a\增加内容’ 文件名
[root@zh ~]# cat -n sed.txt
1 nihao SED1 SED2 SED3
2 nihao SED4 SED5 SED6
3 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '2a\add-1' sed.txt
[root@zh ~]# cat -n sed.txt
1 nihao SED1 SED2 SED3
2 nihao SED4 SED5 SED6
3 add-1
4 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '1,3a\add-3' sed.txt
[root@zh ~]# cat -n sed.txt
1 nihao SED1 SED2 SED3
2 add-3
3 nihao SED4 SED5 SED6
4 add-3
5 add-1
6 add-3
7 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '/SED1/a\add-3' sed.txt 在匹配到内容后面增加
[root@zh ~]# cat -n sed.txt
1 nihao SED1 SED2 SED3
2 add-3
3 add-3
4 nihao SED4 SED5 SED6
5 add-3
6 add-1
7 add-3
8 nihao SED7 SED8 SED9
在当前行增加使用-i参数 -a在匹配到的下一行增加,-i用法同-a
[root@zh ~]# sed -i '1i\insert1' sed.txt
[root@zh ~]# cat -n sed.txt
1 insert1
2 nihao SED1 SED2 SED3
3 add-3
4 add-3
5 nihao SED4 SED5 SED6
6 add-3
7 add-1
8 add-3
9 nihao SED7 SED8 SED9
删除演示
sed -i ‘行号d’ 文件名
如果要删除多行,可以使用行号之间用逗号隔开,如 sed -i ‘1,3d’ 文件名
[root@zh ~]# cat -n sed.txt
1 insert1
2 nihao SED1 SED2 SED3
3 add-3
4 add-3
5 nihao SED4 SED5 SED6
6 add-3
7 add-1
8 add-3
9 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '8d' sed.txt
[root@zh ~]# cat -n sed.txt
1 insert1
2 nihao SED1 SED2 SED3
3 add-3
4 add-3
5 nihao SED4 SED5 SED6
6 add-3
7 add-1
8 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '4,7d' sed.txt
[root@zh ~]# cat -n sed.txt
1 insert1
2 nihao SED1 SED2 SED3
3 add-3
4 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '/add-3/d' sed.txt
[root@zh ~]# cat -n sed.txt
1 insert1
2 nihao SED1 SED2 SED3
3 nihao SED7 SED8 SED9
[root@zh ~]# sed -i '/SED/d' sed.txt
[root@zh ~]# cat -n sed.txt
1 insert1
awk
awk是一个功能强大的文档编辑工具,不仅可以以行为单位处理文件还可以以列为单位处理文件。以及某些流程语句。
格式详解
awk [参数] ‘[动作]’ 文件名
#### 常见参数:
-F 指定列的分隔符
[root@zh ~]# cat passwd.txt
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@zh ~]# awk -F ':' '{print $1,$2}' passwd.txt
dockerroot x
apache x
-f 调用脚本
[root@zh ~]# cat filename
/nolog/{ print "第" NR "行的内容是:"$0}
[root@zh ~]# awk -f filename passwd.txt
第1行的内容是:dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
第2行的内容是:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
-v 定义变量
命令行方式
传入单值
[root@zh ~]# echo | awk -v var1=100 '{print var1}'
100
传入多值
[root@zh ~]# echo | awk '{print v1,v2}' v1=100 v2=200
100 200
注意:-v的使用,需要结合|符号才可以。
常见动作:
print 显示内容
$0 显示当前行所有内容
$n 显示当前行的第n列的内容,如果存在多个列,中间使用逗号隔开。
动作组成
BEGIN { 命令} 初始代码块,主要和变量相关
[root@zh ~]# awk -F ':' 'BEGIN{OFS="|"} {print $1,$7}' passwd.txt
dockerroot|/sbin/nologin
apache|/sbin/nologin
/partern/{命令} 匹配、执行代码块
[root@zh ~]# awk '/awk/' awk.txt
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
END {命令} 结束代码块,主要和信息输出有关
[root@zh ~]# awk -F':' 'BEGIN{print "行号 用户 登录bash"} {print NR,$1,$7} END{ print "----------结束了-------------"}' passwd.txt
行号 用户 登录bash
1 dockerroot /sbin/nologin
2 apache /sbin/nologin
----------结束了-------------
内置变量
NR 行号
NF 输出最后一列的内容
OFS 输出格式的列分隔符,默认空格
FS 输入文件的列分隔符,缺省是连续的空格和Tab
[root@zh ~]# cat awk.txt
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
print后面不指定列号,会默认将文件内容全部打印出来。
[root@zh ~]# awk '{ print }' awk.txt
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
[root@zh ~]# awk '{ print $1,$3 }' awk.txt
nihao awk2
nihao awk5
#显示出行号
[root@zh ~]# awk '{ print NR,$1,$3 }' awk.txt
1 nihao awk2
2 nihao awk5
#显示第几行的内容
[root@zh ~]# awk ' NR==1 { print $1,$3 }' awk.txt
nihao awk2
[root@zh ~]# awk '/awk/' awk.txt
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
awk进阶
匹配当前目录下文件大于200b的文件 if语句
[root@zh ~]# ll |awk '{ if(($5>200 && /^-/)) print "\n" "文件名称:" $9 "\t" "文件大小:" $5 "B"}'
文件名称:break.sh 文件大小:258B
文件名称:case.sh 文件大小:285B
文件名称:continue.sh 文件大小:261B
文件名称:dumplog.sh 文件大小:202B
文件名称:duoif.sh 文件大小:261B
循环遍历字符串abcde for语句
[root@zh ~]# echo "abcde" | awk -F '' '{ for(i=1;i<=NF;i++) print $i }'
a
b
c
d
e
find命令
用法格式
find 路径 参数 关键字
参数详解
-name 按照文件名查找文件
-user 按照文件属主来查看文件
-group 按照文件所属组来查看文件
-type 查找某一类型的文件
诸如:
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l - 符号链接文件
f - 普通文件
-size n(K|M|G]) : [c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-perm 按照文件权限进行查找。
-mtime 查找n天以内或以外修改的文件
-ctime 查找n天以内或以外改变的文件
-atime 查找n天以内或以外访问的文件
-depth 在查找文件时,首先查找当前目录的文件,然后再在其子目录下进行查找。
-mindepth n 在查找文件时,首先查找第n层目录的文件,然后再在其子目录下进行查找
-path "子目录" 在指定的子目录下查找,一般与-prune使用。
-newer 查找比指定文件新的文件。
!: 表示取反
动作详解
-print 默认选项,显示名称。-o -print 表示不仅仅显示目录名,还显示目录里面的文件名。
-ls 显示文件属性
-exec 命令 {} \; 使用命令对查找结果处理,查找结果使用"{}”来表示。
实例:将查找的文件重命名
find /root/ -name "ok" -exec mv {} {}.bak \;
[root@zh ~]# find / -name "ok"
/root/ok
[root@zh backup]# find /root/backup/ -type f
/root/backup/a.sh
/root/backup/exit.sh
/root/backup/case.sh
[root@zh backup]# find /root/backup/ -type d
/root/backup/
[root@zh backup]# find /root/backup/ -type f -name "jb*"
/root/backup/jbcc.sh
stat命令可以显示出文件的详细信息
[root@zh backup]# stat b.sh
File: ‘b.sh’
Size: 62 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 917520 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-10-06 11:58:23.499491332 +0800
Modify: 2021-09-22 17:36:55.192443316 +0800
Change: 2021-10-06 22:29:49.868751621 +0800
Birth: -
查找5天内有修改的文件
[root@zh backup]# find /root -mtime -5
/root
/root/.viminfo
/root/file.txt
/root/filename
/root/.bash_history
/root/passwd.txt
/root/ok
/root/sed.txt
/root/backup
#!/bin/bash
base_path=/root/application/xmzt/zyzx/zhouhao/dumpjar
#配置文件路径
#经常需要备份的几个表配置文件
everyday_path=$base_path/everyday.conf
#检修时需要备份的表或者自定义备份表配置文件
self_path=$base_path/selfconf.conf
#日志输出路径
log_path=$base_path/dump.log
#定时备份和定时删除输出路径
cron_log_path=$base_path/dumpcron.log
#手动备份日期
dd=`date +%Y%m%d_%H%M%S`
# 定时备份日期
dd_cron=`date +%Y%m%d`
#七天前日期
dd7=`date +%Y%m%d -d "-7day"`
#主机名
hostname=rm-b7e6k8h528l5wravi998.mysql.rds.ops.sgepri.sgcc.com.cn
#用户名
username=dump
#密码
password=dump@123456
#端口
port=50000
#库名
dbname=pmp
#正确信息打印
loginfo() {
printf '\033[1;32m[%s]\033[0m %s\n' "$(date +'%F %T')" "$*"
}
#错误信息打印
logerror() {
printf '\033[1;31m[%s]\033[0m %s\n' "$(date +'%F %T')" "$*"
}
#备份表
back_table(){
file=$1
logpath=$2
argdate=$3
while read tablename
do
sqlcreate="create table ${tablename}_dumpbackup_$3 like ${tablename};INSERT INTO ${tablename}_dumpbackup_$3 SELECT * FROM ${tablename};"
mysql -h${hostname} -P${port} -u${username} -p${password} ${dbname} -e "$sqlcreate"
if [ $? -eq 0 ];then
echo 表${tablename}备份成功。。。
loginfo 表${tablename}备份成功。。。 >> $logpath
else
echo 表${tablename}备份失败!!!
logerror 表${tablename}备份失败!!! >> $logpath
fi
done < $file
}
# 删除备份表
drop_table(){
file=$1
logpath=$2
while read tablename
do
dropsql="drop table ${tablename}_dumpbackup_$dd7;"
mysql -h${hostname} -P${port} -u${username} -p${password} ${dbname} -e "$dropsql"
if [ $? -eq 0 ];then
loginfo 表${tablename}删除成功。。。 >> $logpath
echo 表${tablename}删除成功。。。
else
logerror 表${tablename}删除失败!!! >> $logpath
echo 表${tablename}删除失败!!!
fi
done <$file
}
case $1 in
back)
back_table $self_path $log_path $dd #检修或者平时手动备份的时候使用
;;
drop)
drop_table $everyday_path $cron_log_path #定时删除备份的表 不要自己用
;;
cronback)
back_table $everyday_path $cron_log_path $dd_cron #定时备份常用的表
;;
*)
loginfo "您输入的参数错误,脚本$0的使用方式 /bin/bash $0 [ back | drop | cronback]"
;;
esac
$#:传入脚本的参数个数;
$0: 脚本自身的名称;
$1: 传入脚本的第一个参数;
$2: 传入脚本的第二个参数;
$@: 传入脚本的所有参数;
$*:传入脚本的所有参数;
$$: 脚本执行的进程id;
$?: 上一条命令执行后的状态,结果为0表示执行正常,结果为1表示执行异常;
其中$@与$*正常情况下一样,当在脚本中将$*加上双引号作为“$*”引用时,此时将输入的所有参数当做一个整体字符串对待。比如输入参数有a b c三个参数,则“$*”表示“a b c”一个字符串。

141

被折叠的 条评论
为什么被折叠?



