什么功能-a
和-n
选项在以下bash中执行if
陈述?
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
REFNAME=$(basename $3)
else
是-a
和-n
所谓*初选*?
做-a file
意思是"如果文件存在则为真。"?
答案
挑剔
开关-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 test
或者man test
并阅读其用法。-n
测试以下参数,如果它不是空字符串,则计算结果为 true。
在文档中test
您还会看到一个开关-e
。-f
如果以下参数存在并且是常规文件(而不是目录或块设备或其他文件),则该 switch 的值为 true。
您感到困惑的根源可能是two 的形式-a
:一元和二元。-a
用于一元上下文中,即以下一个论点 但没有前面的参数 ,它将其参数视为文件并测试其存在,就像-e
转变。-a
在二进制上下文中使用,即其前有一个参数,其后有一个参数,它将其参数视为其他条件并充当布尔 AND 运算符。
为了可移植性,重要的是要注意一元-a
是一个非标准扩展不会被发现在 POSIX 中。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