什么是脚本?

脚本简单地说就是一条条的文字命令(一些指令的堆积),这些文字命令是可以看到的(如可以用记事本打开查看、编辑)。

常见的脚本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(后端),SQL(数据库操作语言),Perl,Shell,python,Ruby,JavaFX, Lua等。

为什么要学习和使用shell?

Shell属于内置的脚本

程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)

语法简单,代码写起来比较轻松,简单易学

1.1  Shell 简介

Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。

下面是流程示意图:

Shell 既然是工作在 Linux 内核之上,那我们也有必要了解下 Linux 相关知识。 Linux 是一套免费试用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任 务、支持多线程和多 CPU 的操作系统。

1.2  Shell 分类

1.2.1  图形界面 Shell(GUI Shell)

GUI 为 Unix 或者类 Unix 操作系统构造一个功能完善、操作简单以及界面友好的桌面环境。主流桌 面环境有 KDE,Gnome 等。

1.2.2  命令行界面 Shell(CLI Shell)

CLI 是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。 在 Linux 系统上主流的 CLI 实现是 Bash,是许多 Linux 发行版默认的 Shell。还有许多 Unix 上 Shell,例如 tcsh、csh、ash、bsh、ksh 等。

1.3  查看shell

Shell 是一个程序,一般都是放在/bin或者/user/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。

通过 cat 命令来查看当前 Linux 系统的可用 Shell:

$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。

如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:

echo $SHELL

/bin/bash

输出结果表明默认的 Shell 是 bash。

SHELL是 Linux 系统中的环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用的哪个 Shell。

1.4 第一个 Shell 脚本

主要讲解在大多 Linux 发行版下默认 Bash Shell。Linux 系统是 RedHat 下的 CentOS 操作系 统,完全免费。与其商业版 RHEL(Red Hat Enterprise Linux)出自同样的源代码,不同的是 CentOS 并不包含封闭源代码软件和售后支持。

用 vim 打开 test.sh,编写:

  1. # vim test.sh
  2. #!/bin/bash
  3. echo "Hello world!"

第一行指定解释器,第二行打印 Hello world!

写好后,开始执行,执行 Shell 脚本有三种方法:

方法 1:直接用 bash 解释器执行

# bash test.sh

Hello world!

当前终端会新生成一个子 bash 去执行脚本。

方法 2:添加可执行权限

# ls -lh test.sh

test.sh -rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh

# chmod +x test.sh

# ./test.sh

-bash: ./test.sh: Permission denied

# chmod +x test.sh

# ./test.sh

Hello world!

这种方式默认根据脚本第一行指定的解释器处理,如果没写以当前默认 Shell 解释器执行。

注意,这里在运行时一定要写成 ./test.sh(绝对路径亦可),而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

方法 3:source 命令执行,以当前默认 Shell 解释器执行

# source test.sh

Hello world!

source filename 与 bash filename 及./filename执行脚本的区别:

  当shell脚本具有可执行权限时,用bash filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所以”.”是用来表示当前目录的。

  source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

bash filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell

(即:子shell新建变量,在父shell中不会生效)

我们可以使用命令pstree查看我们当前所处的位置

需要下载

  1. [root@lee~]# yum search pstree
  2. Loaded plugins: fastestmirror
  3. Loading mirror speeds from cached hostfile
  4. ==================================================== Matched: pstree ====================================================
  5. psmisc.x86_64 : Utilities for managing processes on your system
  6. texlive-pst-tree.noarch : Trees, using pstricks
  7. [root@lee ~]# yum install psmisc -y

使用pstree

我们再次执行bash,就会进入到另外一个子shell中

这个时候我们在这个子shell中定义一个变量,发现可以正确打印出来

[root@ken ~]# age=25

[root@ken ~]# echo $age

25

现在我们退出当前的shell,即进入了当前子shell中的父shell中,再次打印我们刚才定义的变量

可以发现现在已经无法获取到我们刚才定义的变量值

子shell继承父shell的环境变量:

我们把环境变量定义到profile的一个子文件中,并使用source执行该文件并生效

打开一个子shell,定义在父shell中的环境变量依然有效

反之,这种操作在子shell中操作,父shell也不能继承

  1. [root@ken ~]# cat /etc/profile.d/ken.sh
  2. export name=ken
  3. [root@ken ~]# source /etc/profile.d/ken.sh
  4. [root@ken ~]# echo $name
  5. ken
  6. [root@ken ~]# bash
  7. [root@ken ~]# echo $name
  8. ken

1.5   shell编程几个常用命令

grep命令详解:过滤来自一个文件或标准输入匹配模式内容。

除了 grep 外,还有 egrep。egrep 是 grep 的扩展,相当于 grep -E。

Usage: grep [OPTION]... PATTERN [FILE]...

grep常用选项详解

选项

描述

-E,--extended-regexp

模式是扩展正则表达式(ERE)

-i,--ignore-case

忽略大小写

-n,--line-number

打印行号

-o,--only-matching

只打印匹配的内容

-c,--count

只打印每个文件匹配的行数

-B,--before-context=NUM

打印匹配的前几行

-A,--after-context=NUM

打印匹配的后几行

-C,--context=NUM

打印匹配的前后几行

--color[=WHEN],

匹配的字体颜色

-v,--invert-match

打印不匹配的行

  1. [root@ken ~]# echo "this is ken THIS IS KEN" | grep -i 'ken'
  2. this is ken THIS IS KEN
  3. [root@ken ~]# echo "this is ken THIS IS KEN" | grep 'ken'
  4. this is ken THIS IS KEN
  5.  
  6. . -n,打印行号
  7.  
  8. [root@ken ~]# grep -n 'root' /etc/passwd

  9. :root❌::root:/root:/bin/bash

  10. :operator❌::operator:/root:/sbin/nologin
  11.  
  12. . -o,只打印匹配的内容
  13.  
  14. [root@ken ~]# echo "this is ken THIS IS KEN" | grep -o 'ken'

  15. ken

  16. [root@ken ~]# echo "this is ken THIS IS KEN" | grep 'ken'

  17. this is ken THIS IS KEN
  18.  
  19. . -c,打印文件匹配的行数
  20.  
  21. [root@ken ~]# grep -c 'root' /etc/passwd



  22. [root@ken ~]# grep 'root' /etc/passwd

  23. root❌::root:/root:/bin/bash

  24. operator❌::operator:/root:/sbin/nologin
  25.  
  26. . -B,打印匹配的前几行
  27.  
  28. [root@ken ~]# grep -B 'root' /etc/passwd

  29. root❌::root:/root:/bin/bash

  30. --

  31. shutdown❌::shutdown:/sbin:/sbin/shutdown

  32. halt❌::halt:/sbin:/sbin/halt

  33. mail❌::mail:/var/spool/mail:/sbin/nologin

  34. operator❌::operator:/root:/sbin/nologin
  35.  
  36. .-A,打印匹配的后几行
  37.  
  38. [root@ken ~]# grep -A 'root' /etc/passwd

  39. root❌::root:/root:/bin/bash

  40. bin❌::bin:/bin:/sbin/nologin

  41. daemon❌::daemon:/sbin:/sbin/nologin

  42. adm❌::adm:/var/adm:/sbin/nologin

  43. --

  44. operator❌::operator:/root:/sbin/nologin

  45. games❌::games:/usr/games:/sbin/nologin

  46. ftp❌::FTP User:/var/ftp:/sbin/nologin

  47. nobody❌::Nobody:/:/sbin/nologin
  48.  
  49. .-C,打印匹配的前后几行
  50.  
  51. [root@ken ~]# grep -C 'root' /etc/passwd

  52. root❌::root:/root:/bin/bash

  53. bin❌::bin:/bin:/sbin/nologin

  54. daemon❌::daemon:/sbin:/sbin/nologin

  55. adm❌::adm:/var/adm:/sbin/nologin

  56. --

  57. shutdown❌::shutdown:/sbin:/sbin/shutdown

  58. halt❌::halt:/sbin:/sbin/halt

  59. mail❌::mail:/var/spool/mail:/sbin/nologin

  60. operator❌::operator:/root:/sbin/nologin

  61. games❌::games:/usr/games:/sbin/nologin

  62. ftp❌::FTP User:/var/ftp:/sbin/nologin

  63. nobody❌::Nobody:/:/sbin/nologin
  64.  
  65. . --color,在centos7中已经默认为 grep --color,在centos6中需要加上--color才会显示颜色
  66.  
  67. [root@ken ~]# alias grep

  68. alias grep='grep --color=auto'
  69.  
  70. . -v, 打印不匹配的行
  71.  
  72. [root@ken ~]# echo -e "hi\nthis is ken\nncie to meet you\nbye " | grep -v 'ken'

  73. hi

  74. ncie to meet you

  75. bye

一、cut命令

语法

cut  [-bn] [file]

cut [-c] [file]

cut [-df] [file]

使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

常用参数:

-c :以字符为单位进行分割。

-d :自定义分隔符。

-f :与-d一起使用,指定显示哪个区域。

  1. 常用实例演示1 -c:以字符为单位进行分隔
  2. [root@ken ~]# echo "this is ken" | cut -c
  3. s
  4. [root@ken ~]# echo "this is ken" | cut -c
  5.  
  6. [root@ken ~]# echo "this is ken" | cut -c

  7. h

  8. [root@ken ~]# echo "this is ken" | cut -c -

  9. this
  10.  
  11. 常用实例演示2:-d,-f:自定义分隔符并进行指定显示
  12.  
  13. .从标准输入读取

  14. [root@ken ~]# echo 'this is ken' | cut -d' ' -f3

  15. ken

  16. [root@ken ~]# echo "name:ken age:25 gender:male" | cut -d ' ' -f2

  17. age:
  18.  
  19. .从文件中读取

  20. [root@ken ~]# echo "this is ken">test

  21. [root@ken ~]# cut -d' ' -f3 test

  22. ken

二、sort命令

Linux sort命令用于将文本文件内容加以排序。

sort可针对文本文件的内容,以行为单位来排序。

语法:

sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

常用参数说明:

-k:根据切割后的那一段进行排序

-n 依照数值的大小排序(默认是根据字符进行排序)。

-r 以相反的顺序来排序。

-t<分隔字符> 指定排序时所用的栏位分隔字符。

-u:去除重复的行(只要那个指定的字段重复,就认定是重复的行)

实例一:默认排序

在使用sort命令以默认的式对文件的行进行排序,使用的命令如下:

  1. [root@ken ~]# cat test
  2. this is ken
  3. this is ken
  4. this is ken
  5. this is ken
  6. this is ken
  7. this is ken
  8. [root@ken ~]# sort test
  9. this is ken
  10. this is ken
  11. this is ken
  12. this is ken
  13. this is ken
  14. this is ken

sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。

实例二:取出排名前三

[root@ken ~]# sort -r test | head -3

8 this is ken

6 this is ken

6 this is ken

实例三:对文件中的内容按照e分割第二部分进行排序

复制代码

[root@ken ~]# sort -t 'e' -k 2 test

6 this:is:ke1

5 this:is:ke2

6 this:is:ke3

2 this:is:ke4

1 this:is:ke6

8 this:is:ke7

[root@ken ~]# sort -t 'e' -k 2  -r test

8 this:is:ke7

1 this:is:ke6

2 this:is:ke4

6 this:is:ke3

5 this:is:ke2

6 this:is:ke1

实例四:去除重复的行

[root@ken ~]# sort test

1 this:is:ke6

2 this:is:ke4

2 this:is:ke4

2 this:is:ke4

2 this:is:ke4

5 this:is:ke2

6 this:is:ke1

6 this:is:ke3

8 this:is:ke7

[root@ken ~]# sort -u test

1 this:is:ke6

2 this:is:ke4

5 this:is:ke2

6 this:is:ke1

6 this:is:ke3

8 this:is:ke7

三、uniq命令

作用:

去除重复的行(相邻且相同,认定为重复)

选项:

-c:在行首用数字表示该行出现了多少次

-u:仅仅显示那些没有出现重复过的行

  1. 实例一:统计行数
  2.  
  3. [root@ken ~]# uniq -c test

  4. this:is:ke3

  5. this:is:ke4

  6. this:is:ke2

  7. this:is:ke1

  8. this:is:ke6

  9. this:is:ke7
  10.  
  11. 实例二:将文件中相同的行去重
  12.  
  13. [root@ken ~]# sort test | uniq

  14. this:is:ke6

  15. this:is:ke4

  16. this:is:ke2

  17. this:is:ke1

  18. this:is:ke3

  19. this:is:ke7

四、seq命令

作用:

生成一个数组序列

格式:

seq [start  [step]] stop

实例:

  1. [root@ken ~]# seq #终止位5
  2.  
  3. [root@ken ~]# seq #起始位2,终止位5
  4.  
  5. [root@ken ~]# seq #起始位2,步长为2,终止位10

五、tr命令

作用:

Linux tr 命令用于转换或删除文件中的字符。

tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

a-z 任意小写

A-Z 任意大写

0-9 任意数字

  1. [root@ken ~]# echo "this is ken" | tr a-z A-Z
  2. THIS IS KEN
  3. [root@ken ~]# echo "THIS IS KEN" | tr A-Z a-z
  4. this is ken
  5.  
  6. 实例二:删除特定字符串

  7. s这个字符串都会被删掉

  8. [root@ken ~]# cat test

  9. this:is:ke3

  10. this:is:ke4

  11. this:is:ke4

  12. this:is:ke4

  13. this:is:ke4

  14. this:is:ke2

  15. this:is:ke1

  16. this:is:ke6

  17. this:is:ke7

  18. [root@ken ~]# cat test | tr -d 's'

  19. thi:i:ke3

  20. thi:i:ke4

  21. thi:i:ke4

  22. thi:i:ke4

  23. thi:i:ke4

  24. thi:i:ke2

  25. thi:i:ke1

  26. thi:i:ke6

  27. thi:i:ke7

SHELL脚本和常用命令的更多相关文章

  1. shell脚本中常用命令

    1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值. 1.2    ...

  2. (转载)shell日志分析常用命令

    shell日志分析常用命令总结 时间:2016-03-09 15:55:29来源:网络 导读:shell日志分析的常用命令,用于日志分析的shell脚本,统计日志中百度蜘蛛的抓取量.抓取最多的页面.抓 ...

  3. shell脚本一条命令直接发送http请求(xjl456852原创)

    我们知道nc命令是一个网络工具.可以连接tcp/udp.也能模拟发送http请求. 现在介绍通过shell脚本,一条命令直接发送http请求. 命令如下,可以对下面的地址等信息自行修改: #!/bin ...

  4. shell脚本中sqlite3命令查询数据库失败返回空,并将错误信息打印到标准错误输出

    shell脚本中sqlite3命令查询数据库失败返回空,并将错误信息打印到标准错误输出 如: #/bin/sh local ret='sqlite3 test.db "select test ...

  5. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  6. (转)shell脚本之seq命令

    shell脚本之seq命令 原文:http://blog.csdn.net/paoxiaohui/article/details/52830595 seq 用于生成从一个数到另一个数之间的所有整数. ...

  7. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  8. hbase shell基础和常用命令详解(转)

    HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...

  9. hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...

随机推荐

  1. Monkey小白入门篇

    一.monkey简介 中文名:猴子 职业:压力测试小工具 用途:对待测Android应用程序进行压力测试,测试app是否会crash Android官方描述: The Monkey is a prog ...

  2. python27期前端

    第一天笔记:HTML:是一种标识性的语言css:层叠样式表是一种用来表现HTML等文件样式(效果)的计算机语言JavaScript:简称“JS”,是一种属于网络的脚本语言 常用来为网页添加各式各样的动 ...

  3. 【Eureka篇三】Eureka常用配置说明(7)

    服务注册中心配置(Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean) #关闭注册中心的保护机制, ...

  4. keras 学习笔记(二) ——— data_generator

    data_generator 每次输出一个batch,基于keras.utils.Sequence Base object for fitting to a sequence of data, suc ...

  5. java jvm虚拟机类加载过程

    加载 在加载阶段, 虚拟机需要完成以下3件事情:1) 通过一个类的全限定名来获取定义此类的二进制字节流.2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.3) 在内存中生成一个代表这 ...

  6. Ubuntu 14.04 安装mysql

    Ubuntu 14.04 没有mysql5.7的源,需要连接外部资源下载安装. wget http://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.d ...

  7. java.util.concurrent各组件分析 一 sun.misc.Unsafe

    java.util.concurrent各组件分析 一 sun.misc.Unsafe 说到concurrent包也叫并发包,该包下主要是线程操作,方便的进行并发编程,提到并发那么锁自然是不可缺少的, ...

  8. 被“org.springframework.boot.web.support.SpringBootServletInitializer;”耽搁的两天

    org.springframework.boot.web.support.SpringBootServletInitializer 改为: org.springframework.boot.conte ...

  9. Windows7运行python3,提示缺少api-ms-win-crt-runtime-l1-1.0.dll

    一.实验环境 1.Windows7x64_SP1 二.操作步骤 2.1 python官网下载python3.6后,安装.运行,提示如下错误: 2.2 解决方式 去微软官网下载安装:KB2999226补 ...

  10. Flink之state processor api实践

    前不久,Flink社区发布了FLink 1.9版本,在其中包含了一个很重要的新特性,即state processor api,这个框架支持对checkpoint和savepoint进行操作,包括读取. ...