欢迎光临
我们一直在努力

Bash学习 - 第3章:Basic Shell Features,第8节:Shell Scripts

本文为 Bash Reference Manual 第3章:Basic Shell Features 第8节:Shell Scripts 的读书笔记。

Shell 脚本是包含 shell 命令的文本文件。当在调用 Bash 时将这样的文件作为第一个非选项参数使用,并且没有提供 -c 或 -s 选项(参见调用 Bash),Bash 将从文件中读取并执行命令,然后退出。这种操作模式会创建一个非交互式 Shell。如果文件名不包含任何斜杠,Shell 会首先在当前目录中搜索该文件,如果未找到,则会在 $PATH 中的目录中查找。

Bash 会尝试确定文件是文本文件还是二进制文件,并且不会执行它判断为二进制的文件。

当 Bash 运行一个 shell 脚本时,它将特殊参数 0 设置为文件名,而不是 shell 的名称,并且位置参数设置为剩余的参数(如果提供了的话)。如果没有提供额外的参数,位置参数将被取消设置。

可以通过使用 chmod 命令打开执行位来使 shell 脚本变为可执行。当 Bash 在 $PATH 中查找命令时找到这样的文件,它会创建自身的新实例来执行该文件。换句话说,以下两个命令是等价的:

## 形式1
filename arguments
## 形式2
bash filename arguments

如果文件名是可执行的 shell 脚本。这个子 shell 会重新初始化自身,所以效果就像是调用了一个新的 shell 来解释脚本,唯一的例外是父 shell 记住的命令位置(参见 Bourne Shell 内建命令中 hash 的描述)会被子 shell 保留。

GNU 操作系统以及大多数版本的 Unix 都将其作为操作系统命令执行机制的一部分。如果脚本的第一行以两个字符#!开头,行的其余部分将指定程序的解释器,并且根据操作系统的不同,还可以指定该解释器的一个或多个可选参数。因此,你可以指定 Bash、awk、Perl 或其他某种解释器,并用该语言编写脚本文件的其余部分。

传递给解释器的参数包括位于脚本文件第一行解释器名称之后的一项或多项可选参数,然后是脚本文件的名称,最后是传递给脚本的其余参数。解释器行如何被拆分为解释器名称和一组参数在不同系统上有所不同。在操作系统本身不处理这一问题的情况下,Bash 会执行此操作。请注意,一些旧版本的 Unix 将解释器名称和单个参数限制为最多 32 个字符,因此假设使用多个参数能正常工作是不具备可移植性的。

Bash 脚本通常以 #! /bin/bash 开头(假设 Bash 已安装在 /bin),因为这样可以确保即使在其他 shell 下执行,也会使用 Bash 来解释脚本。一个常见的习惯用法是使用 env 来查找 bash,即使它安装在其他目录:#!/usr/bin/env bash 会在 $PATH 中找到第一个 bash 的位置。

💡 #!也被称为shebang,分别为#和!的读音。

示例:

$ env|grep bash
SHELL=/bin/bash
...

一个脚本示例:

$ cat a.sh
#!/bin/bash

numargs=$#

echo command name is $0
echo command has $numargs args

i=0
for arg in "$@"; do
((i++))
echo "arg$i is $arg"
done

for ((i=1; i<=numargs; i++)); do
echo "arg$i is ${!i}"
done

$ ls -l a.sh
-rwxr-xr-x. 1 vagrant vagrant 203 Jan 7 00:58 a.sh

$ ./a.sh 1 2 3
command name is ./a.sh
command has 3 args
arg1 is 1
arg2 is 2
arg3 is 3
arg1 is 1
arg2 is 2
arg3 is 3

赞(0)
未经允许不得转载:171主机测评 » Bash学习 - 第3章:Basic Shell Features,第8节:Shell Scripts
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址