Shell:基础篇
介绍
Shell 是计算机操作系统中的一个重要组成部分,尤其在类Unix系统(如Linux、BSD等)以及早期的MS-DOS等系统中扮演着核心角色。
Shell 是一种命令行界面(CLI)程序,通常被称为命令解释器,它是用户与操作系统内核之间交互的接口或桥梁。
命令行界面(CLI)程序是一种软件应用程序,它专为通过字符界面与用户交互而设计,用户通过键盘输入特定的文本命令及其相关参数来进行操作。在CLI程序中,没有图形元素,如窗口、按钮或菜单,所有的交互完全依赖于文本命令和响应。
具体而言,Shell 主要具有以下几个特点和功能:
- 命令解释器:Shell 接收用户通过键盘输入的命令,解析这些命令并将其转换成内核能理解的操作请求。
- 脚本语言:Shell 不仅允许用户输入单个命令,还支持编写包含一系列命令和控制结构的脚本文件(称为Shell脚本或Shell程序)。这些脚本可以实现自动化任务,简化重复性工作,或是构建复杂的系统管理流程。
- 用户交互:Shell 提供了交互式的命令行环境,用户可以在提示符下实时输入和执行命令,获取即时反馈。
- 环境配置:Shell 可以设置和管理用户的环境变量,影响程序的行为和系统环境配置。
- I/O重定向与管道:Shell 允许用户将命令的标准输入、输出重定向至文件或其他命令,同时支持通过管道(|)连接多个命令,形成数据流式处理。
- 命令扩展与别名:Shell 可以为命令添加额外的便利功能,比如命令补全、命令历史记录,以及定义命令别名等。
流行的Shell有多种,例如Bash(Bourne-Again SHell)、sh(Bourne Shell)、csh(C Shell)、zsh(Z Shell)等。其中,bash在大多数Linux发行版中被用作默认的登录Shell。
运行
运行 Shell 脚本有多种方法:
- 作为可执行程序运行:直接执行,需有执行权限,
- 确保脚本文件的第一行包含了正确的Shebang(#!),例如 #!/bin/bash 或 #!/usr/bin/env bash,用于指定解释此脚本的Shell版本。
- 给脚本添加执行权限:
chmod +x script.sh
- 使用相对路径或绝对路径执行:相对路径
./script.sh
;绝对路径/path/to/script.sh
。
- 作为解释器参数:
- 如
bash script.sh
- 即使脚本没有执行权限,也可以通过明确指定解释器来执行
- 如
- source命令:当希望脚本中的环境变量更改、函数定义等对当前Shell会话生效时,可以使用source命令。
- 如
source script.sh
- 如
语法
变量
在Shell中定义变量非常直观且简单,无需事先声明变量类型,只需给变量分配一个值即可完成定义。
如name="chilun"
,即定义了一个变量name为字符串“chilun”。
变量命名规则
- 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
- 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
- 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
- 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
定义变量
- 直接赋值:通过等号(=)来给变量赋值,注意变量名和等号之间不能有空格。
name="chilun"
:将“chilun”字符串赋给变量 name。
- 语句赋值:可使用for循环等语句对变量进行赋值。
for file in $(ls /etc)
:将 /etc 目录下的所有文件和目录名逐个赋值给变量 file。
- 命令赋值:可使用标准输入读取命令等对变量进行赋值。
read -p "请输入你的名字: " name
:用户输入的名字会被赋值给变量 name。
- 定义变量:使用
declare
或typeset
命令定义变量时可以指定变量的类型(如整型、数组等)。declare -i age=30
:定义一个整数类型的变量age并赋值为30。
- 计算变量:使用
let
命令执行简单的算术运算并赋值给变量。let b=a+1
:将b赋值为a+1后的整数;如果直接b=a+1
,b会被赋值为“a+1”的字符串。
- 定义环境变量:使用
export
命令可以定义环境变量,在子shell进程中变量也能被访问。export PATH=$PATH:/usr/local/bin
:将新的路径添加到已存在的PATH环境变量中。
- 删除变量:使用
unset
命令删除已定义的变量。unset name
:删除变量name。
- 只读变量:使用
readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变,不能被删除。readonly name
:之后再修改就会报错:name: readonly variable
。
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可。
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界(推荐给所有变量加上花括号)。
1 |
|
输出为:
chilun
chilun
变量类型
Shell 支持不同类型的变量。
字符串变量
在 Shell中,变量通常被视为字符串。
在Bash中,所有变量值本质上都是字符串。即使一个变量可用于数值计算,其在内部依旧是以字符串的形式存储的,只是在进行算术运算时进行了相应的转换和处理。
可使用单引号或双引号来定义字符串,比如:a='Hello, World!'
或者b="Hello, World!"
。
当直接赋值一个不包含变量扩展、算术扩展或其他形式扩展的纯文本给一个变量时,Bash也会将这个值当作字符串来处理,如c=hello,World!
。
(当设置一个变量时,其值默认被视为一个整体,直到遇到第一个未经转义的特殊字符为止。如果c=hello, World!
就会报错,因为存在空格,空格是Bash解析命令行参数时的分隔符,会导致Bash会尝试将hello,
、World!
视为不同的参数。)
1 |
|
输出结果为:
Hello, World! Hello, World! hello,World!
整数变量
可以使用 declare 或 typeset 命令来声明整数变量。
这样的变量只包含整数值,例如:declare -i a=42
。
这样的声明告诉Shell将a视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。
示例:
1 |
|
输出为:
43
(如果不声明为整数,b就会被看做是“a+1”的字符串。)
数组变量
Shell 支持数组,允许在一个变量中存储多个值。括号用来表示数组,数组元素用”空格”符号分割开。
数组可以是整数索引数组或关联数组:
- 整数索引数组:
array1=(1 2 3 4 5)
- 关联数组:
1
2
3declare -A array2
array2['he']="wor"
array2['llo,']="ld!"
示例:
1 |
|
输出为:
1 2 3 4 5
world!
未完待续……
字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。
1 |
|
输出为:
${a}
由于单引号里的任何字符都会原样输出,所以单引号字符串中无法输出单引号(不支持转义),但可成对出现,作为字符串拼接使用。
1 |
|
输出为:
${a}${a}
双引号
双引号字符串支持变量展开和转义字符。
1 |
|
输出为:
chilun${a}
字符串操作
获得长度
使用`$