-a
和-n
选项在以下bash if
语句中执行了哪些功能?
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
REFNAME=$(basename $3)
else
-a
和-n
被称为 primaries 吗?
-a file
是否意味着“如果文件存在则为真。”?
答案 0 :(得分:77)
-a
将两个表达式以“和”或“&&”链接在一起表达。此选项为deprecated。
-n
检查字符串的长度是否为非零。
您可以将测试表达式转换为以下伪代码:
if ( ($1 has nonzero length) and
($2 has nonzero length) and
($3 has nonzero length) )
该表达式中没有检查文件是否存在,只检查是否已将参数提供给脚本。
参数-a
和-n
可在test
man test
运营商[ ... ]
通常用作test ...
的简写,可能在您的系统上具有相同的功能。
答案 1 :(得分:31)
开关-a
和-n
不是bash
if
语句的严格组成部分,因为if
命令不处理这些开关。
我将它们称为“开关”,但是您链接到的bash
文档引用了与“primaries”相同的内容(可能是因为这是讨论布尔表达式部分时使用的常用术语)。 / p>
在sh
脚本中if
是一个命令,它接受命令作为参数,执行它并测试其返回码。如果返回代码为0
,则then
之后的代码块将执行到结束fi
或(如果提供)以下else
。如果返回代码不是0
并且提供了else
语句,则执行else
之后的代码块直到结束fi
。
您可以通过if
命令true
或命令false
来查看此效果,这些命令不执行任何操作并返回0
和非{{{} 1}}分别。
0
在示例代码中,您提供的传递给if true ; then echo true was true ; else echo true was false ; fi
if false ; then echo false was true ; else echo false was false ; fi
的命令是if
,有时也称为[
。这个命令接受你询问的开关。在test
中,bash
命令将是内置命令;尝试test
了解其类型。对于内置命令type [
将显示用法,因此也请运行help
以查看文档。您的系统可能还有help [
和/bin/[
,如果您/bin/test
,您可以看到这些手册。虽然内置man test
的行为可能与手册页中记录的行为不同,这可能比您从test
获得的简单描述更详细,但它可能会描述内置help [
命令的行为相当准确。
我们知道您正在运行的命令是[
,我们可以咨询test
或help test
并阅读其用法。这将显示man test
测试以下参数,如果它不是空字符串,则求值为true。
在-n
的文档中,您还会看到切换test
。此开关测试以下参数,如果该参数是存在的文件或目录,则计算结果为true。更有用的是-e
开关,如果存在以下参数并且是常规文件(而不是目录或块设备,或其他任何东西),则评估为true。
您混淆的根源可能是-f
的两种形式:一元和二元。当-a
用于一元上下文时,即一个后面的参数但没有前面的参数时,它将其参数视为文件并测试其存在,就像-a
开关一样。但是,如果在二进制上下文中使用-e
,即之前的一个参数和之后的一个参数,则它将其参数视为其他条件并充当布尔AND运算符。
为了便于携带,重要的是要注意一元-a
是POSIX中won't be found的非标准扩展。它在-a
和bash
中可用,因此可能会广泛使用。
ksh