一、 echo 后面只能跟双引号,不能跟单引号
eg:
[root@docker ~]# echo "mysql backup end at `date`"
mysql backup end at Tue Oct 2 22:43:47 CST 2018
[root@docker ~]#
[root@docker ~]# echo 'mysql backup end at `date`'
mysql backup end at `date`
注意: `date` 使用的是反引号,反引号的作用为获取命令的结果并返回。
再比如:
[root@docker test]# b=5
[root@docker test]# echo 'The value of b is $b'
The value of b is $b
[root@docker test]# echo "The value of b is $b"
The value of b is 5
[root@docker test]# echo $b
5
二、 脚本中第一行一般都是 #!/bin/bash
脚本第一行#!/bin/bash是固定格式,用来指定解释器bash的具体位置,前面的“#!”是必须要加上的。
eg:
[root@docker ~]# more abc.sh
#!/bin/bash
echo "mysql backup end at 'date'"
[root@docker ~]#
三、 shell脚本中所有以“#”开头的行,都是解释说明的文字,这些注释文字用来对该脚本的描述,通常会写脚本的作用、作者以及时间或者版本等信息。
四、 shell脚本中循环遍历,可以使用for,语法是 for ...;do ...; done
eg:
在使用shell编写脚本的时候,缩进最好不要用tab,而是用四个空格。
五、 date命令
date在linux系统里可以显示当前的系统日期和时间。date命令示例如下:
[root@docker ~]# date 日期和时间
Tue Oct 2 23:15:58 CST 2018
[root@docker ~]# date +%F 日期 注意:加号和 %F 之间不能有空格,下同
2018-10-02
[root@test13 ~]$ date +%Y%m%d 指定日期格式
20190805
[root@test13 ~]$ date +%Y-%m-%d 指定日期格式
2019-08-05
[root@test13 ~]$ date +%Y%m%d_%H%M 指定日期格式: 年月日_时分
20190805_1553 2019年08月05日15点53分
[root@docker ~]# date +%T 时间
23:16:07
[root@docker ~]# date -d "1 month ago" +%F 一个月以前的日期
2018-09-02[root@docker ~]# date -d "-2 month" +%F 两个月以前的日期
2018-08-04
[root@docker ~]# date+%F
-bash: date+%F: command not found
[root@docker ~]# date -d "1 day ago" +%F 昨天的日期(表示法一)
2018-10-01
[root@docker ~]# date -d "-1 day" +%F 昨天的日期(表示法二)
2018-10-01[root@es-0001 ~]# date -d "yesterday" +%Y.%m.%d 昨天的日期(表示法三)
2021.11.22[root@solr1 bin]# date -d "-2 hour" +%T 两小时以前的时间
12:50:29[root@docker ~]# date -d "-2 day" +"%F %T" 前天的日期及时间
2018-10-03 20:47:33
复制文件为 “文件名.bak.年月日_时分” 格式
cp testdemo-1.0.0.war testdemo-1.0.0.war.bak`date +%Y%m%d_%H%M`
下面我列出了一些date命令常见的用法,如下表所示:
六、 mysql数据库备份
假设已知备份数据库的用户为root ,密码为123456abc,要备份的数据库为db1
命令如下:
[root@slave1 local]# mysqldump -uroot -p123456abc db1>db1.sql 注意:这样虽然会报警告,但不影响执行
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@slave1 local]# ls
bin db1.sql etc games include java lib lib64 libexec sbin share src
如果是远程的mysql服务,还可以加上IP和Port,例如将远程www.wudi.com服务器上的testtransaction数据库的数据备份到本机192.168.0.181上:
[root@master local]# mysqldump -hwww.wudi.com -P3306 -uroot -p123456 testtransaction>testtransaction.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master local]# ls
bin etc games include java lib lib64 libexec sbin share src testtransaction.sql
mysqldump常用的几个用法总结:
1)只备份表结构,不备份数据---->将只有创建表的语句
mysqldump -uroot -p123456 -d db1>db1.sql
[root@localhost linshi]# mysqldump -uroot -p123456 -d geometry>geometry.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost linshi]# ls
geometry.sql
2)只备份数据,不备份表结构--->将只有向表中插入(insert)数据的语句
mysqldump -uroot -p123456 -t db1>db1.sql
[root@localhost linshi]# mysqldump -uroot -p123456 -t geometry>geometrydata.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost linshi]# ls
geometrydata.sql geometry.sql
3)只备份指定表
mysqldump -uroot -p123456 db1 tb1 > db1_tb1.sql
mysqldump -uroot -p123456 geometry tb_block_details > tb_block_details.sql
4)只备份指定表的结构或数据
只备份指定表的结构,不备份数据:--->类似1),加参数 -d
eg: mysqldump -uroot -p123456 -d geometry tb_block_details > tb_block_details.sql
只备份指定表的数据,不备份结构: --->类似2),加参数 -t
eg: mysqldump -uroot -p123456 -t geometry tb_block_details > tb_block_details.sql
5)导出指定多个库
mysqldump -uroot -p123456 -B db1 db2 > db12.sql
[root@localhost linshi]# mysqldump -uroot -p123456 -B geometry logistcs > geometry_logistcs.sql
注意:与前4个不同,导出指定多个库时,在生成的脚本文件中将包括创建数据库(create database xxx)和使用数据库(use xxx)的语句,eg:
6)全部备份
mysqldump -uroot -p123456 --all-databases > alldb.sql
7)如果是远程的mysql服务,以上5种常用用法中,都可以加上IP和Port,比如:
mysqldump -h192.168.0.205 -P3307 -uroot -p123456 db1 tb1 > db1_tb1.sql
七、 find 命令 ----查找文件的复杂方式
locate 只能依据文件名来查找文件,而 find 程序能基于各种各样的属性,搜索一个给定目录(以及它的子目录),来查找文件。find 指令用于查找符合条件的文件或目录。任何位于参数之前的字符串都将被视为欲查找的目录。
|
参数:
-name <范本样式> 指定字符串作为寻找文件或目录的范本样式。
-perm <权限数值> 查找符合指定的权限数值的文件或目录。
-type <文件类型> 只寻找符合指定的文件类型的文件。
-size <文件大小> 查找符合指定的文件大小的文件。
find命令举例:
1)假设 /usr/local/static/ 下有两个文件a.txt、b.txt,还有一个文件夹tmp, 文件夹tmp中有一个文件 c.txt
[root@localhost static]# ls
a.txt b.txt tmp
[root@localhost static]# find /usr/local/static/ 查找出来的既包括当前目录也包括子目录及子目录下的文件
/usr/local/static/
/usr/local/static/tmp
/usr/local/static/tmp/c.txt
/usr/local/static/a.txt
/usr/local/static/b.txt对于/usr/local/static,当文件多时,这将产生一张很大的列表。因为这张列表被发送到标准输出,我 们可以把这个列表管道到其它的程序中。让我们使用 wc 程序来计算出文件的数量:
[root@localhost static]# find /usr/local/static/ |wc -l 使用 wc 来计算出文件的数量
5
eg:
2)找到 /usr/local/static 目录下的一周以前的老文件
find /usr/local/static/ -type f -mtime +7
find 不仅可以按照 atime、mtime、ctime 来查找文件的时间,也可以按照 amin、mmin和 cmin 来查找文件的时间,区别只是所有 time 选项的默认单位是天,而min选项的默认单位是分分钟。
查找12小时内修改过的html文件 #12*60=720
find /usr/local/nginx/html -mmin -720 -type f -name "*.html"
3) 找到 /etc/ 目录及其子目录下所有文件名包含 .cnf的文件
[root@localhost static]# find /etc/ -type f -name "*.cnf*" 查找出来的只有文件
/etc/pki/tls/openssl.cnf
/etc/my.cnf
4)找到 /etc/ 目录及其子目录下所有目录名包含 .cnf 的目录
[root@localhost static]# find /etc/ -type d -name "*.cnf*" 查找出来的只有目录
/etc/my.cnf.d
5)找到当前目录下所有权限为700的目录(会去当前目录及当前目录的子目录中去查找)
[root@localhost ~]# find . -type d -perm 700
./.cache
./.cache/pip
./.cache/pip/http
./.cache/pip/http/f
./.cache/pip/http/f/e
./.cache/pip/http/f/e/d
./.cache/pip/http/f/e/d/0
./.cache/pip/http/f/e/d/0/e
./.ssh
6)找到 /usr/local/ 下大小超过1MB 的文件(会去/usr/local 及 /usr/local 的子目录中去查找)
find /usr/local/ -size +1M 注意查找出来的只有文件,不包含文件夹
7)找到当前目录下10天以前的文件并删除
find . -type f -mtime +10 -exec rm -f {} \; 会去当前目录及当前目录的子目录下查找,只查找文件并删除,并不会删除文件夹
8) 查找 当前目录下 后缀为 .pom 或 .repositories 的所有文件
find . -type f -name "*.pom" -o -name "*.repositories"
[root@test11 1.0.0]# ls
cop-cardinfo-1.0.0.pom cop-cardinfo-1.0.0.war _remote.repositories
[root@test11 1.0.0]# find . -type f -name "*.pom" -o -name "*.repositories"
./cop-cardinfo-1.0.0.pom
./_remote.repositories
[root@test11 1.0.0]#
解释:-o ---> or 或者
# 查找当前目录下 后缀为.pom 或 .repositories 或 .xml 的所有文件
find . -type f -name "*.pom" -o -name "*.repositories" -o -name "*.xml"
八、wc 统计命令
wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
如:wc -l filename 就是查看文件里有多少行(l -- line)
wc -w filename 看文件里有多少个word (w -- word)。
wc -L filename 文件里最长的那一行是多少个字。
[root@solr1 data]# cat products.json |wc -l
69353
也可以一次行统计多个文件的行数
[root@solr1 data]# wc -l logistics.json products.json
3 logistics.json
69353 products.json
69356 total
扩展:
wc -l 文件名 统计行数,统计结果中包含行数和文件名
cat 文件名 |wc -l 统计行数,统计结果中只展示行数
九、 gzip压缩/解压缩文件
gzip支持压缩(解压缩)文件,但不支持压缩(解压缩)目录
压缩一个文件的命令就是:
gzip file # 该文件被压缩为file.gz,被压缩后源文件file会被删除掉
解压缩一个压缩文件的命令是:
gzip -d file.gz # 使用gzip进行解压缩,要使用gzip命令的-d参数
在linux系统里,常见的压缩工具除了gzip外,还有bzip2,xz,zip等,其中bzip2和xz用法与gzip类似,而zip支持压缩目录。
注意:
使用gzip 命名,压缩或解压缩后会删除源文件,并在源文件位置生成新文件,新文件和源文件日期时间一致,不会自动更新。
实际运用举例:
把一天以前的数据库备份文件压缩:
[root@localhost ~]# find /usr/local/mysql_backup_data/ -name "*.sql" -mtime +1 |xargs gzip
把一天以前的数据库备份的数据压缩文件进行解压:
[root@localhost ~]# find /usr/local/mysql_backup_data/ -name "*.sql.gz" -mtime +1 |xargs gzip -d
十、which命令
which 命令用于查询某个命令的绝对路径或者判断某个命令是否存在。
eg:
[root@docker test]# which rmdir
/usr/bin/rmdir
[root@docker test]# which rm
alias rm='rm -i'
/usr/bin/rm
[root@docker test]# which ls
alias ls='ls --color=auto'
/usr/bin/ls如果命令不存在,则会报:
[root@docker test]# which whois
/usr/bin/which: no whois in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/jdk1.8.0_161/bin:/root/bin)
[root@docker test]# whois wudinaniya.com
-bash: whois: command not found
其中 rm 和 ls 是两个特殊的命令,它们使用alias命令做了别名。我们用的rm命令实际上是 rm -i, 加上 -i 选项后,删除文件或者命令时都会询问是否确定要删除,这样做比较安全。
命令which不常使用,平时只用来查询某个命令的绝对路径或者判断某个命令是否存在。在上面的示例中,用which查到rm命令的绝对路径为 /usr/bin/rm 那么你是否会问:“为什么我们使用命令时,只是直接打出了命令,而没有使用这些命令的绝对路径呢?”这是环境变量PATH在起作用。例如:输入命令:
[root@docker test]# echo $PATH // echo命令用来输出 $PATH 的值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/jdk1.8.0_161/bin:/root/bin
/etc/profile文件中环境变量的配置如下:
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export JRE_HOME=/usr/local/java/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
十一、判断一个变量的值是否为空
在shell脚本中,如果一个变量没有成功赋值就被引用了,则会影响到脚本的正常执行,判断一个变量的值是否为空有两种方法:
1)用-z (zero的意思)
2)用-n (not null的意思)
十二、 whois 查询域名信息的命令----> 可用于检测域名到期时间
默认系统并没有这个命令,需要安装jwhois包,CentOS系统这样安装:
yum -y install jwhois
注意:对于没有公网ip的服务器,会安装jwhois包失败。如果不死心,可先执行 yum search jwhois 命令,查询是否能通过yum源找到 jwhois,如果找不到,则对于该台服务器,使用命令 yum -y install jwhois 安装jwhois肯定会失败。
linux命令行下如何使用 whois命令进行查询?
格式: whois 域名 比如:
[root@izbp1845cet96se1qmb5ekz ~]# whois wudinaniya.com
[Querying whois.verisign-grs.com]
[Redirected to grs-whois.hichina.com]
[Querying grs-whois.hichina.com]
[grs-whois.hichina.com]
Domain Name: wudinaniya.com
Registry Domain ID: 2311797794_DOMAIN_COM-VRSN
Registrar WHOIS Server: grs-whois.hichina.com
Registrar URL: http://whois.aliyun.com
Updated Date: 2018-09-19T06:14:55Z
Creation Date: 2018-09-19T06:03:27Z
Registrar Registration Expiration Date: 2019-09-19T06:03:27Z
Registrar: Alibaba Cloud Computing (Beijing) Co., Ltd.
如果我们想写脚本监控域名过期时间,则这里我们要关注的行是 “Expiration Date”.
注意:
不同的域(.com, .cn)查询到的结果有所不同。比如 .cn的结果是这样的:
[root@izbp1845cet96se1qmb5ekz ~]# whois sina.com.cn
[Querying whois.cnnic.cn]
[whois.cnnic.cn]
Domain Name: sina.com.cn
ROID: 20021209s10011s00082127-cn
Domain Status: clientDeleteProhibited
Domain Status: serverDeleteProhibited
Domain Status: clientUpdateProhibited
Domain Status: serverUpdateProhibited
Domain Status: clientTransferProhibited
Domain Status: serverTransferProhibited
Registrant ID: sinacomcn2
Registrant: 北京新浪互联信息服务有限公司
Registrant Contact Email: domainname@staff.sina.com.cn
Sponsoring Registrar: 北京新网数码信息技术有限公司
Name Server: ns3.sina.com.cn
Name Server: ns2.sina.com.cn
Name Server: ns4.sina.com.cn
Name Server: ns1.sina.com.cn
Registration Time: 1998-11-20 00:00:00
Expiration Time: 2019-12-04 09:32:35
DNSSEC: unsigned
十三、 pidof命令 --- 查找某个程序名的进程号
# man pidof 中的解释:
pidof --- 用于查找一个运行的程序的PID。
pidof常用命令:
pidof 程序名 查看指定程序名对应得进程号
pidof 程序名 | wc -l # wc命令用于计算个数,-l 统计行数(line)。
pidof 程序名 | wc -w # wc命令用于计算个数,-w 统计字数(即字符数 word)。一个字被定义为由空白、跳格或换行字符分隔的字符串。wc 命令用来统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。
ls -l /sbin/pidof
十四 xargs
[root@localhost ~]# date | xargs -I{} echo "mysql于 {} 备份完成"
mysql于 2019年 11月 02日 星期六 16:22:47 CST 备份完成