shell脚本基础知识1

一、 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命令常见的用法,如下表所示:

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 指令用于查找符合条件的文件或目录。任何位于参数之前的字符串都将被视为欲查找的目录。

语  法:find [目录...][-amin <分钟>][-anewer <参考文件或目录>][-atime <24小时数>][-cmin <分钟>][-cnewer <参考文件或目录>][-ctime <24小时数>][-daystart][-depyh][-empty][-exec <执行指令>][-false][-fls <列表文件>][-follow][-fprint <列表文件>][-fprint0 <列表文件>][-fprintf <列表文件><输出格式>][-fstype <文件系统类型>][-gid <群组识别码>][-group <群组名称>][-help][-ilname <范本样式>][-iname <范本样式>][-inum <inode编号>][-ipath <范本样式>][-iregex <范本样式>][-links <连接数目>][-lname <范本样式>][-ls][-maxdepth <目录层级>][-mindepth <目录层级>][-mmin <分钟>][-mount] 
[-mtime <24小时数>][-name <范本样式>][-newer <参考文件或目录>][-nogroup][noleaf] [-nouser][-ok <执行指令>][-path <范本样式>][-perm <权限数值>][-print][-print0][-printf <输出格式>][-prune][-regex <范本样式>][-size <文件大小>][-true][-type <文件类型>][-uid <用户识别码>][-used <日数>][-user <拥有者名称>][-version][-xdev][-xtype <文件类型>]

参数:

-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 备份完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wudinaniya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值