2014-10-18 78 views
0

我有一个问题,如果有人知道答案,我将不胜感激。 好的,重点。在我的剧本我有以下表现之一,目前尚不清楚对我形成手册页应该产生什么样的影响:“if”语句的测试-s

if ! [[ -s "$the_file_to_check" ]] ; then echo "file is zero sized and not exist | is exist and zero sized | not zero sized and not exist | not zero sized or not exist | not exist (obviously zero sized)" ; fi

存在单独检查它是否存在(的一项关键),为什么要加另一个?

以及这种逻辑如何工作。

我有点迷失在定义。

P.S.
我需要检查空虚但不存在。谢谢大家。

+0

这是有关的问题。我不清楚如果检查被否定,-s键是如何工作的。 – user3694243 2014-10-18 12:07:32

+2

如果出现以下情况,则用'-s'测试为true:(文件存在&&文件大小不为零)。所以'! -s'如果(文件不存在||文件大小为零)则为真。你能否澄清你的问题究竟是什么? – 2014-10-18 12:26:25

+0

如果您确定,请将该评论形成一个答案。这就是我所问的。 – user3694243 2014-10-18 12:33:09

回答

0

如果该命令仅打印字符串file is zero sized and not exist | is exist and zero sized | not exist (obviously zero sized)(如果文件不存在或文件大小为零)。

如果你希望你的if命令只检查零大小的文件,而不是文件存在,那么你可以做这样的事情:

if [[ $(du -h "$the_file_to_check" |cut -f 1) == "0" ]] ;then echo "file is zero sized" ; fi

但是,如果文件不这样if声明将发布一个错误不存在。确保只在文件存在时执行此操作。

+0

问题是关于测试中的-s键,它是如何工作的。是否没有机会只用bash的方式来检查文件的空白? – user3694243 2014-10-18 12:03:53

+0

测试-s检查“文件是否存在并且大小大于零”。所以当你运行'test -s filename'时,如果文件存在并且它不为空,它将返回'0'。如果它为空或不存在,则返回1。你可以检查test命令的返回值,像这样'test -s filename; echo $?' – RBH 2014-10-18 12:29:05

0

-s不仅检查文件是否存在,还检查是否包含任何数据(即,如果它的大小大于0字节)。这比-a选项(它实际上是-e的同义词)要多,它只测试文件是否存在。

touch foo 
[[ -a foo ]] && echo "File foo exists" 
[[ -s foo ]] || echo "File foo exists, but is size 0 bytes" 

(我想知道的-a的理由是什么,因为我不知道它做任何事情,从不同-e

+0

-a是按字母顺序排列的第一个 – user3694243 2014-10-18 12:45:38

+0

这个人gniourf_gniourf给出了我所问的最近似的描述。即:当在负面情况下使用-s键时会发生什么情况,因为它实际上包含对一个字母的两个测试。 – user3694243 2014-10-18 12:54:31

+0

@chepner:来自Posix:“一个早期的提案使用KornShell - 一个主要(具有相同的含义),但这被改为-e,因为人们担心人类将-a主要与-a混淆的可能性很高二元运算符“。 (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html)。 Bash(和ksh)保留旧的'-a'表单以实现backards兼容性。 – rici 2014-10-18 18:31:37