本文为刚毕业参加工作时,初学Linux操作系统时做的一些笔记,适合初学者读阅,内容不保证百分百正确,若您对其中的描述有任何疑问可在留言板块进行留言。

以下为我使用的C语言的运行和编译环境:
System Version : Ubuntu22.04.1
Linux kernel Version : 5.19.0
GCC Version : 11.3.0
STDC Version : 201710L

摘要: Shell编程、bash语法、常用的Linux命令。

1. Shell简介

在Linux系统与用户之间,有一个外壳程序,这个程序就是 shell。shell程序是由C语言编写的,它使用户可以更加高效、安全、低成本地使用Linux内核。shell 本身并不是内核的一部分,它只是使用Linux的系统调用编写的一个应用程序。当用户使用终端设备连接上Linux系统后,shell程序便会监视该终端的任何变化,用户在终端设备上进行的任何输入,都会被传递给shell程序,由shell程序进行解析、处理,再进一步传递给内核进行处理,最后将输出传递到终端上。由此可见,shell程序是用户与Linux内核交互的桥梁。
那些用户在终端上输入的、可被shell程序解析并处理的文本,被称为 Shell命令,而进行处理的shell程序被称为 Shell解释器。当把一些Shell命令有逻辑性的组织在一个文件中,再让Shell解释器去解析这个文件执行,这个文件就被称为 Shell脚本,编写该脚本的语言,就被称为 Shell编程语言
综述,Shell可以说是一个程序,是一个脚本的解释器,也是一个编程语言。

编译型语言和解释型语言的区别
编译型语言在程序运行前要将所有代码都翻译为二进制的可执行文件,在运行时是不需要源码的。完成编译过程的软件就叫做编译器。C/C++、Go、汇编等语言都是编译型语言。

解释型语言是在执行时,根据源码一边翻译一边执行,不用等所有代码都翻译完才去执行,不会根据源码文件生成任何可执行文件。完成解释过程的软件就叫做解释器。Shell、Java、Python等语言都是解释型语言。

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解释器

在终端中,可以输入以下指令来查看当前终端所使用的Shell

1
2
3
4
5
6
env | 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
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

ls -l
:<<!
这是一段多行注释
这之中的内容会输入给[:]空命令,而该命令永远返回0
[<<]是输入重定向符号,后面的[!]是一个标记符,用于表示输入在哪个地方结束,可以是任意多个字符
若在注释中出现了被反引号“`”包含的内容,改内容会被当做shell语句的内容,在被输入之前执行
下面被反引号包含的语句就会被执行,会在该脚本的工作目录下生成test.txt文件
`touch test.txt`
所以使用该多行注释时一定要注意
!

ls -l

3.2.1 Shell变量

在解释型语言中,在定义变量时通常不需要指明其数据类型,直接赋值即可,在bash中也是如此。
在bash中,每个变量的值都是字符串,无论是否使用引号,值都是以字符串的形式存储。
在定义变量时,= 周围不能有空格,若变量中的值有空格。需要使用单引号或双引号括起来。
若要将某一命令的返回结果返回给变量,可以使用反引号`$()将命令包含起来。

e.g.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
VARIABLE1=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先执行其中的变量或命令,再展开为普通字符。

环境变量
在Shell中存在有两种变量,环境变量与本地变量,这里的分类主要是根据变量的生命周期进行划分的,以下是常用的环境变量。

环境变量 含义
$PWD 当前Shell所在的工作目录
$PATH 当前Shell环境下,系统查找可执行程序的路径
$SHELL 当前终端使用的shell程序
$0 当前Shell执行程序的名称,在终端环境下,该值等于$SHELL,在脚本中,该值等于执行脚本时输入的指令