【Linux入门】Shell 与第一个 Shell 脚本:认识命令行解释器,写出 Hello World

文章目录

  • [一、Shell 是什么](#一、Shell 是什么)
  • [二、Linux 提供的 Shell 解析器](#二、Linux 提供的 Shell 解析器)
  • [三、bash 和 sh 的关系](#三、bash 和 sh 的关系)
  • [四、CentOS 默认解析器是 bash](#四、CentOS 默认解析器是 bash)
  • [五、Shell 脚本入门](#五、Shell 脚本入门)
    • [1. 脚本格式](#1. 脚本格式)
    • [2. 第一个脚本:输出 hello shell](#2. 第一个脚本:输出 hello shell)
    • [3. 脚本的常用执行方式](#3. 脚本的常用执行方式)
  • 六、总结

无论是运维、后端开发还是大数据方向,Shell 都是 Linux 下绕不开的第一课。本文带你从"Shell 是什么"讲起,手把手写出并运行你的第一个 Shell 脚本。

一、Shell 是什么

Shell 是一个命令行解释器(Command Interpreter),它接收应用程序 / 用户的命令,然后调用操作系统内核去完成具体工作。

复制代码
用户 / 应用程序
      │  输入命令
      ▼
   Shell(命令行解释器)
      │  调用系统调用
      ▼
   操作系统内核(Kernel)
      │
      ▼
     硬件

同时,Shell 还是一门功能相当强大的编程语言------易编写、易调试、灵活性强,可以用来编写自动化脚本完成批量任务。

二、Linux 提供的 Shell 解析器

Linux 系统自带多种 Shell,可以使用 cat /etc/shells 查看系统当前支持的合法登录 Shell(/etc/shells 文件记录了系统中所有可用的 Shell 路径):

shell 复制代码
cat /etc/shells

常见的解析器有:

shell 复制代码
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

补充 :除了上面这些,常见的还有 /bin/zsh(macOS 从 Catalina 版本起默认使用 zsh)。其中 bash 兼容 sh,且功能更强大,是目前绝大多数 Linux 发行版的默认 Shell。

三、bash 和 sh 的关系

在 CentOS/RHEL 等系统中,/bin/sh 其实是指向 /bin/bash 的符号链接 ,也就是说 sh 本质上就是 bash。可以用以下命令验证:

shell 复制代码
cd /bin
ll | grep bash

输出中可以看到 sh -> bash 的软链接关系。也可以使用 which bash 查看 bash 命令的具体路径:

shell 复制代码
which bash
# /usr/bin/bash

四、CentOS 默认解析器是 bash

在终端中查看当前用户默认使用的 Shell:

shell 复制代码
[root@node1 bin]# echo $SHELL
/bin/bash

补充 :$SHELL 是系统预定义的环境变量,记录当前用户默认的 Shell。此外,/etc/passwd 文件中每行最后一个字段,也记录了该用户登录后使用的默认 Shell。

五、Shell 脚本入门

1. 脚本格式

脚本以 #!/bin/bash 开头,这一行称为 shebang,用于指定脚本由哪个解析器来执行:

shell 复制代码
脚本以   #!/bin/bash 开头(指定解析器)

2. 第一个脚本:输出 hello shell

shell 复制代码
# 创建脚本文件
touch hello.sh

# 编辑脚本
vim hello.sh

在 hello.sh 中添加以下内容:

shell 复制代码
#!/bin/bash
echo "hello shell"

3. 脚本的常用执行方式

方式一:采用 bash 或 sh + 脚本的相对路径/绝对路径(无需赋予 +x 执行权限)

shell 复制代码
# sh + 相对路径
sh ./hello.sh

# sh + 绝对路径
sh /root/hello.sh

# bash + 相对路径
bash ./hello.sh

# bash + 绝对路径
bash /root/hello.sh

方式二:直接输入脚本的相对路径或绝对路径执行(必须具有可执行权限 +x)

shell 复制代码
# 首先赋予 hello.sh 脚本 +x 权限
chmod +x hello.sh

# 相对路径执行
./hello.sh

# 绝对路径执行
/root/hello.sh

方式三:在脚本路径前加上 . 或使用 source(了解)

shell 复制代码
# 创建一个脚本 test.sh,内容如下:
#!/bin/bash
a=6
echo $a

分别用不同方式执行,观察区别:

shell 复制代码
bash test.sh     # 子 shell 中执行,父 shell 中 echo $a 无输出
sh test.sh
chmod +x test.sh
./test.sh
. test.sh        # 当前 shell 中执行,父 shell 中 echo $a 有输出
source test.sh   # 与 . 等价

三种方式的对比总结:

执行方式 示例命令 是否需要执行权限 执行环境
方式一 bash ./hello.sh / sh /root/hello.sh 不需要(需读权限) 子 Shell
方式二 ./hello.sh / /root/hello.sh 需要 chmod +x 子 Shell
方式三 . ./hello.sh / source ./hello.sh 不需要(需读权限) 当前 Shell

为什么?

  • 前两种方式都是在当前 Shell 中打开一个子 Shell 来执行脚本内容,当脚本内容执行结束,子 Shell 关闭,回到父 Shell 中。
  • 第三种方式(. 或 source)可以使脚本内容在当前 Shell 里执行,而无需打开子 Shell。
  • 开子 Shell 与不开子 Shell 的区别,就在于环境变量的继承关系:在子 Shell 中设置的变量,父 Shell 是不可见的。

这也是为什么每次修改完 /etc/profile 文件以后,需要 source /etc/profile 一下------只有这样才能让环境变量改动立即生效于当前 Shell。

六、总结

知识点 要点
Shell 是什么 命令行解释器 + 编程语言
查看可用 Shell cat /etc/shells
默认解析器 bash(echo $SHELL 验证)
脚本开头 #!/bin/bash
三种执行方式 bash/sh、直接执行(+x)、. / source
子 Shell 影响 子 Shell 中的变量不会影响父 Shell
相关推荐
晚风叙码37 分钟前
Linux 进程概念(上):从冯诺依曼到进程调度
linux·运维·计算机外设
Z21-X1 小时前
云原生运维笔记:硬核拆解OpenStack计算与存储——从主机聚合到Cinder挂载全流程
运维·笔记·学习·云原生·openstack
邪修king1 小时前
Re:Linux系统篇(三十八):进程间通信ChapterSystem V 信号量深度解析|同步互斥、内核源码、C 指针多态、实战代码
java·linux·c语言
开开心心就好1 小时前
电脑语音实时转文字工具,会议记录很省事
运维·服务器·前端·c#·ocr·perl·1024程序员节
坤坤子吖1 小时前
Linux网络编程基础:从 MAC 到 IP,理解网络数据是怎么传输的
linux·网络·笔记·学习
一只鹿鹿鹿1 小时前
医院绩效管理体系方案
大数据·运维·安全·web安全·制造
java_logo1 小时前
Docker 部署 Portainer CE 中文版:轻松搭建容器管理平台
运维·docker·容器·portainer·容器管理·轩辕镜像·portainer ce
山东孙燕姿1 小时前
前端框架升级:不敢动的组件怎么办
大数据·运维·服务器·网络·人工智能·前端框架
古法老登瞎折腾9 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
琥珀.10 小时前
mysql中json数组转列表查询
linux·运维·服务器