-n和-a选项在bash if语句中做了什么?

时间:2013-02-15 17:49:33

标签: bash

-a-n选项在以下bash if语句中执行了哪些功能?

if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
    REFNAME=$(basename $3)
else

-a-n被称为 primaries 吗?

-a file是否意味着“如果文件存在则为真。”?

2 个答案:

答案 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 [命令的行为相当准确。

-a和-n

的行为

我们知道您正在运行的命令是[,我们可以咨询testhelp test并阅读其用法。这将显示man test测试以下参数,如果它不是空字符串,则求值为true。

-n的文档中,您还会看到切换test。此开关测试以下参数,如果该参数是存在的文件或目录,则计算结果为true。更有用的是-e开关,如果存在以下参数并且是常规文件(而不是目录或块设备,或其他任何东西),则评估为true。

您混淆的根源可能是-f两种形式:一元和二元。当-a用于一元上下文时,即一个后面的参数没有前面的参数时,它将其参数视为文件并测试其存在,就像-a开关一样。但是,如果在二进制上下文中使用-e,即之前的一个参数和之后的一个参数,则它将其参数视为其他条件并充当布尔AND运算符。

为了便于携带,重要的是要注意一元-a是POSIX中won't be found的非标准扩展。它在-abash中可用,因此可能会广泛使用。

实施例

ksh