Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash-if语句中,-n和-a选项做什么?_Bash - Fatal编程技术网

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

在bash-if语句中,-n和-a选项做什么?,bash,Bash,在下面的bashif语句中,-a和-n选项执行什么功能 if [ -n "$1" -a -n "$2" -a -n "$3" ]; then REFNAME=$(basename $3) else -a和-n是所谓的吗 -a file是否表示“如果文件存在,则为True?”-a将两个表达式链接在一个“and”或“&&”表达式中。这个选项是正确的 -n检查字符串的长度是否为非零 您可以将测试表达式转换为以下伪代码: if ( ($1 has nonzero length) and

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

if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
    REFNAME=$(basename $3)
else
-a
-n
是所谓的吗


-a file
是否表示“如果文件存在,则为True?”

-a
将两个表达式链接在一个“and”或“&&”表达式中。这个选项是正确的

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

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

if ( ($1 has nonzero length) and
     ($2 has nonzero length) and
     ($3 has nonzero length) )
该表达式中没有检查文件是否存在,只有参数是否已提供给脚本

参数
-a
-n
可以在
测试的手册页中找到

man test
操作员
[…]
通常用作
测试…
的简写,并且可能在您的系统上具有相同的功能。

挑剔 开关
-a
-n
严格来说不是
bash
if
语句的一部分,因为
if
命令不处理这些开关

什么是初选? 我称它们为“开关”,但您链接到的
bash
文档中提到的是与“primaries”相同的东西(可能是因为这是讨论布尔表达式部分时使用的常用术语)

背景和文件 在
sh
scripts
中,如果
是一个以命令为参数的命令,则执行该命令并测试其返回代码。如果返回代码为
0
则执行
后面的代码块,直到关闭
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
在示例代码中,您提供了传递给
的命令,如果
[
,它有时也称为
测试
。正是这个命令接受您询问的开关。在
bash
中,
测试
命令将是一个内置命令;请尝试
类型[
了解其类型。对于内置命令,
帮助将显示用法,因此也可以运行
帮助[
查看文档。您的系统可能还有一个
/bin/[
和a
/bin/test
,如果您
人工测试
,您可以查看这些测试的手册。尽管内置
测试的行为可能与手册页中记录的行为不同,这可能比从
帮助中获得的简单描述更详细[
,它可能会相当准确地描述内置的
[
命令的行为

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

test
的文档中,您还将看到开关
-e
的一个值。此开关测试以下参数,如果该参数是存在的文件或目录,则其计算结果为true。更有用的是
-f
开关,如果以下参数存在且是常规文件,则其计算结果为true(与目录或块设备或其他设备相对)

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

出于可移植性的考虑,需要注意的是一元
-a
是POSIX中的非标准扩展。但是,它在
bash
ksh
中可用,因此使用可能很普遍

例子
太长了,读不下去了。谢谢你的回答,就像你的答案是TL;DR版本的接受答案,对于那些想要快速理解“<代码> -<代码> >代码> -n>代码>的人,如果不阅读TeXTI的墙,我很好奇人们怎么会发现这个问题关于<代码> -N<代码>和<代码> -A <代码>。安,你在谷歌上搜索什么?搜索单字符命令行参数…如果我尝试的话,我可能在谷歌上找不到这个问题。答案很好,这个应该被接受。@CoryKlein,我在谷歌上搜索了以下内容:bash命令“if-n”。如果这个答案在标题为“a和-n的行为”。我从头到尾读了你的答案,但它没有回答问题。我们不想吹毛求疵,这不是OP所问的。他问了
-a
-n
,我仍然不知道
-n
是如何工作的。我将引用上面的内容:这将显示
-n
测试以下参数,如果它不是空字符串,则计算结果为true。“--该示例也演示了这一点。为什么不从挑剔开始?为什么不直接回答问题,然后深入了解答案所需的任何细节?-n如果字符串长度不为零,则字符串为True。-如果文件存在,则文件为True。”。
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