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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: b'shell脚本基础知识'是指对b'shell脚本'进行基础掌握的知识,包括b'shell脚本'的语法、变量、流程控制、函数等基础内容。了解b'shell脚本基础知识,可以帮助用户更好地编写和运行b'shell脚本',提高工作效率和准确性。 ### 回答2: Shell是一种可以执行Linux命令的脚本语言,是Linux系统中必不可少的一部分。Shell脚本是一种文本文件,其扩展名通常为.sh或.bashShell脚本可以编写一些自动化的任务,使得Linux操作更加方便和高效。 Shell脚本基础知识包括以下内容: 1. Shell脚本的创建和执行 Shell脚本可以使用vi或其他文本编辑器创建,创建完成后用chmod命令设置为可执行权限。执行脚本有两种方式:直接输入脚本名,或用bash命令执行脚本。例如,执行名为test.sh的脚本,可用以下两种方式: ./test.sh bash test.sh 2. Shebang行 Shell脚本的第一行需要写上Shebang行,指定解释器的路径。在Linux系统中,默认的解释器为/bin/bash。因此,Shebang行通常是: #!/bin/bash 3. 变量和环境变量 Shell脚本中使用的变量需要先定义,然后才能使用。定义变量的方式为: 变量名=变量值 变量名前面必须添加美元符号$,才能获取到变量的值。可以使用echo命令输出变量值,例如: name="tom" echo $name 环境变量是一种全局变量,可以在Shell脚本中使用。Linux系统中有很多预定义的环境变量,例如: $HOME:当前用户的家目录。 $PATH:程序搜索路径。 $USER:当前登录用户的用户名。 4. 控制流语句和函数 Shell脚本支持各种控制流语句,例如if、for、while等。函数的定义和使用也和其他编程语言类似,例如: function_name(){ commands } function_name 5. 输入和输出重定向 在Shell脚本中,可以使用重定向符号>和<来重定向输入和输出。例如,将输出重定向到文件中,可以使用: echo "hello" > output.txt 将输入重定向到文件中,可以使用: read input_var < input.txt Shell脚本基础知识是编写自动化任务的基础,了解和掌握这些知识可以使得Shell脚本更加高效和便捷。 ### 回答3: Shell脚本是一个用来编写命令行脚本脚本语言。脚本语言和编译型语言不同,它的代码不需要被编译成可执行文件,而是直接解释执行。 Shell脚本的特点是读写文本文件,执行系统命令。在Unix/Linux操作系统中,Shell是最基本的界面,与其他操作系统类似,用户可以在Shell界面下输入各种命令来控制和操作计算机系统。 Shell脚本基础知识包括: 1. Shell脚本的文件格式,一般以.sh作为文件扩展名,脚本的执行需要给定执行权限(chmod +x filename.sh)。 2. 开始行(Shebang):开头的两个字符#!(Shebang)指定执行本脚本文件所使用的Shell解释器。一般来说,使用Bash解释器,开始行应该这样写:#!/bin/bash 3. 变量:在Shell脚本中,用$符号表示,变量名和等号之间不能有空格。例如:var=123 4. 数组:在Shell脚本中,用小括号()表示,使用花括号{}和下标来引用数组中的元素。例如:arr=(1 2 3) echo ${arr[1]} 5. 流程控制语句:if、while、case、for等,用于实现分支和循环等控制流程。 6. 命令行参数:在执行脚本时从命令行传入,用$符号表示。例如:在命令行执行:./test.sh arg1 arg2,则脚本中可以用$1表示arg1,$2表示arg2。 7. 读取键盘输入:使用read命令,例如:read name,表示从键盘读取一行文本并存储到变量name中。 8. 函数:用于将一些重复的命令封装起来,实现代码复用。例如: function test(){ echo "hello world"}。 Shell脚本是Unix/Linux操作系统的基础,掌握Shell脚本基础知识是很重要的。在实践中不断熟练掌握Shell脚本,可以提高个人的工作效率和工作质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值