Shell脚本

2025-06-10

Shell脚本

半随机图像

变量和 Shebang


Shell 编程简介

Shell 是所有 Unix 和 Linux 系统的标准接口;用户和管理员都熟悉 Shell,将命令组合成脚本也是自然而然的事情。然而,这只是冰山一角。

最近我花了一些时间学习 shell 和编写脚本,我意识到 shell 实际上是一种完整的编程语言,具有变量和函数,还有更高级的结构,例如数组(包括关联数组),并且与内核直接链接,它的语法中内置有本机 IO 原语,以及进程和作业控制。

我计划将其作为一系列帖子发布,并尽量做到简明扼要。

那么,什么是 shellscripting?

Shell脚本编写是编写一系列供Shell执行的命令。它可以将冗长且重复的命令序列组合成一个简单的脚本,该脚本可以随时存储和执行,非常适合自动化任务。这减少了最终用户所需的工作量。

脚本的命令由解释器(shell)逐个执行,您在命令行中输入的所有内容也可以放入脚本中。

在运行脚本之前,我们需要设置执行权限:chmod 755 script.sh

./script.sh然后我们可以通过命令行运行脚本。


#!

#!(shebang) 指定我们想要执行脚本的 shell(解释器)的二进制文件,例如:
#! /bin/bash#! /bin/zsh或者为了获得最佳的可移植性#! /bin/sh(这将运行系统 shell)。

请注意,本系列中的大部分代码仅使用 shell 进行测试bashzsh大多数 sh 脚本无需修改即可由 Bash 运行,但有些内容无法运行。

#! /bin/sh
sleep 90
Enter fullscreen mode Exit fullscreen mode

当我们执行包含以下内容的脚本时,#!实际发生的事情是解释器被执行,并且用于调用脚本的路径作为参数传递。为了确认这一点,假设我们有sleepy.sh脚本,然后我们可以使用 运行该脚本./sleepy.sh &,其中&似乎用于返回脚本执行进程的 PID,然后我们可以运行ps -fp [PID]以查看进程信息:

UID PID PPID C STIME TTY TIME CMD
505 65418 59985 0 7:09PM ttys000 0:00.01 /bin/zsh ./sleepy.sh
Enter fullscreen mode Exit fullscreen mode

我们可以在这里看到它作为参数./sleepy.sh传递给我的二进制文件。/bin/zsh

如果脚本不包含#!命令,则使用默认 shell 执行,但最佳做法是明确说明,因为不同的 shell 的语法略有不同。

另外,我们不必只使用 Shell 作为脚本的解释器。我们还可以使用其他二进制文件,例如python

#! /usr/bin/python

print "This is a Python script"
Enter fullscreen mode Exit fullscreen mode
chmod 755 hi.py
./hi.py
This is a Python script
Enter fullscreen mode Exit fullscreen mode

变量

变量是具有名称的存储位置,您可以将其视为名称-值对。
创建变量的语法是: 。需要注意的是,变量名区分大小写,并且按照惯例,变量名应全部大写。声明变量时,VARIABLE_NAME="Value"请确保在符号前后不要使用空格。=

默认情况下,所有变量都是全局变量,并且必须在使用前定义。
变量可以在函数中定义(我们稍后会讨论),但在函数调用之前无法访问它们。

function var(){
    FUNC_VAR=1
}
# FUNC_VAR is not defined at this point and this will not return anything
echo $FUNC_VAR
var # This is how we call a function in the shell
# FUNC_VAR is now available because the function has been called
echo $FUNC_VAR # Output: 1
Enter fullscreen mode Exit fullscreen mode

有效的变量名可以由字母、数字和下划线组成,但数字不能作为名称中的第一个字符。

# Valid names
DARK_JEDI="Vader"
GR4Y_J3DI="Ahsoka"
Regular_Jedi="Obi-Wan"

# Invalid names
3DARK_LORDS="Vader Sidius Plagueis"
TWO-REBELS="Solo Leia"
ONE@SHIP="Ebon Hawk"
Enter fullscreen mode Exit fullscreen mode
#! /bin/bash
MY_SHELL="zsh"
echo "I like the $MY_SHELL shell" # Output: I like the zsh shell
Enter fullscreen mode Exit fullscreen mode

我们还可以将变量名括在花括号中:

MY_SHELL="zsh"
echo "I like the ${MY_SHELL} shell" # Output: I like the zsh shell
Enter fullscreen mode Exit fullscreen mode

花括号语法是可选的,除非您需要在变量前面或后面添加额外的数据,如下所示:

MY_SHELL="bash"
echo "I'm ${MY_SHELL}ing on my keyboard!" # Output: I'm bashing on my keyboard.
Enter fullscreen mode Exit fullscreen mode

如果没有花括号,这将不起作用,因为解释器会将ing名称变量后面的花括号作为变量名的一部分。

另一个最佳实践是在使用变量时将其括在引号中,以防止产生一些意外的副作用。

我们还可以将命令的输出分配给变量:

SERVER_NAME=$(hostname)
echo "You are running this script on ${SERVER_NAME}"
Enter fullscreen mode Exit fullscreen mode

局部变量

局部变量是用local关键字创建的,只有函数才能拥有局部变量,因此它们只能在声明它们的函数内访问。

function myFunc(){
    local LOCAL_VAR=" I'm locally scoped"
}
Enter fullscreen mode Exit fullscreen mode

最佳做法是仅在函数内部使用局部变量。


暂时就这些,下一篇我会稍微讲一下测试和循环。感谢阅读,如有任何问题,尽管问!

鏂囩珷鏉ユ簮锛�https://dev.to/puritanic/shellscripting-27bl
PREV
学习 SVG 动画来丰富我的 GitHub 个人资料
NEXT
停止在每个 HTML 元素中使用 ID 和类!