Shell教程
Shell教程,Linux 中的 shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息。
Shell与其他脚本
Shell脚本,Shell 脚本是实现 Linux 系统自动管理以及自动化运维所必备的工具,Linux 的底层以及基础应用软件的核心大都涉及 Shell 脚本的内容。
Shell分类
Shell分类,在大部份的 UNIX 系统,三种著名且广被支持的 shell 是 Bourne shell(AT&T shell,在 Linux 下是 BASH)、C shell(Berkeley shell,在 Linux 下是 TCSH)和 Korn shell(Bourne shell 的超集)。
查看当前shell
查看当前shell,Shell 是一个程序,一般都是放在 /bin 或者 /usr/bin 目录下,当前 Linux 系统可用的 Shell 都记录在 /etc/shells 文件中。/etc/shells 是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。
Shell命令格式
一个 Shell 程序,通常由命令和参数组成,同时,命令也包括短命令和长命令。
Shell命令提示符
我们登录 Linux 的终端之后,便可以看到 Shell 的命令提示符了,Linux 中的 Shell 命令提示符有两种,即 `$` 和 `#`。
Shell修改命令提示符
Linux 中的 Shell 终端提示符是可以进行修改的,Shell 通过 PS1 和 PS2 这两个环境变量来控制提示符的格式,修改 PS1 和 PS2 的值就能修改命令提示符的格式。
Shell HelloWorld
所有编程语言的第一个程序一般都叫 HelloWorld,现在我们来实现第一个 Shell 程序,即 Shell HelloWorld,首先,我们使用 vim 新建一个 helloworld.sh 文件,命令如下:
执行Shell脚本
在 Linux 中,执行一个 Shell 脚本,有四种方式,即使用点,`.`、使用绝对路径或相对路径执行、使用 sh 执行和使用 source 执行。
Shell变量
在所有的编程语言中,几乎都有变量这个概念,变量是用来存放各种数据的一块内存地址,在 Shell 中,也支持变量的定义,Shell 变量定义时不需要指定数据类型。
获取Shell变量值
在 Shell 变量定义后,我们才可以访问变量的值,在 Shell 中,访问变量的值,我们使用 `$` 符号加上变量名即可。
Shell变量单引号与双引号
在定义 Shell 变量时,如果变量中包含空格,我们可以使用单引号或者双引号,但单引号与双引号是有区别的。
命令结果赋值给Shell变量
我们可以将一个 Linux 命令的结果,赋值给一个 Shell 变量,在 Shell 中,我们需要将一个命令的输出结果赋值给一个 Shell 变量,有两种方式, 即使用反引号和使用 `$` 符号。
Shell只读变量
我们在定义 Shell 变量时,默认定义的变量就是可以被修改的,我们还可以定义一个不能被修改的变量,即,使用 readonly 来定义变量。
Shell删除变量
我们在定义 Shell 变量后,如果不想继续使用该变量,我们可以使用 unset 删除该变量,变量被删除后不能再次使用;unset 命令不能删除只读变量。
Shell变量作用域
几乎所有的编程语言的变量都有作用域,Shell 中的变量同样有作用域,Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围)。
Shell命令行参数
运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 `$n` 的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
Shell特殊变量
运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 `$n` 的形式来接收,同时 Shell 还为我们提供了一些特殊的变量。
Shell $与$@区别
Shell 中的 $* 和 $@ 都表示传递给函数或脚本的所有参数,当 $* 和 $@ 不被双引号 `" "` 包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
Shell获取命令退出状态
Shell 中的 $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果。
Shell字符串
几乎所有的编程语言中都有字符串类型,字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)。
Shell字符串长度
在 Shell 中,我们要获取字符串的长度,只需要使用 `${#str}` 的形式即可。
Shell字符串拼接
几乎所有的编程语言的字符串都支持拼接,在 Shell 中,字符串同样可以支持拼接,在 Shell 中,我们要拼接字符串,只需要将两个字符串写在一起即可。
Shell字符串截取
在 Shell 中,我们需要截取字符串,通常有两种方式,即,从指定位置开始截取和从指定字符开始截取。
Shell指定字符字符串截取
Shell数组
和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、 Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。
Shell数组长度
在 Shell 中,我们要获取数组的长度,我们需要使用 `@` 或者 `*` 将数组扩展成列表,然后再次使用 `#` 获取数组的长度。
Shell数组拼接
在 Shell 中,数组也是支持拼接的,也就是将数组进行合并,就是将两个数组连接成一个数组。拼接数组,我们只需要将数组转成列表,并写在一起即可。
Shell删除数组元素
在 Shell 中,数组的元素是可以支持删除的,我们要删除数组的指定下标的元素,我们只需要使用 unset 来删除即可。
Shell内置命令
在 Shell 中,命令可以分为内部命令和外部命令,所谓 Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。
Shell命令别名
在 Shell 中,alias 命令用来给命令创建一个别名。若直接输入该命令且不带任何参数,则列出当前 Shell 进程中使用了哪些别名。
Shell删除命令别名
在 Shell 中,alias 命令用来给命令创建一个别名。如果我们不需要创建的别名了,我们可以使用 unalias 命令来删除别名。
Shell echo命令
在 Shell 中,echo 命令,是一个内置命令,用来在终端输出字符串,并在最后默认加上换行符。
Shell read命令
在 Shell 中,read 也是一个内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。
Shell exit命令
在 Shell 中,exit 也是一个内置命令,用来用来退出当前 Shell 进程,并返回一个退出状态;使用 `$?` 可以接受这个退出状态。
Shell declare和typeset命令
在 Shell 中,declare 和 typeset 都是 Shell 内建命令,它们的用法相同,都用来设置变量的属性。不过 typeset 已经被弃用了,建议使用 declare 代替。
Shell算术运算
在 Shell 中,也是支持算术运算的,即对数字进行加减乘除运算,Shell 的算术运算与其他编程语言的类似。
Shell数学计算
在 Shell 中,双小括号 `(( ))` 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。
Shell自增自减
在 Shell 中,整数也是支持自增和自减运算的,自增实现的功能就是将当前数值加一,自减实现的功能就是将当前数值减一。同时,自增和自减运算也可以分为前自增、后自增、前自减与后自减。
Shell let命令整数运算
在 Shell 中,let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
Shell expr命令
在 Shell 中,expr 命令是 evaluate expressions 的缩写,译为 “表达式求值”。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。
Shell bc命令
在 Shell 中,内置了对整数运算的支持,但是并不支持浮点运算,而 Linux 的 bc 命令可以很方便的进行浮点运算,当然整数运算也是支持的。
Shell bc精度进制
在 Shell 中,我们使用 bc 命令,进行数学运算时,我们还可以通过内置的变量来设置计算的精度以及设置计算的进制。
Shell bc内置函数
在 Shell 中,我们使用 bc 命令,进行数学运算时,除了可以使用内置变量还可以使用内置函数,我们可以使用内置函数,进行正弦、余弦和贝塞尔函数等的运算。
Shell使用bc
在 Shell 脚本中,我们可以借助管道或者输入重定向来使用 bc 计算器。管道是 Linux 进程间的一种通信机制,它可以将前一个命令(进程)的输出作为下一个命令(进程)的输入,两个命令之间使用竖线 `|` 分隔。
Shell流程控制
在程序中,程序运行的流程控制决定程序是如何执行的,主流的程序设计语言一般有三大流程控制语句:分别是顺序控制、分支控制和循环控制。
Shell if条件判断
在 Shell 中,关键字 if 是用于测试某个条件的语句是否满足一定的条件,如果满足特定的条件,则会执行 then 后代码块,否则就忽略该代码块继续执行后续的代码。
Shell elif条件判断
在 Shell 中,关键字 if 是用于测试某个条件语句是否满足一定的条件,如果满足特定的条件,则会执行 if 对应的 then 后缩进的代码块,否则就忽略该代码块继续执行后续的代码。
Shell else条件判断
在 Shell 中,关键字 else 是用于在 if 条件不满足,且所有的 elif 条件也都不满足的情况下,执行的代码逻辑。
Shell if else嵌套
在 Shell 中,if 语句、elif 语句和 else 语句可以进行任意的嵌套。
Shell逻辑运算
在 Shell 中,逻辑运算符是用于连接多个条件(一般来讲就是关系表达式),最终的结果也是返回真或假,即 0 和 1。
Shell判断条件
在 Shell 中,`[[ ]]` 是 Shell 的内置命令,用于检测某个条件是否成立。
Shell case in
在 Shell 中,也支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句。当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。
Shell while循环
Shell 的 while 循环跟 if 条件判断类似,都是在特定条件满足的情况下,执行相对应的代码,不过,while 循环是只要条件满足,会一直执行缩进里面的代码块,这点又类似于 for 循环。
Shell while循环嵌套
Shell 的 while 循环也可以实现嵌套的效果,即 while 循环里面嵌套一个或多个 while 循环。这种写法就类似于 Shell 的 for 循环的嵌套。
Shell while循环打印乘法表
我们使用 Shell 的 while 循环实现打印乘法表的功能。
Shell until循环
Shell 的 until 循环跟 while 循环正好相反,while 循环是当条件成立时,一直执行循环里的逻辑,而 until 循环是当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。
Shell until循环嵌套
Shell 的 until 循环也可以实现嵌套的效果,即 until 循环里面嵌套一个或多个 until 循环。这种写法就类似于 Shell 的 while 循环的嵌套。
Shell until循环打印乘法表
我们使用 Shell 的 until 循环实现打印乘法表的功能。
Shell for循环
在 Shell 中,循环,我们除了可以使用 while 循环、until 循环还可以使用 for 循环。 Shell 中的 for 循环用于重复执行一段相同的或者类似的代码逻辑。
Shell for循环嵌套
Shell 的 for 循环也可以实现嵌套的效果,即 for 循环里面嵌套一个或多个 for 循环。这种写法就类似于 Shell 中的 while 循环的嵌套。
Shell打印乘法表
我们使用 Shell 的 for 循环实现打印乘法表的功能。
Shell for in循环
在 Shell 中,循环,我们除了可以使用 while 循环、until 循环、 for 循环还可以使用 for in 循环。
Shell for in循环嵌套
Shell 的 for in 循环也可以实现嵌套的效果,即 for in 循环里面嵌套一个或多个 for in 循环。这种写法就类似于 Shell 中的 for 循环的嵌套。
Shell for in循环打印乘法表
我们使用 Shell 的 for in 循环实现打印乘法表的功能。
Shell select in循环
Shell 中的 select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。
Shell continue语句
在我们使用 for 循环、while 循环或者 for in 循环时,在某种条件满足的情况下,需要跳过本次循环,继续执行下一次循环,在 Shell 中,跳过本次循环的继续运行下一次循环使用的关键字为 continue。
Shell break语句
在我们使用 for 循环、while 循环或者 for in 循环时,在某种条件满足的情况下,需要终止循环的继续执行,在 Shell 中,终止循环的继续运行使用的关键字为 break。
Shell test命令
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测。
Shell test文件检测
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,可以用来检测文件相关类型与属性。
Shell判断是否为目录
在 Shell 中,我们要判断一个文件是否为目录,可以使用 if 条件判断与 test 命令的 d 参数一起进行判断。
Shell判断文件是否存在
在 Shell 中,我们要判断一个文件是否存在,可以使用 if 条件判断与 test 命令的 `e` 参数一起进行判断。
Shell判断文件是否是普通文件
在 Shell 中,我们要判断一个文件是否是普通文件,可以使用 if 条件判断与 test 命令的 f 参数一起进行判断。
Shell判断文件是否非空
在 Shell 中,我们要判断一个文件是否非空,可以使用 if 条件判断与 test 命令的 s 参数一起进行判断。
Shell判断文件是否有读权限
在 Shell 中,我们要判断一个文件是否有读权限,可以使用 if 条件判断与 test 命令的 r 参数一起进行判断。
Shell判断文件是否有写权限
在 Shell 中,我们要判断一个文件是否有写权限,可以使用 if 条件判断与 test 命令的 w 参数一起进行判断。
Shell判断文件是否有执行权限
在 Shell 中,我们要判断一个文件是否有执行权限,可以使用 if 条件判断与 test 命令的 x 参数一起进行判断。
Shell test数字大小比较
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,可以用来比较两个数字的大小。注意,test 命令只能用来比较整数,不能比较小数。
Shell test字符串比较
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,可以用来进行字符串的相关操作。
Shell判断字符串是否为空
在 Shell 中,我们要判断一个字符串是否为空,可以使用 if 条件判断与 test 命令的 z 参数一起进行判断。
Shell判断字符串是否非空
在 Shell 中,我们要判断一个字符串是否非空,可以使用 if 条件判断与 test 命令的 n 参数一起进行判断。
Shell判断字符串是否相等
在 Shell 中,我们要判断两个字符串是否相等,可以使用 if 条件判断与 test 命令简写形式和 == 一起进行判断。
Shell判断字符串是否不等
在 Shell 中,我们要判断两个字符串是否不等,可以使用 if 条件判断与 test 命令简写形式和 != 一起进行判断。
Shell比较字符串大小
在 Shell 中,我们要比较两个字符串的大小,可以使用 if 条件判断与 test 命令简写形式进行比较。
Shell test逻辑判断
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,可以用来进行逻辑判断的相关操作。
Shell函数
为了完成某一功能的程序指令(语句)的集合,称为函数。Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。
Shell函数声明与定义
在 Shell 中,使用函数前,必须先声明与定义函数。Shell 的函数由关键字 function、函数名、参数列表、函数体和返回语句组成。
Shell函数参数
在 Shell 中,我们定义函数时,不像 C 语言、C++、Python、Java 和 Golang 那样,需要传递参数,Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数。
Shell函数返回值
在 C++、Java、Python 或者 Golang 等大部分编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果就通过 return 语句返回。