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 脚本有多种方法:

  1. 作为可执行程序运行直接执行,需有执行权限,
    • 确保脚本文件的第一行包含了正确的Shebang(#!),例如 #!/bin/bash 或 #!/usr/bin/env bash,用于指定解释此脚本的Shell版本。
    • 给脚本添加执行权限:chmod +x script.sh
    • 使用相对路径或绝对路径执行:相对路径./script.sh;绝对路径/path/to/script.sh
  2. 作为解释器参数
    • bash script.sh
    • 即使脚本没有执行权限,也可以通过明确指定解释器来执行
  3. source命令:当希望脚本中的环境变量更改、函数定义等对当前Shell会话生效时,可以使用source命令。
    • source script.sh

语法

变量

在Shell中定义变量非常直观且简单,无需事先声明变量类型,只需给变量分配一个值即可完成定义
name="chilun",即定义了一个变量name为字符串“chilun”。

变量命名规则

  • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
  • 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
  • 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
  • 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。

定义变量

  1. 直接赋值:通过等号(=)来给变量赋值,注意变量名和等号之间不能有空格。
    • name="chilun":将“chilun”字符串赋给变量 name。
  2. 语句赋值:可使用for循环等语句对变量进行赋值。
    • for file in $(ls /etc) :将 /etc 目录下的所有文件和目录名逐个赋值给变量 file。
  3. 命令赋值:可使用标准输入读取命令等对变量进行赋值。
    • read -p "请输入你的名字: " name:用户输入的名字会被赋值给变量 name。
  4. 定义变量:使用declaretypeset命令定义变量时可以指定变量的类型(如整型、数组等)。
    • declare -i age=30:定义一个整数类型的变量age并赋值为30。
  5. 计算变量:使用let命令执行简单的算术运算并赋值给变量。
    • let b=a+1:将b赋值为a+1后的整数;如果直接b=a+1,b会被赋值为“a+1”的字符串。
  6. 定义环境变量:使用export命令可以定义环境变量,在子shell进程中变量也能被访问。
    • export PATH=$PATH:/usr/local/bin:将新的路径添加到已存在的PATH环境变量中。
  7. 删除变量:使用unset命令删除已定义的变量。
    • unset name:删除变量name。
  8. 只读变量:使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变,不能被删除。
    • readonly name:之后再修改就会报错:name: readonly variable

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可。
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界(推荐给所有变量加上花括号)。

1
2
3
name="chilun"
echo $name
echo ${name}

输出为:

chilun
chilun

变量类型

Shell 支持不同类型的变量。

字符串变量

在 Shell中,变量通常被视为字符串。
在Bash中,所有变量值本质上都是字符串。即使一个变量可用于数值计算,其在内部依旧是以字符串的形式存储的,只是在进行算术运算时进行了相应的转换和处理。
可使用单引号或双引号来定义字符串,比如:a='Hello, World!'或者b="Hello, World!"

当直接赋值一个不包含变量扩展、算术扩展或其他形式扩展的纯文本给一个变量时,Bash也会将这个值当作字符串来处理,如c=hello,World!
(当设置一个变量时,其值默认被视为一个整体,直到遇到第一个未经转义的特殊字符为止。如果c=hello, World!就会报错,因为存在空格,空格是Bash解析命令行参数时的分隔符,会导致Bash会尝试将hello,World!视为不同的参数。)

1
2
3
4
5
#!/bin/bash
a='Hello, World!'
b="Hello, World!"
c=hello,World!
echo ${a} ${b} ${c}

输出结果为:

Hello, World! Hello, World! hello,World!

整数变量

可以使用 declare 或 typeset 命令来声明整数变量。
这样的变量只包含整数值,例如:declare -i a=42
这样的声明告诉Shell将a视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。

示例:

1
2
3
4
#!/bin/bash
a=42
declare -i b=a+1
echo ${b}

输出为:

43

(如果不声明为整数,b就会被看做是“a+1”的字符串。)

数组变量

Shell 支持数组,允许在一个变量中存储多个值。括号用来表示数组,数组元素用”空格”符号分割开。
数组可以是整数索引数组关联数组

  • 整数索引数组:array1=(1 2 3 4 5)
  • 关联数组:
    1
    2
    3
    declare -A array2
    array2['he']="wor"
    array2['llo,']="ld!"

示例:

1
2
3
4
5
6
array1=(1 2 3 4 5)
echo ${array1[0]} ${array1[1]} ${array1[2]} ${array1[3]} ${array1[4]}
declare -A array2
array2['he']="wor"
array2['llo,']="ld!"
echo ${array2['he']}${array2['llo,']}

输出为:

1 2 3 4 5
world!

未完待续……

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。

1
2
3
#!/bin/bash
a=chilun
echo '${a}'

输出为:

${a}

由于单引号里的任何字符都会原样输出,所以单引号字符串中无法输出单引号(不支持转义),但可成对出现,作为字符串拼接使用。

1
2
3
#!/bin/bash
a=chilun
echo '${a}''${a}'

输出为:

${a}${a}

双引号

双引号字符串支持变量展开和转义字符。

1
2
3
#!/bin/bash
a=chilun
echo "${a}""\${a}"

输出为:

chilun${a}

字符串操作

获得长度

使用`$


Shell:基础篇
http://shoumingchilun.github.io/2024/03/21/backend/language/shell/shell1/
作者
寿命齿轮
发布于
2024年3月21日
许可协议