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

sur*_*rfi 39 bash

在以下bash 语句中,-a-n选项执行了哪些功能if

if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
    REFNAME=$(basename $3)
else
Run Code Online (Sandbox Code Playgroud)

-a-n所谓的初选

是否-a file意味着"如果文件存在则为真."?

Cor*_*ein 96

-a将两个表达式链接在一起"和"或"&&"表达式中.不推荐使用此选项.

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

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

if ( ($1 has nonzero length) and
     ($2 has nonzero length) and
     ($3 has nonzero length) )
Run Code Online (Sandbox Code Playgroud)

该表达式中没有检查文件是否存在,只检查是否已将参数提供给脚本.

这些参数-a-n可以在联机帮助页中找到test

man test
Run Code Online (Sandbox Code Playgroud)

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

  • 更精确,更容易阅读..谢谢 (18认同)
  • @CoryKlein,我用谷歌搜索了以下内容:bash命令“if -n” (3认同)
  • 这很有用,因为您的答案类似于已接受答案的 TL;DR 版本,适用于想要在不阅读文字墙的情况下快速了解 `-a` 和 `-n` 的作用的人 (2认同)
  • 我的意思是我很好奇人们是如何不断发现这个关于 `-n` 和 `-a` 的问题的。我的意思是,你在谷歌搜索什么?搜索单字符命令行参数......如果我尝试过,我可能在谷歌上找不到这个问题。 (2认同)
  • 很好的答案,应该接受这个答案。 (2认同)

Sor*_*gal 33

挑剔

开关-a-n是不是严格意义上的一部分,bash if在该声明if命令不会处理这些开关.

什么是初选?

我把它们称为"开关",但是bash你链接到的文档引用了与"primaries"相同的东西(可能是因为这是讨论布尔表达式部分时常用的术语).

背景和文档

sh脚本中if是一个命令,它以命令作为参数,执行它并测试其返回码.如果返回代码是0以下代码块,then则执行直至关闭fi或(如果提供)以下内容else.如果返回代码不是,0并且提供了else语句,else则执行以下代码块直到结束fi.

您可以通过传递if命令true或命令来查看此效果,这些命令或命令false是无效00分别返回和返回的简单命令.

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
Run Code Online (Sandbox Code Playgroud)

在示例代码你提供你传递到命令if就是[,其有时也被称为test.这个命令接受你询问的开关.在bashtest命令将是一个内置的命令; 尝试type [学习它的类型.对于内置命令help将显示用法,因此也可以运行help [以查看文档.您的系统可能还有a /bin/[和a /bin/test,如果man test您可以看到这些手册.虽然内置的行为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
Run Code Online (Sandbox Code Playgroud)

  • 我已经从上到下阅读了您的答案,但它没有回答问题。我们对吹毛求疵不感兴趣,这不是 OP 所要求的。他询问了 `-a` 和 `-n`,我仍然不知道 `-n` 是如何工作的。 (13认同)
  • 如果这个答案在题为"-a和-n的行为"的章节下描述了-n的行为,那将是很好的. (12认同)
  • 为什么要从挑剔开始?为什么不直接回答问题,然后深入了解答案所需的任何细节? (11认同)
  • 如果提供正确的-n解释,而不是完全相反,也会很好. (2认同)