【Linux笔记】Shell
1. Shell简介
在Linux系统与用户之间,有一个外壳程序,这个程序就是 shell
。shell程序是由C语言编写的,它使用户可以更加高效、安全、低成本地使用Linux内核。shell 本身并不是内核的一部分,它只是使用Linux的系统调用编写的一个应用程序。当用户使用终端设备连接上Linux系统后,shell程序便会监视该终端的任何变化,用户在终端设备上进行的任何输入,都会被传递给shell程序,由shell程序进行解析、处理,再进一步传递给内核进行处理,最后将输出传递到终端上。由此可见,shell程序是用户与Linux内核交互的桥梁。
那些用户在终端上输入的、可被shell程序解析并处理的文本,被称为 Shell命令
,而进行处理的shell程序被称为 Shell解释器
。当把一些Shell命令有逻辑性的组织在一个文件中,再让Shell解释器去解析这个文件执行,这个文件就被称为 Shell脚本
,编写该脚本的语言,就被称为 Shell编程语言
。
综述,Shell可以说是一个程序,是一个脚本的解释器,也是一个编程语言。
编译型语言和解释型语言的区别
编译型语言在程序运行前要将所有代码都翻译为二进制的可执行文件,在运行时是不需要源码的。
解释型语言是在执行时,根据源码一边翻译一边执行,不用等所有代码都翻译完才去执行,不会根据源码文件生成任何可执行文件。
2. Shell解释器
在Linux中有很多类型的shell,不同的shell具备不同的功能,选用的shell决定了脚本中函数的语法以及和支持的数据类型。在不同的Linux发行版本中,所默认使用的shell不同,可以在终端中使用 cat /etc/shells命令查看当前操作系统上有多少种shell。
目前有很多类型的shell,他们都有着自己的特点和用途,以下是常用的shell类型
- sh(Bourne Shell):由Stephen Bourne编写的shell程序,是Unix上标准的shell,也是第一个流行的Shell。
- csh:由Bill Joy设计,语法与C语言语法类似,故称为csh。
- ash:一个简单的轻量级的Shell,占用资源少,适合运行于低内存环境。
- bash(Bourne Again Shell):由GNU组织开发,保持了对Bourne Shell的兼容性,功能也更强大,是Linux发行版的默认Shell。
- dash(Debian Almquist shell):从NetBSD派生而来的轻量级shell,相较于bash,启动更快,更符合POSIX标准,但功能特性更少。
在很多Linux系统中,/bin/sh是指向 /bin/bash 的。
3. Shell脚本编写
在linux系统中,shell脚本以.sh
作为文件的后缀名,在其文件的开头,往往会有#!/bin/sh或#!/bin/bash的一行,该语句含义为:选择解释该脚本文件的解释器。
3.1. 选择Shell解释器
在终端中,可以输入以下指令来查看当前终端所使用的Shell1
2
3
4
5
6env | grep SHELL
或者
ps -p $$
更改终端的Shell设置
chsh -s /bin/bash
在脚本文件中选择脚本解释器,在文件的开头以下面的格式进行选择1
2
3
4
5
6
7
8!<shell path>
e.g
选择/bin目录下的sh作为脚本的解释器
!/bin/sh
选择/usr/local/bin/目录下的dash作为脚本的解释器
!/usr/local/bin/dash
3.2. Shell脚本语法
在大多数的Linux系统中,bash是默认使用的shell,其功能也非常强大。下述的语法皆是该解释器所支持的语法格式。
Shell脚本中的注释
在Shell脚本中,仅支持单行注释,且不支持局部注释,如果某行的开头为#符号,#!除外,则该行会被解释器直接忽略。
可以通过:空命令和<<输入重定向符号来达到多行注释的效果。
e.g.
1 | !/bin/sh |
3.2.1 Shell变量
在解释型语言中,在定义变量时通常不需要指明其数据类型,直接赋值即可,在bash中也是如此。 在单引号中的内容不会被shell进行再次解析,全部都被作为普通字符。
在bash中,每个变量的值都是字符串,无论是否使用引号,值都是以字符串的形式存储。
在定义变量时,= 周围不能有空格,若变量中的值有空格。需要使用单引号或双引号括起来。
若要将某一命令的返回结果返回给变量,可以使用反引号` 或 $()将命令包含起来。 e.g.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15VARIABLE1=Hello
VARIABLE2=world
VARIABLE3="Hello world"
双引号中的变量被展开 VARIABLE4=Hello World
VARIABLE4="$VARIABLE1 $VARIABLE2"
单引号中的字符不进行展开 VARIABLE5=$VARIABLE1 $VARIABLE2
VARIABLE5='$VARIABLE1 $VARIABLE2'
VARIABLE6的值为文件/proc/meminfo的内容
VARIABLE6=`cat /proc/meminfo`
VARIABLE7的值为文件/proc/cpuinfo的内容
VARIABLE7=$(cat /proc/cpuinfo)
在双引号中的内容会被shell先执行其中的变量或命令,再展开为普通字符。
环境变量
在Shell中存在有两种变量,环境变量与本地变量,这里的分类主要是根据变量的生命周期进行划分的,以下是常用的环境变量。
环境变量 | 含义 |
---|---|
$PWD | 当前Shell所在的工作目录 |
$PATH | 当前Shell环境下,系统查找可执行程序的路径 |
$SHELL | 当前终端使用的shell程序 |
$0 | 当前Shell执行程序的名称,在终端环境下,该值等于$SHELL,在脚本中,该值等于执行脚本时输入的指令 |