Section 66.1: 变量赋值时的空白空间Variables

变量赋值时的空白空间很重要。

foo = 'bar' # incorrect
foo= 'bar' # incorrect
foo='bar' # correct

前两个示例会导致语法错误(更糟糕的是,会执行错误的命令)。最后一个示例将正确地把变量 $foo 设置为文本 “bar”。

Section 66.2: 命令失败不会停止脚本执行

在大多数脚本语言中,如果函数调用失败,可能会抛出异常并停止程序的执行。Bash 命令没有异常,但有退出代码。非零的退出代码是失败的信号,但非零的退出代码不会停止程序的执行。

这可能会导致以下危险情况(虽然我承认这是人为造成的):

#!/bin/bash
cd ~/non/existent/directory
rm -rf *

如果拷贝到该目录失败,Bash 会忽略失败并转到下一条命令,从而将运行脚本的目录清除干净。

解决这个问题的最佳方法是使用 set 命令:

#!/bin/bash
set -e
cd ~/non/existent/directory
rm -rf *

set -e 命令 Bash 在任何命令返回非零状态时立即退出脚本。

Section 66.3: 遗漏文件中的最后一行

C 标准规定,文件应该以新行结束,因此如果 EOF 出现在某一行的末尾,某些命令可能不会漏掉该行。举个例子

$ echo 'one\ntwo\nthree\c' > file.txt

$ cat file.txt
one
two
three

$ while read line ; do echo "line $line" ; done < file.txt
one
two

为确保在上述示例中正确运行,请添加一个测试,以便在最后一行不为空的情况下继续循环。

$ while read line || [ -n "$line" ] ; do echo "line $line" ; done < file.txt
one
two
three