Linux bash脚本中的if语句做什么?

Linux bash脚本中的if语句做什么?,linux,bash,Linux,Bash,我不熟悉bash脚本编写,并通过一些示例进行学习。我看到的一个示例是使用if语句测试先前分配的输出文件是否有效,如下所示: if [ -n "$outputFile" ] && ! 2>/dev/null : >> $outputFile ; then exit 1 fi 我了解[-n“$outputFile”]的功能,但不了解条件语句的其余部分。有人能解释一下什么是!2> /dev/null:>>$outputFilemean/does 我在谷歌上搜

我不熟悉bash脚本编写,并通过一些示例进行学习。我看到的一个示例是使用if语句测试先前分配的输出文件是否有效,如下所示:

if [ -n "$outputFile" ] && ! 2>/dev/null : >> $outputFile ; then
    exit 1
fi
我了解
[-n“$outputFile”]
的功能,但不了解条件语句的其余部分。有人能解释一下什么是
!2> /dev/null:>>$outputFile
mean/does


我在谷歌上搜索了答案,但找到的大多数链接都是关于I/O重定向的解释,这些解释肯定是相关的,但仍然不清楚
!:>>结构。

脚本试图确保
$outputFile
以不太明显的方式可写

bash
中的null命令,它不执行任何操作。将
stderr
重定向到
/dev/null
只是为了在出现权限拒绝错误时抑制该错误


如果文件不可写,则命令失败,这使得条件为真,因为它被
否定和脚本退出。

这是一些奇怪的代码

命令内置于bash中。它相当于
true
;它什么也没做,成功了

: >> $outputFile
尝试不执行任何操作,并将(空)输出附加到
$outputFile
——已确认为非空字符串。如果文件不存在,重定向操作符将创建该文件

I/O重定向,例如
2>/dev/null
可以出现在简单命令中的任何位置;他们不必在最后。因此,
命令的stdout(为空)被附加到
$outputFile
,并且任何stderr输出都被重定向到/dev/null。任何这样的stderr输出都可能是重定向失败的结果,因为
命令本身不做任何事情,也不会失败。我不知道为什么stdout的重定向(到
$outputFile
的末尾)和stderr的重定向(到
/dev/null
)是在
命令的对面

运算符是逻辑“not”;它检查以下命令是否成功,并反转结果

以英文书写的最终结果是:

如果设置了“$outputFile”且不是空字符串,如果我们没有写入权限,则以1状态终止脚本


简而言之,它测试我们是否能够写入
$outputFile
,如果我们不能写入,它就会退出。

你在哪里看到它?它说它做什么?如果[[$outputFile]]&&[!-w$outputFile],它可以重写为
;然后退出;fi
@glennjackman:
-w
假设文件已经存在,所以它不完全相同。@MarkSetchell,我在这个脚本中找到了if语句:。这个脚本的基本思想是将正在运行的进程的I/O重定向到指定的文件。在dupx中使用if语句来测试文件是否可写。为thor准备一个关于为什么“stderr(到/dev/null)的重定向位于:命令的相反侧”的详细解释,我做了一些测试。创建了一个只读文件/tmp/bob,我运行了
2>/dev/null:>/tmp/bob
:>/tmp/bob 2>/dev/null
。前者不打印任何内容,而后者打印
bash:/tmp/bob:Permission denied
@GongyuWang:这很奇怪;在
2>/dev/null:>/tmp/bob
之后,我得到了
$?
=0(还有一个空的
/tmp/bob
文件)。如果我首先将
/tmp/bob
创建为一个目录或一个我无法编写的文件,我会得到
$?
=1(现在我实际阅读了您的全部评论,我意识到这就是您所做的)@GongyuWang:我可以通过使用
:2>/dev/null>/tmp/bob
来避免错误消息。
2>/dev/null
必须在
/tmp/bob
之前;它不必在
命令之前。我对if语句在bash中的工作方式感到困惑。我认为它类似于C,但如果它的返回状态不是那样的话(条件部分的)为零,则执行then部分。“@GongyuWang:对。返回状态为0表示成功,其他任何值表示失败。Shell条件是成功与失败,而不是true与false。(
/bin/true
将退出状态设置为0;
/bin/false
将其设置为1。)回答正确且简洁!谢谢。