Shell

Shell:壳

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序界面的系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写程序。

计算机不认识ASCII字符,需要Shell接收ASCII并翻译给计算机。

1540905917702

目前,Shell共有两种类型:

  • Bourne Shell: 1979年Unix就开始使用Bourne Shell,主文件名为sh(功能比较简单,不常用)

  • C Shell:C Shell 主要在BSD版本的Unix系统中使用,其语法与C类似而得名(BSD:Unix版本)

Shell的两种主要语法类型就是 Bourne Shell 和 C Shell,这两种语法不兼容:

  • Bourne Shell 家族:

    • sh

    • ksh

    • bash(linux标准)

    • psh

    • zsh

  • C Shell 家族:

    • csh

    • tcsh (unix)

配置Shell

我们可以通过如下命令查看当前操作系统使用的shell类型:

也可以查看当前操作系统支持的shell版本:

切换当前的shell:

编写并执行shell脚本

一个shell脚本需要在最前面指定脚本解释器:

创建一个hello world脚本:

子进程默认无法访问父进程中的变量,这是因为父进程中的变量默认对子进程不可见。 如果想要子进程可以访问父进程中变量,可以借助export命令将变量导出,被导出的变量对于进程的子进程是可见的这样就解决了无法访问父进程变量的问题。

变量

变量的分类:

  1. 用户自定义变量:脚本中的变量

  2. 环境变量:用于保存与操作系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。

  3. 位置参数变量:主要用于向脚本传递参数或者数据,变量名称不能自定义,变量作用是固定的

  4. 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

变量命名规则:

  1. 变量名只能由字母数字和下划线组成,并且开头不可以是数字

  2. 变量名不得超过255个字符

  3. 变量名在有效范围内是唯一的

变量数据类型:

  1. 在Bash中,变量的默认类型是字符串类型

  2. Linux中,准确的说,只有string类型,所以不可以对数字进行直接运算

环境变量

用户自定义的环境变量

查看、修改、删除与普通变量一致。

对系统生效的环境变量喝变量作用是固定的。

查看系统中的所有环境变量

常用环境变量:

环境变量为什么大写:

因为系统命令全都是小写,这样可以将环境变量与系统命令区分。

自定义变量

定义:

调用:

变量叠加:

只读变量(注意不可unset):

查看所有变量:

1541149257950

删除变量:

PATH变量

当终端输入一个执行文件的非绝对路径时,linux默认不支持直接执行这个命令,他将会先从命令别名中寻找命令,再从$PATH中定义的路径中依次寻找,找不到就抛出 command not found

往$PATH中添加路径:

什么是PS1和PS2

linux下的bash shell有两级用户提示符:

  1. 第一级是bash在等待命令输入时的提示符,可以通过在用户主目录下.bash_profile文件里设置PS1变量来实现。

  2. 当bash期待输入更多的信息以完成命令时将显示第二级提示符。

比如:你输入cp filename1 \,回车,此时就出现第二级提示符。\是续行的意思,默认的第二级提示符是>。 如果要改变第二级提示符,可以通过在.bash_profile文件里设置PS2变量来实现。

PS1变量

命令提示符设置:

  • \d: 显示日期, 格式星期 月 日

  • : 显示24小时制时间,格式HH:MM:SS

  • \A: 显示24小时制时间,格式HH:MM

  • \H: 显示完整主机名

  • \$: 用户提示符。#root,$普通

  • \u: 用户名

  • \w: 显示所在目录完整名称

  • \W: 显示当前目录最后一个目录

PS2变量

定义换行提示符:

语系变量查询

locale:查询当前系统语系变量

查看linux支持的所有语系:

查看系统默认语系(下次开机以后的系统生效的语言环境):

Linux中文支持

  1. 前提:正确安装中文字体和中文语系

  2. 纯字符界面不支持中文显示,可以使用如zhcon插件来完成此功能(不推荐)

  3. 如果使用第三方工具连接,只需要保证第三方工具的语系设置正确即可

  4. 图形界面会自动支持

位置参数变量

位置参数:

位置参数变量
作用

$n

n代表数字,$0代表命令本身,$1-$9代表第一到第九个参数,10以上的参数需要使用${10}包含

$*

代表命令行中所有的参数,$*把所有的参数看成一个整体

$@

同样代表命令行中的所有参数,但是$@将每个参数区分对待

$#

代表命令行中所有参数的个数

具体示例:

1541301397256

预定义变量

预定义变量
作用

$?

最后一条执行命令的返回状态,如果非0,代表正确执行

$$

当前进程的进程号 PID

$!

后台运行的最后一个进程的进程号

注释

数据类型

准确地说,shell的数据类型只有string,没有数字等其他类型。

string 字符串

shell的字符串有两种表达方式:

  1. 使用单引号''表示的多行字符串,被包裹的文本不会进行变量转义

  2. 使用双引号""表示的多行字符串,被包裹的文本会做变量转义(有必要需要加入花括号区分界限)

  3. 如果字符串没有空格,可以去除单双引号表示

字符串拼接:

获取字符串长度:

字符串截取:

数组类型

bash支持一维数组,并且不限定数组大小。数组的下标从0开始编号,且元素使用小括号定义。

定义并访问数组:

可执行的字符串

运算符

算数运算符

使用算数运算符共有以下几种方式:

  • $((运算符))$[运算符] (推荐)

  • expr

  • let

  • declare (不推荐)

$((运算符))$[运算符]

shell支持的数值运算

1542418674368

与或运算使用0和1表示

expr

反引号里面的内容将会被作为命令、脚本直接运行得到结果

let

let命令是Bash中用于计算的工具,提供常用运算符还提供了方幂**运算符。在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1。

declare -i

使用declare -i,不推荐:

关系运算符

关系运算符用于判断两个数字字符串之间的关系,如果字符串不是数字字符串,将无法处理。

布尔运算符

布尔运算符共有三种与或非:

逻辑运算符(短路运算符)

逻辑运算符需要用双方括号包裹

字符串运算符

文件测试运算符

echo

读作 ai kou

test

test命令可以用于替换if语句中的中括号:

read

示例:

declare

再Linux中变量全是字符串类型,所以变量无法直接进行运算,所以我们需要借助declare命令声明变量类型:

整型:

数组

声明环境变量:

列出系统中所有变量的类型:

只读变量:

流程控制

if

条件可以为 [[]]代表可以使用短路逻辑运算符,(())代表可以使用><直接判断数字,比如if (( $a > $b ))

case

通常用来处理枚举:

不仅是数字,文本也可以:"hobby") echo "你选择了 'hobby'"

for

while

无限循环:

break 和 continue

函数

函数的调用和参数:

通过$?获取函数返回值:

Shell的参数传递

执行Shell脚本时,可以向脚本传递参数,脚本内可以通过$n,n代表一个数字,来获取传入的参数信息。相关的参数处息如下:

参数处理
说明

$#

参数个数

$*

所有的参数,以一个字符串显示

$$

脚本运行的当前的id号

$!

后台运行的最后一个进程的ID号

$?

显示上一个命令的运行状态,如果为0代表成功,其他表示失败

$0

当前执行的脚本的文件名称

最后更新于

这有帮助吗?