Linux bash脚本中的if语句做什么?
我不熟悉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 我在谷歌上搜
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。)回答正确且简洁!谢谢。