国外手机主题网站,软件开发工具的基本功能是什么,又拍网站怎么做,平面设计作品集如何制作一、Shell 简介
1.Shell 的定义与作用
Shell#xff0c;通常被称为命令行解释器 (Command Line Interpreter)#xff0c;是用户 #x1f464; 与 Linux/Unix 操作系统内核进行交互 ↔️ 的“桥梁” #x1f309;。它扮演着翻译官 #x1f5e3;️ 的角色#xff1a;
接…一、Shell 简介
1.Shell 的定义与作用
Shell通常被称为命令行解释器 (Command Line Interpreter)是用户 与 Linux/Unix 操作系统内核进行交互 ↔️ 的“桥梁” 。它扮演着翻译官 ️ 的角色
接收用户输入的命令 (如 ls, cd, mkdir)。解释这些命令 。调用操作系统内核执行相应的功能。将执行结果返回并显示给用户 ️。
简单来说没有 Shell我们就很难方便地直接与强大的操作系统内核打交道了 (简直无法想象!)
2.常见的 Shell 类型
存在多种不同的 Shell 实现它们在语法、功能和效率上可能有所差异 ✅
bash (Bourne Again SHell): 这是目前最流行、最常用 ⭐ 的 Shell是绝大多数 Linux 发行版的默认 Shell。它兼容 sh并增加了许多新特性命令历史、命令补全、作业控制等。我们后续的脚本主要会以 bash 为基础。sh (Bourne Shell): 一个早期且经典 的 Unix Shell由 Stephen Bourne 开发。许多旧的或要求高兼容性 的脚本仍会使用它。在很多系统中/bin/sh 可能是一个指向 bash (或其他 Shell) 的符号链接但 bash 在以 sh 模式运行时会限制某些功能以保持兼容。zsh (Z Shell): 一个功能极其强大 的 Shell提供了比 bash 更丰富的功能、更强的自动补全 ✨、主题和插件系统如 Oh My Zsh深受许多开发者喜爱 ❤️。ksh (Korn Shell): 由 David Korn 开发试图融合 sh 的脚本能力和 C Shell 的交互特性。csh/tcsh (C Shell / TENEX C Shell): 语法风格类似 C 语言交互性较好但脚本编写方面有时被认为不如 Bourne 系列 Shell。
小提示: 你可以在终端输入 echo $SHELL 来查看你当前正在使用的 Shell 类型。
3.Shell 与 Shell 脚本的区别
这是一个非常基础但重要的概念
Shell (交互式): 指的是你直接在终端命令行界面中输入命令按回车后立即看到执行结果的环境。这是一种你问我答式的交互方式 。
# 这就是在交互式 Shell 中输入命令
ls -l
pwdShell 脚本 (非交互式): 是一个文本文件 里面包含了一系列按照特定顺序编写的 Shell 命令。你可以一次性执行这个脚本文件让计算机自动完成 一系列复杂的或重复性的任务实现自动化。这是一种批量处理的执行方式 ⚙️。
# my_script.sh 文件内容可能像这样:
# #!/bin/bash
# echo 开始执行任务...
# mkdir temp_dir
# cd temp_dir
# echo 任务完成二、 编写第一个 Shell 脚本
1.脚本文件的创建与命名
创建一个 Shell 脚本非常简单
使用文本编辑器 打开你喜欢的文本编辑器如 vim, nano, gedit, VS Code 等。编写命令 在文件中输入你的 Shell 命令。保存文件 将文件保存 。 命名约定 ️: 虽然不是强制性的但强烈建议将 Shell 脚本文件以 .sh 后缀结尾例如 my_first_script.sh, backup_data.sh。这有助于识别文件类型 并且让其他用户以及未来的你 更容易理解。
2.指定解释器 (Shebang)
这是 Shell 脚本中至关重要❗ 的一行 ✨
什么是 Shebang? 脚本文件的第一行内容格式为 #!解释器路径。作用: 它告诉操作系统内核当直接执行这个脚本文件时即使用方法 2./script.sh 方式应该调用哪个解释器来处理文件中的命令。 注意: 如果使用方法 1 (bash script.sh) 或方法 3 (source script.sh) 执行Shebang 行实际上会被忽略 ♀️因为解释器已经由用户显式指定 (方法 1) 或就是当前 Shell (方法 3)。绝对要求: Shebang 行必须是脚本文件的绝对第一行前面不能有任何字符包括空格或空行。
常见的 Shebang 选项:
虽然 #!/bin/bash 是最常见的尤其是在 Linux 环境中但还有其他一些常用的选项选择哪个取决于你的脚本需求和目标运行环境 #!/bin/bash: 指定使用 Bourne Again Shell (bash) 来执行脚本。优点: 可以使用 bash 提供的所有扩展功能 如数组、双方括号 [[ ]] 条件测试、函数等。缺点: 如果系统没有安装 bash 或者 bash 不在 /bin/bash 路径下脚本会执行失败 。依赖 bash 特性的脚本可移植性稍差。 #!/bin/sh: 指定使用 Bourne Shell (sh) 来执行脚本。优点: 目标是编写符合 POSIX 标准 的脚本具有更好的可移植性 。在很多系统中/bin/sh 可能是一个指向 bash、dash 或其他兼容 Shell 的符号链接。当 bash 以 sh 模式被调用时它会禁用一些 bash 特有的扩展。缺点: 不能使用 bash 等现代 Shell 的扩展语法和功能编写复杂脚本可能更繁琐 。 #!/usr/bin/env interpreter (例如 #!/usr/bin/env bash 或 #!/usr/bin/env python): 这是强烈推荐 的一种方式特别是对于需要分发 的脚本。env 是一个命令它会在系统的PATH 环境变量 ️ 所指定的目录中查找第一个找到的 interpreter如 bash, python, perl, node 等并使用它来执行脚本。优点: 极大地提高了可移植性 。不同系统或用户可能将解释器安装在不同的路径下如 /usr/bin/bash, /usr/local/bin/bash, /opt/bin/bash。使用 env 可以确保只要解释器在用户的 PATH 中脚本就能找到它 。缺点: 相比直接指定路径会有极其微小的额外启动开销查找解释器。安全性方面如果 PATH 被恶意篡改可能会执行非预期的解释器但这种情况很少见且通常已有更大的安全问题 。常见示例: #!/usr/bin/env bash (推荐 ✅ 的 bash 脚本 Shebang)#!/usr/bin/env sh (推荐 ✅ 的可移植 sh 脚本 Shebang)#!/usr/bin/env python3 (用于 Python 3 脚本 )#!/usr/bin/env perl (用于 Perl 脚本 )#!/usr/bin/env node (用于 Node.js 脚本 ) 其他 Shell: #!/bin/zsh 或 #!/usr/bin/env zsh: 指定使用 Z Shell。#!/bin/ksh 或 #!/usr/bin/env ksh: 指定使用 Korn Shell。 如何选择 Shebang
如果你的脚本只在你自己控制的、确定安装了 bash 的 Linux 系统上运行并且你需要 bash 的特性#!/bin/bash 或 #!/usr/bin/env bash 都可以。如果你希望脚本尽可能广泛地兼容 各种 Unix-like 系统包括 macOS, BSD 等并且只使用了 sh 的标准功能那么使用 #!/bin/sh 或 #!/usr/bin/env sh 是更安全、更推荐的选择 ✅。为了最大化可移植性 通常首选推荐使用 #!/usr/bin/env interpreter 的形式 。
3.脚本的执行方式
你有三种主要的方式来运行你的 Shell 脚本 ▶️
作为解释器的参数执行: 这种方式不需要给脚本文件设置执行权限 。你直接调用 Shell 解释器 (如 bash 或 sh)并将脚本文件名作为参数传递给它。优点: 简单直接无需关心执行权限。注意: 脚本在子 Shell (subshell) 中执行脚本中定义的变量、函数或对环境的修改如 cd在脚本结束后不会影响当前的 Shell 环境 。命令格式
bash my_script.sh
# 或者如果脚本兼容 sh
sh my_script.sh赋予执行权限后直接运行: 第一步添加执行权限 : 使用 chmod 命令给脚本文件添加执行权限 (x)。
chmod x my_script.shx 表示为所有用户所有者、同组用户、其他用户添加执行权限。你也可以使用更精细的权限设置如 chmod ux my_script.sh 只为文件所有者添加执行权限。
第二步直接执行:如果脚本文件位于当前目录你需要使用 ./ 来告诉 Shell 在当前目录下查找并执行该文件
./my_script.sh如果脚本文件位于系统的 PATH 环境变量 ️ 所包含的目录中或者你指定了完整的绝对/相对路径则可以直接使用脚本名或路径执行
# 假设 /opt/scripts 在 PATH 中且 my_script.sh 在该目录下
my_script.sh
# 或者使用绝对路径
/path/to/your/script/my_script.sh
# 或者使用相对路径
../scripts/my_script.sh优点: 这是最标准、常用 ✅ 的执行方式特别是对于需要分发的工具脚本。Shebang 行 #! 决定了使用哪个解释器。注意: 脚本同样在子 Shell (subshell) 中执行对当前 Shell 环境没有持久影响 。为什么需要 ./ 出于安全考虑 ️。Linux/Unix 系统默认不会在当前目录下查找可执行文件除非当前目录被显式添加到了 PATH 环境变量中。使用 ./ 可以明确指定执行当前目录下的文件防止意外执行了与系统命令同名的恶意脚本 。
使用 source 或 . 命令在当前 Shell 环境 中执行: source 是一个 Shell 内建命令它的简写形式是一个点 (.)。这种方式不需要给脚本文件设置执行权限 只需要读权限 r 即可 。命令格式
source my_script.sh
# 或者使用点号 (点号和脚本名之间必须有空格!)
. my_script.sh核心区别: 核心区别 使用 source 或 . 执行时脚本中的命令直接在当前的 Shell 环境中 执行而不是启动一个新的子 Shell 。优点/用途: 这意味着脚本中定义的变量、函数、别名 (alias)或者执行的 cd、export 等命令在脚本执行完毕后会保留在当前的 Shell 会话中 ✅。因此它常用于 加载配置文件 ⚙️ (如 .bashrc, .profile, /etc/profile)。设置环境变量 供后续命令使用。定义可以在当前终端后续使用的函数库 。在脚本中切换目录 (cd) 后希望停留在那个新目录 。 注意: 必须确保脚本内容是你希望在当前环境中执行的因为它可能直接修改 你当前的工作环境。要谨慎使用⚠️ 执行方式对比小结:
执行方式需要执行权限 (x)? 在子 Shell 中执行? 对当前 Shell 环境的影响 主要用途 bash script.sh否 ❌是 ✅无 ❌运行一次性任务不需改变当前环境./script.sh (需x)是 ✅是 ✅无 ❌标准的脚本执行 ✅分发工具脚本source script.sh否 (需r) 否 ❌有 (持久) ✅加载配置/环境/函数 ⚙️改变当前环境
三、注释与可读性
编写清晰易懂 ✨ 的脚本至关重要而注释是实现这一目标的关键工具 ️。
1.单行注释
在 Shell 脚本中使用 # 符号来表示单行注释 。从 # 开始直到该行的末尾所有的内容都会被 Shell 解释器忽略 不会被执行。注释可以单独占一行也可以放在命令的后面。
#!/bin/bash# 这是一个完整的单行注释用于说明脚本的目的
# Author: Your Name
# Date: 2025-5-2echo Hello, World! # 这也是一个注释解释这行命令的作用# 下面定义一个变量
USER_NAMEAlice # 为变量赋值2.多行注释的实现方式
Shell 本身没有提供像 C 语言 /* ... */ 或 Python ... 那样的原生多行注释块 语法。但是可以通过一些技巧 来实现类似的效果
方法一使用 Here Document (推荐用于注释大段代码或文本) 将你想要注释掉的内容通过 Here Document (LIMITER ... LIMITER) 重定向给一个空命令 : (冒号是一个内置的不做任何事情的命令)。LIMITER 可以是任何不出现在注释内容中的字符串通常使用 EOF 或 COMMENT。在起始 LIMITER 前加上单引号 (: EOF) 可以阻止其中的变量和命令替换。
#!/bin/bashecho 这行代码会执行: MY_MULTI_LINE_COMMENT
这里是第一行注释内容。
这里是第二行注释内容。
这整块代码/文字都不会被执行。
可以包含 $VARIABLES 或 commands因为用了 MY_MULTI_LINE_COMMENT。
MY_MULTI_LINE_COMMENTecho 这行代码也会执行方法二连续使用单行注释 这是最简单直接的方法只需在每一行注释前都加上 #。对于解释性的多行文字这种方式也很常用。
#!/bin/bash#
# 这是一个多行注释块
# 用来详细说明某个复杂函数的逻辑
# 或者记录一些重要的注意事项
#
calculate_sum() {
# 函数内部的注释
local result$(($1 $2)) # 计算总和
echo $result
}sum$(calculate_sum 10 20)
echo 计算结果是: $sum3.良好的注释习惯与代码可读性
注释的终极目标 是提升代码的可读性 和可维护性 。遵循以下原则
解释“为什么”Why 而不是“干什么”What ✅: 好的代码比如有意义的变量名和函数名本身应该能说明它在做什么。注释应该聚焦于解释为什么选择这种实现方式、背后的逻辑、潜在的陷阱 ⚠️ 或重要的上下文。
# 不好的注释 (冗余 )
# i i 1 # 把 i 加 1# 好的注释 (解释原因 )
# 使用特定的算法ID因为旧版本存在兼容性问题
algorithm_id3保持注释简洁且同步 : 注释应该清晰明了避免冗长。最重要的是当代码发生变化时务必更新相关的注释否则过时的注释比没有注释更糟糕注释复杂 或不直观的部分: 对于复杂的正则表达式、算法、重要的业务逻辑或临时的 Workaround添加注释非常有帮助 。文件头注释 ራስ: 在脚本文件的开头添加注释块说明脚本的用途、作者、创建/修改日期、版本号、使用方法等信息是一个非常好的实践 ⭐。
#!/usr/bin/env bash
#
# Script Name: backup_database.sh
# Description: Performs a daily backup of the production PostgreSQL database.
# Author: Your Name your.emailexample.com
# Date Created: 2023-5-2
# Last Modified: 2023-5-2
# Version: 1.2
# Usage: ./backup_database.sh
# Notes: Requires pg_dump command and write access to BACKUP_DIR.
# Recommend running via cron.
#
利用空行和代码块外的缩进 ️: 合理地使用空行分隔逻辑块。在非代码块的文本部分可以使用缩进如列表项来组织内容提高结构清晰度。写给未来的你 和他人 : 记住你写的代码和注释很可能在几个月或几年后需要被你自己或其他同事阅读和维护。清晰的注释是对未来时间和精力的投资 。
四、Shell 脚本基础练习题 ✍️
题目一基础概念
❓ 简述 Shell 在 Linux/Unix 系统中的主要作用是什么它扮演了什么角色
题目二Shebang
❓ Shell 脚本的第一行 #!/bin/bash 有什么作用它通常被称为什么
题目三执行权限
❓ 如何让一个名为 my_script.sh 的 Shell 脚本文件能够直接通过 ./my_script.sh 的方式运行请写出关键命令。
题目四执行方式辨析
❓ 执行 Shell 脚本时使用 bash script.sh 和 source script.sh (或 . script.sh) 的主要区别是什么哪种方式会影响当前的 Shell 环境
题目五注释
❓ 在 Shell 脚本中如何添加单行注释请给出表示注释的符号。
题目六多行注释模拟
❓ Shell 没有原生的多行注释块语法。请描述一种常用的、基于 Here Document 的方法来模拟多行注释。
题目七Shebang 最佳实践
❓ 为什么通常推荐使用 #!/usr/bin/env bash 而不是直接使用 #!/bin/bash 作为 Shebang 主要优势是什么 参考答案 ✅
答案一
Shell 主要作用是作为用户 与 操作系统内核 之间的命令行解释器。它扮演着翻译官 ️ 的角色负责接收、解释用户的命令调用内核执行并将结果返回给用户 ️。它是实现与系统交互 ↔️ 的桥梁 。
答案二
#!/bin/bash 的作用是指定解释器。当脚本被直接执行时 (例如通过 ./script.sh)操作系统会根据这一行找到 /bin/bash 解释器来处理脚本中的命令 ✨。这一行通常被称为 Shebang。
答案三
为了让 my_script.sh 可以通过 ./my_script.sh 直接运行需要给它添加执行权限 。关键命令是
chmod x my_script.sh答案四
主要区别在于执行环境
bash script.sh 会启动一个新的子 Shell (subshell) 来执行脚本。脚本中的变量定义、函数、cd 等操作不会影响当前的 Shell 环境 。source script.sh (或 . script.sh) 则是在当前的 Shell 环境 中直接执行脚本的命令。脚本中定义的变量、函数、cd 等操作会保留在当前 Shell 会话中 ✅。
因此source 或 . 方式会影响当前的 Shell 环境。
答案五
在 Shell 脚本中使用 # 符号来添加单行注释 。从 # 到行尾的内容都会被解释器忽略 。
答案六
一种常用的模拟多行注释的方法是使用 Here Document 并将其重定向给一个空命令 :。格式如下
: 任意分隔符
这里是第一行注释。
这里是第二行注释。
这整块内容都不会被执行。
任意分隔符使用单引号包裹起始分隔符 (如 ‘任意分隔符’) 可以阻止其中的变量和命令替换使其更像纯粹的注释块。
答案七
推荐使用 #!/usr/bin/env bash 的主要优势在于提高了脚本的可移植性 。
#!/bin/bash 写死了 bash 解释器的绝对路径。如果用户的 bash 不在这个位置 (例如在 /usr/local/bin/bash)脚本就无法直接执行 。#!/usr/bin/env bash 利用 env 命令在用户的PATH 环境变量 ️ 中查找 bash 解释器。只要用户的 PATH 中能找到 bash无论它安装在哪里脚本都能正确找到并执行 。这使得脚本在不同系统、不同环境下的适应性更强 。