小编提示:此篇文章阅读时间为15分钟左右,可先收藏后阅读。
01/Linux 的江湖地位
Linux 作为一个全球用户超过14亿的操作系统,它的强大与神奇就不必多说了,混在IT界 Linux是可以装B的;要混运维界, Linux是必须装备的。
02/SHELL 可以做什么
作为目的为趋向的俗人一枚,学习Shell,不是为了兴趣就是为了工作。好吧,我说我当初学Shell纯属兴趣——那种《骇客帝国》中黑屏绿字的装B的兴趣 (如果装B也算兴趣的话)。更多人学习Shell是为了工作,为了解决工作中的实际问题,那么Shell脚本在工作中到底能干什么呢?先看看以下问题:
1.你是否经常为了处理一项简单且重复的工作而耗费大量时间?
2.你是否经常发现使用高级语言,如Python去处理一些事情发现小题大做?
3.你是否经常需要进行一些批量任务的处理?
4.......
如果上面的问题您有一条回答“Yes”。那您非常有必要学习一下Linux Shell脚本。Come on少年。
03/Hello Boy
先来一个简单的装一个,
04/Shell 开胃菜
来盘Shell开胃菜,感受一下Shell 的味道吧
上面是一段简单的Shell程序,实现在功能为:
1.在用户主目录下创建一个shell_Appetizer文件夹;
2.在用户主目录下创建10个规定命名格式的空文件。
第一个Shell程序,逐行解释相当有必要。
·第一行:指定脚本解释器,这里是用/bin/bash做解释器;
·第二行:切换到当前用户的home目录;
·第三行:创建一个名为shell_Appetizer的空目录;
·第四、五行:for循环,一共循环10次;
·第六行:创建10个名称为Appetizer_0.txt, Appetizer_1.txt格式的空文件。
cd、mkdir和touch都是系统自带的命令,一般在/bin目录下;而for、do和done都是Shell的关键字。 Shell中使用#开头的行就是注释(#!/bin/bash除外)。
一个简单的程序之后,我们就开始进入Shell的语法学习。
05/变量
基础知识
1.在Shell中,使用变量之前不需要事先声明,只是通过使用它们来创建它们;
2.在默认情况下,所有变量都被看做是字符串,并以字符串来存储;
3.Shell变量是区分大小写的;
4.在Shell中,通过在变量名前加一个 $符号来引用他,无论何时想要获取变量内容,都必须在它前面加一个$符号;
下面通过一段Shell脚本来详细的说明上面的内容:
使用read
在Shell中,我们可以使用read命令将用户的输入赋值给一个变量。这个命令需要一个参数,即准备读入用户输入数据的变量名,然后它会等待用户输入数据。通常情况下,在用户按下回车键时,read命令结束。例如以下代码:
引号的使用技巧
在上面的代码中也说了,如果字符串中包含了空格,就需要使用引号将字符串括起来,而这只是引号的一个简单的使用。 变量在引号中的行为取决于你所使用的引号类型。
1.如果把一个$变量表达式放在双引号中,程序执行到这一行时就会把变量替换为它的值;
2.如果把一个$变量表达式放在单引号中,就不会发生替换现象;
但是,我们可以通过在$字符前面加上转义字符\取消它的特殊含义,下面通过一段简单的代码来理解上面内容的意思:
环境变量
当一个Shell脚本程序开始执行时,一些变量根据环境设置中的值进行初始化,一般比较常用的有以下几个:
·$HOME:当前用户的主目录,例如:/home/zhangwj;
·$PATH:以冒号分隔的用来搜索命令的目录列表;
·$0:Shell脚本的名字;
·$#:传递给脚本的参数个数;
·$@:当前所有入参
·$$:Shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件。
参数变量
如果脚本程序在调用时带有参数,一些额外的变量就会被创建。即使没有传递任何参数,环境变量$#也依然存在,只不过它的值是0罢了。例如以下代码:
输出如下:
06/条件判断
程序设计语言的基础是对条件进行判断,并根据结果采取不同行动的能力。在使用条件判断前之前,先看看Shell脚本程序里可以使用的条件结构。
一个Shell脚本能够对任何可以从命令行上调用的命令的退出码进行判断,这其中也包括我们写的Shell脚本程序。这就是为什么要在所有自己编写的脚本程序的结尾包括一条返回值的exit命令的重要原因。
test或[命令
“[” 这个是个命令? 没错我没有写错,您也没有看错 '[' 等价于 ‘test’ Shell的真假判断命令。为了增强可读性,当使用[命令时,默认使用符号]来结尾。下面就通过一个简单的例子来看看“test”和“[”是如何使用的。
我们通过使用-f来判断指定文件是否存在。test命令可以使用的条件类型可以归为3类:
·字符串比较;
·算术比较;
·文件相关的条件测试。
07/控制结构
Shell有一组控制结构,下面就分别来认认认识它们吧。
if语句
结构如下:
来个实例玩玩:
elif语句
结构如下
一个很容易出错的问题。例如以下代码:
上面这段代码很简单,但缺少容错,如果你不输入yes或no,就会运行出错,得到以下提示信息:
这是为何?代码中有if [ $Judge = "yes" ],当我不输入任何内容时,这个if语句就会变成这样if [ = "yes" ],很明显,这不是一个合法的条件。为了容错,我们给变量加上引号,改成这样if [ $Judge = "yes" ]。
技巧:如非数值比较,建议变量引用都加双引号
for语句
结构如下:
来一个实用的代码示例:(判断输入的IP地址是否合法)
while语句
结构如下:循环将反复执行直到条件为假
代码示例:(倒计时 100秒)
until语句
结构如下:循环将反复执行直到条件为真
它与while循环很相似,只是把条件测试反过来了。
case语句
结构如下:
case的代码结构相对来说是比较复杂的。case结构具备匹配多个模式,然后执行多条相关语句的能力,这使得它非常适合于处理用户的输入。
代码示例:
当case语句被执行时,它会把变量market的内容与各字符串依次进行比较。一旦某个字符串与输入匹配成功,case命令就会执行紧随右括号)后面的代码,然后就结束。 在代码中,最后面的表示匹配任何字符串,我们在写代码时,总是在其它匹配之后再添加一个以确保如果没有字符串得到匹配,case语句也会执行某个默认动作.
&&和||操作符
Shell中也支持&&和||符号,如:
从左开始顺序执行每条命令,如果一条命令返回的是true,它右边的下一条命令才能执行。如果此持续直到有一条命令返回false,或者列表中的所有命令都执行完毕;遵循“短路”规则。
从左开始顺序执行每条命令,如果一条命令返回的是false,它右边的下一条命令才能够被执行。如此持续直到有一条命令返回true,或者列表中的所有命令都执行完毕。
函数
函数,这么NXX的东西,Shell怎么可能少呢。定义函数的结构如下:
代码示例:获取系统信息
脚本程序从自己的顶部开始执行,当它遇到了check_os_release() {结构时,它知道脚本正在定义一个名为check_os_release的函数。当执行到单独的check_os_release时,Shell就知道应 该去执行刚才定义的函数了。函数执行完毕以后,脚本接着check_os_release后的代码继续执行
输出如下:
最后:结语
关于Linux Shell的基本语法就先侃到这里,后续会对Shell中的一些常用命令进行简单的说明。(文/张文杰)