11 shell脚本
如果你能在 shell 中输入命令,你就能编写 shell 脚本。shell 脚本(也称为 Bourne shell 脚本)是写在文件中的一系列命令;shell 会从文件中读取这些命令,就像在终端中输入命令一样。
11.1 shell脚本基础
Bourne shell 脚本一般以下面一行开始,表示 /bin/sh 程序应执行脚本文件中的命令。(确保脚本文件开头没有空白)。
#!/bin/sh
在本书的其他脚本中,你会看到#!你可以在#/bin/sh行后列出任何希望shell执行的命令。例如
#!/bin/sh
#
# Print something, then run ls
echo About to run the ls command.
ls
shell 会忽略 # 字符之后一行的任何内容。使用注释来解释脚本中其他人阅读代码时可能难以理解的部分,或在日后重温代码时唤起自己的记忆。
与 Unix 系统上的任何程序一样,您需要为 shell 脚本文件设置可执行位,但同时也必须设置读取位,以便 shell 能够读取文件。最简单的方法如下:
$ chmod +rx script
这条 chmod 命令允许其他用户读取和执行脚本。如果不想这样,请使用绝对模式 700(有关权限的复习,请参阅第 2.17 节)。
创建 shell 脚本并设置读取和执行权限后,可以将脚本文件放在命令路径中的某个目录下,然后在命令行上运行脚本名称即可。如果脚本位于当前工作目录中,也可以运行 ./script,或者使用完整路径名。
例如,运行名为 myscript 的脚本会导致内核运行 /bin/sh myscript。
了解了基础知识后,让我们来看看 shell 脚本的一些限制。
Shebang,也称为 Hashbang 或 Hash-bang,是一种特殊的语法,通常出现在文本文件的第一行的前两个字符:#!。它的作用是指定脚本应该由哪个解释器来执行。用途如下:
- 明确指定解释器: 不同的脚本语言有不同的解释器(比如 Bash、Python、Perl 等)。Shebang 告诉操作系统,应该使用哪个解释器来运行这个脚本,避免了歧义。
- 直接执行脚本: 有了 Shebang,你就可以直接运行脚本文件,而不需要每次都指定解释器。
- 跨平台兼容性: 不同的系统可能默认的 shell 或解释器不同,Shebang 确保了脚本在不同系统上的可移植性。
Shebang 不一定是 #!/bin/sh;它可以构建为运行系统中任何接受脚本输入的程序,例如 #!/usr/bin/python,以运行 Python 程序。此外,你可能会遇到包含 /usr/bin/env 的不同模式的脚本。例如,你可能会在第一行看到类似 #!/usr/bin/env python 的内容。这会指示env工具运行 python。这样做的原因很简单:env 会在当前的命令路径中查找要运行的命令,因此不需要为可执行文件指定一个标准位置。缺点是命令路径中第一个匹配的可执行文件可能不是你想要的。
11.1.1 Shell 脚本的局限性
Bourne shell 可以相对轻松地操作命令和文件。在第 2.14 节中,我们了解了 shell 重定向输出的方法,这也是 shell 脚本编程的重要元素之一。然而,shell 脚本只是 Unix 编程的一种工具,虽然脚本具有相当强大的功能,但也有其局限性。
shell 脚本的主要优势之一是可以简化和自动执行原本可以在 shell 提示符下执行的任务,例如处理成批文件。但是,如果你想剔除字符串、执行重复的算术计算或访问复杂的数据库,或者如果你想使用函数和复杂的控制结构,你最好使用 Python或awk这样的脚本语言,甚至可能使用 C 这样的编译语言(这一点很重要,所以你会在本章中看到)。
最后,要注意 shell 脚本的大小。shell 脚本要简短。Bourne shell 脚本并不意味着要很大,尽管你无疑会遇到一些庞然大物。
11.2 引用和字面量
在使用 shell 和脚本的过程中,最令人困惑的一点就是不知道什么时候以及为什么要使用引号(quotes)和其他标点符号。假设您想打印 $100 字符串,请执行以下操作:
$ echo $100
00
$ echo "$100"
00
$ echo '$100'
$100
11.2.1 字面量
当你使用引号时,通常是要创建一个字面形式,即 shell 在将其传递到命令行之前不应分析(或试图更改)的字符串。除了刚才例子中的 $ 之外,当你想将 * 字符传递给 grep 等命令而不是让 shell 展开它,以及当你需要在命令中使用分号 (
标签:11,脚本,shell,使用,echo,命令,Shell,Linux,bin From: https://www.cnblogs.com/testing-/p/18326798