-a和-n选项在以下bash if语句中执行什么功能?
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then REFNAME=$(basename $3) else
Are-a和-n所谓的primaries?
交换机-a和-n不是bash if语句的一部分,因为if命令不处理这些开关.
什么是初选?
我称之为“开关”,但是您链接的bash文档与“初级”相同(可能是因为这是在讨论布尔表达式的部分时使用的常用术语).
背景和文件
在sh脚本中,如果是以命令为参数的命令,则执行它并测试其返回码.如果返回代码为0,则执行到之后的代码块,直到关闭fi或(如果提供)以下其他.如果返回代码不是0并且提供了一个else语句,那么代码跟随else将被执行直到关闭fi.
如果命令为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
在示例代码中,您提供了您传递给的命令,如果是[,这也有时被称为测试.这是你要询问的开关的这个命令.在bash中,测试命令将是一个内置命令;尝试类型[学习它的类型.对于内置命令,帮助将显示用法,因此也可以运行帮助[查看文档.您的系统可能还有一个/ bin / [和/ bin / test,如果你测试你可以看到那些手册.虽然内置测试的行为可能与手册页中记录的行为可能不一致,这可能比简单描述更详细,您可以从帮助中获得[,它可能会描述内置的行为[命令相当准确.
-a和-n的行为
知道您正在运行的命令是测试,我们可以咨询帮助测试或人员测试并阅读其用法.这将显示-n测试以下参数,如果它不是空字符串,则计算结果为true.
在测试的文档中,您还将看到一个开关-e.此开关测试以下参数,如果该参数是存在的文件或目录,则计算结果为true.更有用的仍然是-f开关,如果以下参数存在并且是常规文件(与目录或块设备或其他任何内容相对),它将评估为true.
你的混淆的根源可能是可以有两种形式的-a:一元和二进制.当在一元上下文中使用-a时,这是一个以下参数,但没有前面的参数,它将其参数视为文件,并测试其存在,就像-e开关一样.然而,当在二进制上下文中使用-a时,就是在它之前有一个参数,在它之后有一个参数,它将其参数视为其他条件并充当布尔AND运算符.
为了便于携带,重要的是要注意,unary -a是POSIX中won’t be found的非标准扩展.然而,它在bash和ksh中可用,所以使用可能是广泛的.
例
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