Shell学习-02-执行Shell脚本

1.9 Shell命令提示符

  • 启动 Linux 桌面环境自带的终端模拟包,或者从 Linux 控制台登录后,便可以看到 Shell 命令提示符。看见命令提示符就意味着可以输入命令了。命令提示符不是命令的一部分,它只是起到一个提示作用。

  • 不同的 Linux 发行版使用的提示符格式大同小异,例如在 CentOS 中,默认的提示符类似下面这样:

[root@CncLuczk ~]#
  • 各个部分的含义如下:

    • []是提示符的分隔符号,没有特殊含义。
    • root表示当前登录的用户,我现在使用的是 root用户登录。
    • @是分隔符号,没有特殊含义。
    • CncLuczk表示当前系统的简写主机名(完整主机名是 CncLuczk.localdomain)。
    • ~代表用户当前所在的目录为主目录(root)。如果用户当前位于主目录下的 根目录中,那么这里显示的就是 /。
    • $是命令提示符。Linux 用这个符号标识登录的用户权限等级:如果是超级用户(root 用户),提示符就是#;如果是普通用户,提示符就是$
  • 总结起来,Linux Shell 默认的命令提示符的格式为:

[username@host directory]$

或者

[username@host directory]#
  • 主目录:Linux 系统是纯字符界面,用户登录后,要有一个初始登录的位置,这个初始登录位置就称为用户的主目录(home 目录)。超级用户的主目录为/root/,普通用户的主目录为/home/用户名/
  • 用户在自己的主目录中拥有完整权限,所以我们也建议操作实验可以放在主目录中进行。
  • 我们使用 cd 命令切换一下用户所在目录,看看有什么效果。
[root@CncLuczk ~]# cd demo
[root@CncLuczk demo]# cd /usr/local
[root@CncLuczk local]#
  • 仔细看,如果切换用户所在目录,那么命令提示符中会变成用户当前所在目录的最后一个目录(不显示完整的所在目录 /usr/ local/,只显示最后一个目录 local)。

  • 第二层命令提示符:有些命令不能在一行内输入完成,需要换行,这个时候就会看到第二层命令提示符。第二层命令提示符默认为>,请看下面的例子:

[root@CncLuczk ~]# echo "hello shell"
hello shell
[root@CncLuczk ~]# echo "
> http://
> www.baidu.com
> "

http://
www.baidu.com
  • 第一个 echo 命令在一行内输入完成,不会出现第二层提示符。第二个 echo 命令需要多行才能输入完成,提示符>用来告诉用户命令还没输入完成,请继续输入。

  • echo 命令用来输出一个字符串。字符串是一组由" "包围起来的字符序列,echo 将第一个"作为字符串的开端,将第二个"作为字符串的结尾。对于第二个 echo 命令,我们将字符串分成多行,echo 遇到第一个"认为是不完整的字符串,所以会继续等待用户输入,直到遇见第二个".这样保留的输入文本的格式。

  • 命令提示符的格式不是固定的,用户可以自定义修改

1.10 第一个Shell脚本

  • 打开文本编辑器,新建一个文本文件,并命名为 test.sh。

扩展名sh代表 shell,扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用php好了。

  • 在 test.sh 中输入代码:
#!/bin/bash
echo "Hello World !"  #这是一条语句
  • 第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash就是指明了解释器的具体位置。

  • 第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指显示器)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。

  • 第 2 行的#及其后面的内容是注释。Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)。写脚本的时候,多写注释是非常有必要的,以方便其他人能看懂你的脚本,也方便后期自己维护时看懂自己的脚本——实际上,即便是自己写的脚本,在经过一段时间后也很容易忘记。

  • 下面给出了一段稍微复杂的 Shell 脚本:

#!/bin/bash
echo "What is your name?"
read name
echo "Hello, $name"
  • 第 4 行中表示从终端读取用户输入的数据,并赋值给 PERSON 变量。read 命令用来从标准输入文件(Standard Input,stdin,一般就是指键盘)读取用户输入的数据。

  • 第 6 行表示输出变量 name的内容。注意在变量名前边要加上$,否则变量名会作为字符串的一部分处理。

1.11 执行Shell脚本

  • 运行 Shell 脚本有两种方法,一种在新进程中运行,一种是在当前 Shell 进程中运行
1.11.1 在新进程中运行 Shell 脚本
  • 在新进程中运行 Shell 脚本有多种方法。
1.11.1.1 将 Shell 脚本作为程序运行
  • Shell 脚本也是一种解释执行的程序,可以在终端直接调用(需要使用 chmod 命令给 Shell 脚本加上执行权限),如下所示:
[root@CncLuczk ~]# cd demo                #切换到 test.sh 所在的目录
[root@CncLuczk test]# chmod +x ./test.sh  #给脚本添加执行权限
[root@CncLuczk test]# ./test.sh           #执行脚本文件
Hello World !                                  #运行结果
  • 第 2 行中,chmod +x表示给 test.sh 增加执行权限。

  • 第 3 行中,./表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。

  • 通过这种方式运行脚本,脚本文件第一行的#!/bin/bash一定要写对,好让系统查找到正确的解释器。

1.11.1.2 将 Shell 脚本作为参数传递给 Bash 解释器
  • 也可以直接运行 Bash 解释器,将脚本文件的名字作为参数传递给 Bash,如下所示:
[root@CncLuczk test]# cd demo               #切换到 test.sh 所在的目录
[root@CncLuczk test]# /bin/bash test.sh  	#使用Bash的绝对路径
Hello World !                                 #运行结果
  • 通过这种方式运行脚本,不需要在脚本文件的第一行指定解释器信息,写了也没用。

  • 更加简洁的写法是运行 bash 命令。bash 是一个外部命令,Shell 会在 /bin 目录中找到对应的应用程序,也即 /bin/bash

[root@CncLuczk test]# bash test.sh
Hello World !
  • 这两种写法在本质上是一样的:第一种写法给出了绝对路径,会直接运行 Bash 解释器;第二种写法通过 bash 命令找到 Bash 解释器所在的目录,然后再运行,只不过多了一个查找的过程而已。
1.11.1.3 检测是否开启了新进程
  • Linux 中的每一个进程都有一个唯一的 ID,称为 PID,使用$$变量就可以获取当前进程的 PID。$$是 Shell 中的特殊变量,
    Shell学习-02-执行Shell脚本_第1张图片

  • 由此可知:每次执行shell脚本,进程的 PID 都不一样。

1.11.2 在当前进程中运行 Shell 脚本
  • 这里需要引入一个新的命令——source 命令。source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。

  • source 命令的用法为:source filename

  • 也可以简写为:

. filename
  • 两种写法的效果相同。对于第二种写法,注意点号.和文件名中间有一个空格。

  • 使用 source 运行上节的 test.sh, source 命令不用给脚本增加执行权限,并且写不写./都行

  • 检测是否在当前 Shell 进程中,借助$$变量来输出进程的 PID,如下所示:
    Shell学习-02-执行Shell脚本_第2张图片

  • 如果在新进程中运行 Shell 脚本,一般使用bash test.sh这种写法;如果在当前进程中运行 Shell 脚本,一般使用. test.sh这种写法。

1.12 利用shell在Linux平台运维

  • Linux 运维人员就是负责 Linux 服务器的运行和维护。Linux 在服务器上的应用非常广泛,可以用来搭建 Web 服务器、数据库服务器、负载均衡服务器(CDN)、邮件服务器、DNS 服务器、反向代理服务器、VPN 服务器、路由器等。用 Linux 作为服务器系统不但非常高效和稳定,还不用担心版权问题,不用付费。

  • 由于 Linux 服务器的大规模应用,才需要一批专业的人才去管理,这群人就是 Linux 运维工程师(OPS)。OPS 的主要工作就是搭建起运行环境,让程序员写的代码能够高效、稳定、安全地在服务器上运行,拥有架设服务器集群的能力,还会编程开发常用的工具

  • OPS 工作的内容:

    • 安装操作系统,例如 CentOS、Ubuntu 等。
    • 部署代码运行环境,例如网站后台语言采用 PHP,就需要安装 Nginx、Apache、MySQL、PHP 运行时等。
    • 及时修复漏洞,防止服务器被攻击,这包括 Linux 本身漏洞以及各个软件的漏洞。
    • 根据项目需求升级软件,如果现在服务器压力比较大,就可以考虑将旧版的 PHP 5.x 升级到 PHP 7.0。
    • 监控服务器压力,别让服务器宕机。例如淘宝双十一的时候就会瞬间涌入大量用户,导致部分服务器宕机,网页没法访问,甚至连支付宝都不能使用。
    • 分析日志,及时发现代码或者环境的问题,通知相关人员修复。
  • OPS 面对的是成千上万台的服务器,一些人力工作都需要自动化起来,跑一段代码就能在成千上万台服务器上完成相同的工作,例如服务的监控、代码快速部署、服务启动停止、数据备份、日志分析等

  • Shell 脚本很适合处理纯文本类型的数据,而 Linux 中几乎所有的配置文件、日志文件(如 NFS、Rsync、Httpd、Nginx、MySQL 等),以及绝大多数的启动文件都是纯文本类型的文件。Shell 脚本是实现 Linux 系统自动管理以及自动化运维所必备的工具,Linux 的底层以及基础应用软件的核心大都涉及 Shell 脚本的内容。如:定时任务、SSH服务、NFS存储、Zabbix监控、KVM虚拟化、OpenStack/Docker、lptables防火墙、LVS集群、PHP运行环境、tomcat

参考文献:
执行Shell脚本(多种方法)

下一篇:Shell学习-03-变量操作

你可能感兴趣的:(linux,云,shell,学习,linux,运维)