在bash-if语句中,-n和-a选项做什么?
在下面的bash在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
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