什么功能-a-n选项在以下bash中执行if陈述?

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

-a-n所谓*初选*?

-a file意思是"如果文件存在则为真。"?

答案

挑剔

开关-a-n不是严格的一部分bash if说明if命令不处理这些开关。

什么是初选?

我称它们为"开关",但是bash您链接到的文档是指与"初选"相同的东西(可能是因为这是讨论布尔表达的部分时使用的常见术语)。

背景和文档

sh脚本if是一个命令,它将命令作为其参数,执行它并测试其返回代码。0代码块以下then被执行直到关闭fi或(如果提供)以下else。如果返回代码不是0else提供了声明,然后代码块以下else被执行直到关闭fi

您可以通过通过if命令true或命令false,这是简单的命令,无能为力并返回0和非 - 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。正是此命令需要您要问的开关。在bashtest命令将是内置命令;尝试type [了解其类型。help将显示用法,因此也运行help [查看文档。/bin/[和一个/bin/test如果你man test你可以查看这些的手册。test可能与手册页中记录的行为不同,这可能比您从中获得的简单描述更详细help [,它可能会描述内置的行为[指挥相当准确。

-a 和 -n 的行为

知道您正在运行的命令是test我们可以咨询help test或者man test并阅读其用法。-n测试以下参数,如果它不是空字符串,则计算结果为 true。

在文档中test您还会看到一个开关-e-f如果以下参数存在并且是常规文件(而不是目录或块设备或其他文件),则该 switch 的值为 true。

您感到困惑的根源可能是two 的形式-a:一元和二元。-a用于一元上下文中,即以下一个论点没有前面的参数 ,它将其参数视为文件并测试其存在,就像-e转变。-a在二进制上下文中使用,即其前有一个参数,其后有一个参数,它将其参数视为其他条件并充当布尔 AND 运算符。

为了可移植性,重要的是要注意一元-a是一个非标准扩展不会被发现在 POSIX 中。bashksh然而,因此使用可能很广泛。

例子

cd /tmp
if [ -a test-file ] ; then
    echo 1: test-file exists
else
    echo 1: test-file missing
fi

touch test-file

if [ -a test-file ] ; then
    echo 2: test-file exists
else
    echo 2: test-file missing
fi

var=somerthing
if [ -n "$var" -a -a test-file ] ; then
    echo variable var is not empty and test-file exists
fi
rm -f test-file

来自: stackoverflow.com