【问题标题】:What do the -n and -a options do in a bash if statement? [duplicate]bash if 语句中的 -n 和 -a 选项有什么作用? [复制]
【发布时间】:2013-02-15 17:49:32
【问题描述】:

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

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

-a-n 是所谓的primaries吗?

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

【问题讨论】:

  • -n string 如果字符串的长度不为零,则为真。 -a file 如果文件存在则为真。

标签: bash


【解决方案1】:

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

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

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

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

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

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

man test

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

【讨论】:

  • 更精确,更容易阅读......谢谢
  • 这很有用,因为您的答案就像已接受答案的 TL;DR 版本,对于想要快速了解 -a-n 做什么而不阅读大量文字的人
  • 我的意思是,我很好奇人们是如何不断发现这个关于-n-a问题的。我的意思是,你在谷歌上搜索什么?正在搜索单字符命令行参数...如果我尝试过,我可能在 Google 上找不到这个问题。
  • 很好的答案,这个应该被接受。
  • @CoryKlein,我用谷歌搜索了以下内容:bash command "if -n"
【解决方案2】:

吹毛求疵

开关-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,如果您是man test,您可以查看它们的手册。尽管内置 test 的行为可能与手册页中记录的行为不同,这可能比您从 help [ 获得的简单描述更详细,但它可能会描述内置[ 命令相当准确。

-a 和 -n 的行为

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

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

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

为了可移植性,重要的是要注意一元 -a 是非标准扩展,在 POSIX 中 won't be found。它在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

【讨论】:

  • 如果这个答案在标题为“-a 和 -n 的行为”的部分下描述了 -n 的行为,那就太好了。
  • 我已经从上到下阅读了您的答案,但没有回答问题。我们对挑剔不感兴趣,这不是 OP 所要求的。他询问了-a-n,我仍然不知道-n 是如何工作的。
  • 我将引用上面的内容:“这将表明 -n 测试以下参数,如果它不是空字符串,则计算结果为 true。” -- 这个例子也证明了这一点。
  • 为什么要从挑剔开始?为什么不直接回答问题,然后深入了解答案所需的任何细节?
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2012-09-16
  • 2021-01-28
相关资源
最近更新 更多