在 bash if 语句中-n 和-a 选项有什么作用?

在下面的 bash if语句中,-a-n选项执行什么功能?

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

-a-n是所谓的 < a href = “ http://www.gnu.org/software/bash/Manual/html _ node/Bash-ConditionalExpressions.html”> priies 吗?

-a file的意思是“如果文件存在则为 True”吗?

111304 次浏览

用“和”或“ & &”表达式将两个表达式链接在一起。此选项为 不赞成

检查字符串的长度是否为非零。

您可以将测试表达式转换为以下伪代码:

if ( ($1 has nonzero length) and
($2 has nonzero length) and
($3 has nonzero length) )

该表达式中不检查文件是否存在,只检查参数是否已提供给脚本。

参数 -a-n可以在 test的手册中找到

man test

操作符 [ ... ]通常用作 test ...的简写,并且在您的系统上可能具有相同的功能。

吹毛求疵

交换机 -a-n严格来说不是 bash if语句的一部分,因为 if命令不处理这些交换机。

什么是质点?

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

背景和文件

sh脚本中,if是一个命令,它接受一个命令作为它的参数,执行它并测试它的返回代码。如果返回代码是 0,则执行 then后面的代码块,直到关闭 fi或(如果提供)下面的 else为止。如果返回的代码不是 0,并且提供了 else语句,则执行 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。正是这个命令接受了你所要求的开关。在 bash中,test命令将是一个内置命令; 尝试 type [来了解它的类型。对于内置命令 help将显示使用情况,因此也运行 help [查看文档。你的系统可能也有一个 /bin/[和一个 /bin/test,如果你的 [0,你可以看到这些手册。尽管内置 test的行为可能与手册页中记录的行为不同,这可能比从 help [获得的简单描述更详细,但是它可能相当准确地描述了内置 [命令的行为。

- a 和-n 的行为

知道您正在运行的命令是 test,我们可以查询 help testman test并读取它的用法。这将显示 -n测试以下参数,如果它不是空字符串,则计算结果为 true。

test的文档中,您还将看到一个交换机 -e。此开关测试下列参数,如果该参数是存在的文件或目录,则计算结果为 true。更有用的还是 -f开关,如果下面的参数存在并且是一个常规文件(与目录或块设备或其他任何东西相反) ,它的计算结果为 true。

造成你困惑的原因可能是 -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