一、Shell
1. Shell概述
Shell是用户和计算机内核交互的中间人,能够把用户的指令转为计算机能够识别的二进制语言将内核的计算结果转为人类所熟悉的语言,也就是命令解释器。
Shell有很多种,Linux系统常见的Shell命令解释器包括:
- BASH:Linux系统当前的主流命令解释器。
- SH:原先的命令解释器,被BASH所替代。
- CSH:类C语言的Shell。
- TCSH:相当于CSH的升级版。
- NOLOGIN:一种禁止用户登录的Shell。
Shell脚本是一种描述语言,脚本语言是解释执行的,也就是说不需要编译Shell脚本,可以直接在系统中通过命令解释器运行。允许用户通过编写一系列可执行的命令来控制计算机的行为,实现系统命令和系统程序的自动化。
2. Shell基本语法
2.1 Shell脚本基本格式
在Linux系统中,一切皆文件。但是为了方便辨识文件,Shell脚本的后缀名是.sh。下面是Shell脚本的基本格式:
#! /bin/bash# 执行语句
- #! /bin/bash:指定脚本的解释器,可以不设置。默认的就是系统所使用的命令解释器。
- 在Shell脚本中,#表示注释,执行脚本不会被执行。
2.2 Shell脚本的运行
-
调用解释器来运行脚本。
bash test.sh
-
设置脚本文件的权限,从而直接运行。
chmod 777 test.sh ./test.sh # 执行当前目录下的test.sh脚本
-
使用source命令运行脚本。
source test.sh
-
source会读取指定的 Shell 程序文件,并且直接在当前的Shell环境中依次执行其中所有的语句。
而前面两种运行方式,是在子Shell环境中执行,不会影响当前Shell。
-
-
通过定时任务运行脚本。
二、重定向
在Linux中,重定向是一种改变标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)流方向的操作。默认情况下,标准输入流来自键盘,标准输出和标准错误输出流显示在屏幕上。通过使用重定向操作符,可以将这些流重定向到文件或其他命令。
Linux的文件描述符中, 0 表示标准输入,1 表示标准输出,2 表示标准错误输出。
1. 输入重定向(<)
将文件内容作为标准输入传递给命令。
命令 < 文件
2. 输出重定向(>)
将命令的标准输出重定向到文件中。如果文件不存在,会创建该文件;如果文件已存在,内容会被覆盖。
命令 > 文件
3. 追加重定向(>>)
将命令的标准输出追加到文件末尾。如果文件不存在,会创建该文件;如果文件已存在,新内容会添加到文件末尾,而不是覆盖原有内容。
命令 >> 文件
4. 错误重定向(2>)
将命令的标准错误输出重定向到文件中。
命令 2> 文件
5. 错误追加重定向(2>>)
将命令的标准错误输出追加到文件末尾。
命令 2>> 文件
6. 同时重定向标准输出和标准错误输出(&>)
将标准输出和标准错误输出都重定向到同一个文件。
命令 &> 文件
7. 同时追加标准输出和标准错误输出(&>>)
将标准输出和标准错误输出都追加到同一个文件的末尾。
命令 &>> 文件
三、变量
1. 变量概述
变量是一个可以变化的量,就像一个容器,可以保存不同类型的数据。每个变量都有一个唯一的名称,也就是变量名。变量分为默认变量和自定义变量,默认变量是系统定义好的,一般情况是不能修改的;自定义变量是用户自定义的,自定义变量名有以下注意事项:
- 不要使用命令当作变量名称。
- 不要使用中文。
- 不要使用特殊符号开头,下划线除外。
- 只能字母或者下划线开头,数字不能开头。
- 尽量使用有具体含义的英文来定义变量,提高可读性。
常见的变量数据类型:
- 字符串(String)类型:通常用引号包围。
- 整数(Int)类型:存储整数,没有小数部分。
- 布尔(Boolean)类型:true或false,表示真或假。
2. 变量引用
在 Shell 中,用户可以通过在变量名前面加上$来获取该变量的值。除此之外,在Shell中,有三种引号:单引号、双引号和反引号。
- 单引号:括起来的字符都作为普通字符出现,属于强引用。
- 双引号:括起来的字符,除$、\、'、"等特殊字符保留特殊功能外,其他的都是普通字符,属于弱引用。
- 反引号:括起来的字符会被Shell当作是命令。
3. read – 读取单行数据内容
read命令的功能是用于读取单行数据内容,一般是从标准输入中读取数值,用于给变量赋值。在Shell脚本中,可以使用这个命令来实现从键盘读取用户所输入的值。
read [选项] 变量
常见的选项:
选项 | 功能 |
---|---|
-p | 设置提示信息 |
4. 变量的种类
在Shell脚本中,根据不同分类方法,变量可以被分为多种。以下是常见的变量:
- 全局变量:在任何地方都可以调用的变量,直接赋值的变量就是全局变量。
- 局部变量:只能在一定范围内调用的变量,需要使用local声明定义。
- 环境变量:属于特殊的全局变量,由操作系统或用户设置。可以使用export声明定义。
- 位置变量:用于接收传递给脚本的参数的变量,$1、$2、$3等,其中$1是第一个参数,$2是第二个参数,依此类推。
- 预定义变量:命令解释器设置的变量。
- $*:所有的位置参数,将所有参数视为一个整体。
- $@:所有的位置参数,每个参数被视为单独的个体。
- $#:递给脚本的位置参数个数。
- $?:上一次执行命令的返回码(退出状态,也就是命令是否执行成功)。返回码分为0和非0,0表示执行成功,非0表示执行失败。
四、Shell运算
1. 运算符
在Shell脚本中,常见的运算符包括:加法(+)、减法(-)、乘法(*)、除法(/)、取余(%)。
2. 整数运算
-
(())
只能进行整数运算,基本格式如下所示。
((运算表达式))
- 可以使用$来调用运算的结果。
- 调用变量可以不使用$,(())会自动解析。
示例:
((a=1+1)) echo $a #2echo $((1+2)) #3
-
expr
基本格式如下所示。
expr 变量 运算符 变量
- 变量(数值)和运算符之间要有空格。
- 调用运算结果可以使用$()或者反引号。
- 使用*进行乘法运算时需要加上反斜杠,否则Shell会认为是通配符。
示例:
expr 1 + 2 #3a=$(expr 1 + 2) echo $a #3b=`expr 5 + 4` echo $b #9
-
let
基本格式如下所示。
let 变量=运算表达式
示例:
let a=1+2 echo $a #3
-
$[]
基本格式如下所示。
$[运算表达式]
- 与(())不同,不能在括号内将运算结果赋值给变量。
示例:
a=$[1+2] echo $a #3
3. 小数运算
-
bc
bash默认不支持小数运算,因此引入bc来实现小数计算。基本格式如下所示。
echo 运算表达式 | bc
- bc默认是整数运算,要进行小数运算还需要设置精确位数。
- 调用运算结果可以使用$()或者反引号。
示例:
# 设置结果的精确位数是2 echo $(echo "scale=2;9/2" | bc)
-
awk
基本格式如下所示。
awk "BEGIN{print 运算表达式}"
示例:
awk "BEGIN{print 9/2}" #