Shell 简介

Shell 是用户与操作系统(如 Linux、Unix)内核交互的命令行接口(CLI)。它既是一种命令解释器,也是一种脚本编程语言,用于直接控制计算机或自动化任务。

1. Shell 特性

shell 是一门解释型、弱类型、动态语言,我们平时登录成功一个用户后进入的就是 shell 解释器(默认为 bash)的交互式环境,我们敲的命令其实都属于 shell 这门语言的语法。

  • 解释型语言(Interpreted Language):代码无需预先编译,而是通过解释器(Interpreter)逐行翻译并执行
  • 弱类型语言(Weakly Typed Language):变量的数据类型可以隐式转换,无需显式声明或强制转换。
  • 动态语言(Dynamically Typed Language):变量的数据类型在运行时确定,且可以随时改变。
# 动态语言变量定义示例
x = 10      # x 是整数
x = "hello" # x 变为字符串

# 对比静态语言需要在编译时确定变量类型,以 go 为例:
var x int = 30
var x string = "Hello"
Bash

2. Shell 程序示例

#!/bin/bash
 
# 输出 hello world!
echo "hello world!"  
Bash
  • !/bin/bash:指定运行时使用的 shell 解释器,此处为 bash。
  • #:注释符号。

3. Shell 的几种执行方式

绝对路径+文件内指定解释器:

# 需要权限:
# 对沿途目录有x权限
# 对目标文件有r和x权限
 
[admin@pingk ~]$ /home/admin/hello.sh
hello world! 
Bash

相对路径+文件内指定解释器:

# 需要权限:
# 对沿途目录有x权限
# 对目标文件有r和x权限
 
[admin@pingk ~]$ ./hello.sh  # 相对路径的方式,加./作为前缀表示以当前目录开始
hello world!
Bash

命令行显式指定解释器:

# 需要权限:
# 对沿途目录有x权限
# 对目标文件有r权限即可
## 因为我们执行的是解释器,解释器(如 /bin/bash)本身具有 x 权限而解释器需要读文件内容来执行,所以需要对目标文件有r权限即可。
 
[admin@pingk ~]$ bash ./hello.sh
hello world!
Bash

上述三种执行方式都是在当前 shell 环境下开启了一个新的 shell 解释器环境/子 shell 来执行程序。脚本程序在子 shell 中运行完毕后,子 shell 环境随即关闭,然后返回到父级 shell 即当前 shell 环境中,下面这种方式则是在当前 shell 环境执行程序:

# 需要权限:
# 对沿途目录有x权限
# 对目标文件有r权限即可
 
[admin@pingk ~]$ . hello.sh  # 相对路径
hello world!
[admin@pingk ~]$ . /home/admin/hello.sh  # 绝对路径
hello world!
[admin@pingk ~]$ source hello.sh  # 与上述方式等效
hello world!
Bash

使用子 shell 执行程序与在当前 shell 执行程序的区别:

# 一个 shell 环境就是一个单独的全局作用域,不同的shell环境,无法访问彼此 shell 环境中的变量

# 在当前环境定义变量
x="父shell环境"

# 示例程序
#!/bin/bash  
echo $x  # 我们在这里访问一下全局变量x
 
[admin@pingk ~]$ source hello.sh  # 在当前shell环境执行,可以取到变量 x 的值
父shell环境

[admin@pingk ~]$ bash hello.sh  # 在子shell环境执行,则不能取到变量 x 的值 
Bash

何时选择哪种方式:

  • 在子 shell 中运行:
    • 需要运行独立任务,避免污染当前Shell环境。
  • 在当前 shell 中运行:
    • 修改当前Shell环境(如加载别名、环境变量)。
    • 程序需要依赖当前环境。

4. Shell 调试模式

# 以调试的方式运行
bash -vx script.sh  # 不加-v选项,只会显示程序中运行的代码,不会显示注释信息

# 语法检查(不执行)
bash -n script.sh  # 仅检查语法错误

# 调试脚本部分代码
#!/bin/bash
set -x  # 开启调试
echo "Debugging..."
set +x  # 关闭调试
Bash
上一篇
下一篇