本篇文章参考自 https://www.cnblogs.com/clsn/archive/2017/12/06/7992981.html
前言
为什么学Shell
Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具, Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内容。每一个合格的 Linux 系统管理员或运维工程师,都需要能够熟练地编写 Shell 脚本语言,并能够阅读系统及各类软件附带的 Shell 脚本内容。只有这样才能提升运维人员的工作效率,适 应曰益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础。
什么是shell
Shell 是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户。
1、这种对话方式可以是交互的方式。
例:从键盘输入命令,通过 /bin/bash
的解析,可以立即得到 Shell 的回应。
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# echo ls |bash
anaconda-ks.cfg
2、这种方式也可以是非交互的方式(脚本),也是我们后续要重点学习的方式。
什么是Shell脚本
命令、变量和流程控制语句等有机的结合起来的文本文件就是 Shell 脚本。
shell 脚本擅长处理纯文本类型的数据,而 linux 中,几乎所有的配置文件,日志,都是纯文本类型文件。
shell 是一个弱类型的脚本语言,把所有数据都当作字符存储,使用时会隐式进行类型转换。
shell 脚本默认不支持浮点数。
脚本语言的种类
一、编译型语言
定义: 指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),这个过程叫做编译;编译好的可执行性文件(.exe
),可在相对应的平台上运行(移植性差,但运行效率高)。
典型的编译型语言有, C 语言、C++ 等。
另外,Java 语言是一门很特殊的语言,Java 程序需要进行编译步骤,但并不会生成特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class
)(移植性好的原因),这种字节码自然不能被平台直接执行,运行时需要由解释器解释成相应平台的二进制机器码文件;大多数人认为 Java 是一种编译型语言,但我们说 Java 即是编译型语言,也是解释型语言也并没有错。
二、解释型语言
定义: 指用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言;相当于把编译型语言的编译链接过程混到一起同时完成的。
解释型语言执行效率较低,且不能脱离解释器运行,但它的跨平台型比较容易,只需提供特定解释器即可。
常见的解释型语言有, Python(同时是脚本语言)与 Ruby 等。
三、脚本语言
定义: 为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
特点: 程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,Shell 等。
其他常用的脚本语句种类:
PHP 是网页程序,也是脚本语言。是一款更专注于 web 页面开发(前端展示)的脚本语言,例如:Dedecms、discuz。PHP 程序也可以处理系统日志,配置文件等,PHP 也可以调用系统命令。
Perl 脚本语言。比 Shell 脚本强大很多,语法灵活、复杂,实现方式很多,不易读,团队协作困难,但仍不失为很好的脚本语言,存世大量的程序软件。MHA 高可用 Perl 写的。
Python,不但可以做脚本程序开发,也可以实现 web 程序以及软件的开发。近两年越来越多的公司都会要求会 Python。
Shell 脚本与 php/perl/python 语言的区别和优势:
Shell 脚本的优势在于处理操作系统底层的业务 (linux 系统内部的应用都是 shell 脚本完成)因为有大量的 linux 系统命令为它做支撑。2000 多个命令都是 shell 脚本编程的有力支撑,特别是 grep、awk、sed 等。例如:一键软件安装、优化、监控报警脚本,常规的业务应用,shell 开发更简单快速,符合运维的简单、易用、高效原则.
PHP、Python 优势在于开发运维工具以及 web 界面的管理工具,web 业务的开发等。处理一键软件安装、优化,报警脚本。常规业务的应用等 php/python 也是能够做到的。但是开发效率和复杂比用 Shell 就差很多了。
系统中的Shell
查看系统中的命解释器:
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
常用操作系统的默认 Shell:
- Linux 是 Bourne Again shell(bash);
- Solaris 和 FreeBSD缺省的是Bourne shell(sh);
- AIX 下是 Korn Shell(ksh);
- HP-UX 缺省的是 POSIX shell(sh);
查看当前系统使用的 Shell 类型可以使用 $SHELL
变量查看,如下:
[root@localhost ~]# echo $SHELL
/bin/bash
Shell脚本的编写与执行
认识Shell的解释行(shebang)
shebang(也称为 Hashbang )是一个由井号和叹号构成的字符串行(#!
),其出现在文本文件的第一行的前两个字符。
如下列出了一些典型的 shebang 解释器指令:
#!/bin/sh
—使用 sh,即 Bourne shell 或其它兼容 Shell 执行脚本;#!/bin/csh
—使用 csh,即 C shell 执行;#!/usr/bin/perl -w
—使用带警告的 Perl 执行;#!/usr/bin/python -O
—使用具有代码优化的 Python 执行;#!/usr/bin/php
—使用 PHP 的命令行解释器执行;
通常出现在 linux 的 Shell 脚本第一行,作为解释行,告诉解释器 Shell 的执行方式。
如果第一行中:第一个字符非 #
:表示这是一个 bash 脚本。
第一个字符是 #
,但第二个字符不是 !
,表示这是一个 csh 脚本。
第一个字符是 #
,且第二个字符是 !
。
例:
如果第一行为:#!/urs/bin/python2.2
, 表示调用其指定的 /usr/bin/python2.2
程序来执行这个脚本。
执行方式说明
运行 Shell 脚本有两种方式:
- 给予 Shell 脚本执行权限,通过具体的文件路径指定文件运行(绝对路径和相对路径都可);
- 直接将 Shell 脚本作为指定 Shell 解释器的参数来运行 Shell 解释器。
如果指定了解释行,xx.sh
或者 ./xx.sh
则按解释行指定的来 shell 执行;
如果没有指定解释行,xx.sh
或者 ./xx.sh
则按当前用户默认 shell 来执行,可以是 csh 或 bash 等;
如果指定解释行,但把 Shell 脚本当作参数传递给指定 shell,如 csh xx.sh
或 csh -x xx.sh
,则忽略解释行,这时改为默认csh,当然你也可以用 tcsh ,sh 等。
简单示例
编写名为 hello.sh
的 Shell 脚本,内容如下:
#!/bin/bash
echo 'hello world'
可直接将该脚本当作参数传入 bash
命令来执行该脚本,如下:
[root@localhost testDir]# bash hello.sh
hello world
还可以给与 hello.sh
执行权限,通过路径执行,如下:
[root@localhost testDir]# chmod +x hello.sh
[root@localhost testDir]# ./hello.sh
hello world
布尔运算
Shell 中同样有布尔值的概念,假如 1
表示 true
,0
表示 false
,那么几种运算结果如下。
与运算使用 &&
,例:
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
或运算使用 ||
,例:
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非运算使用 !
,例:
!0 = 1
!1 = 0
要注意的是,bash 中有程序执行的状态结果与通常的布尔值定义有所不同,
0
表示true
,而非0
则表示flase
。
例:命令行判断一个用户是否存在,如果存在则输出存在,不存在则输出不存在。
[root@localhost testDir]# id zze &> /dev/null && echo '存在' || echo '不存在'
不存在
评论区