查找 if 语句中使用的结果

查找 if 语句中使用的结果

如何在 if 语句中使用 find 命令的结果并与 true 或 false 进行比较?

像这样的东西:

if [ `find . -name test.txt -size 156c`="true" ]; then echo Found; fi

这是整个脚本:

#!/bin/bash
if [ $# -ne 2 ]
then
    echo Not enough params
fi

if [ `find . -name $1 -size $2c | grep -q .` -eq 0 ]
then
    echo OK
fi  

答案1

find也许简单地将into的输出通过管道传输grep就可以解决问题:

if find . -name test.txt -size 156c | grep -q .; then echo Found; fi

find除非找到与您设置的名称和大小条件匹配的文件,否则调用将不会有输出,并且grep .仅当其输入非空时才会有退出状态 0(“true”)。选项-q要求不打印任何输出,这在这里无关紧要,因为我们只关心退出状态。


为了消除另一个可能的混乱来源:正如 @derobert 在评论中提到的,括号根本不是构造语法的一部分if:您会发现存在一个名为 的命令[,它负责评估布尔表达式,并且以退出代码的形式返回它们的真值([也可以是内置的 shell);这个命令检查是否存在右括号:

$ [ 3 -gt 2 ] ; echo $?
0

$ [ 3 -lt 2 ] ; echo $?
1

$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2

在上面的命令中,0 表示 true,1 表示 false,2 表示错误。

答案2

正如我在评论中所说,我认为你的问题实际上是

如何使用find命令测试单个文件以查看它是否满足find测试,例如size= 某个指定的数字?

其中文件名被指定为脚本的参数(因此您事先并不知道)。您正在围绕命令建立答案

if find . -name "$1" -size "$2"c | grep -q .
then
    echo OK
fi

我冒昧地插入了 dhag 推荐的引文。这并不是一个糟糕的开始,但它有一些问题:

  1. 如果用户使用参数运行脚本test.txt,并且有一个名为test.txt 在当前目录的子目录中,然后find会找到它并打印它的路径名,这样就会grep成功。但是,如果您的脚本尝试对test.txt 当前目录中调用的文件执行某些操作,它将失败,因为没有这样的文件。
    您可以通过添加-maxdepth 1 以防止find查找子目录来解决此问题。
  2. 如果用户使用参数 运行脚本my_subdir/test.txtfind则将失败,因为参数-name可能不包含斜杠。
  3. 如果您有一个非常顽皮的用户,他可能"*"只是为了制造麻烦而打字。

find .当您实际上不想搜索目录树时,使用似乎有点愚蠢。您知道文件的名称;你只是想测试它的属性。好吧,如果你闭上一只眼睛去读这本书的字里行间find(1),你就会意识到它实际上从未说过小路参数必须是目录——它只是暗示了这一点。事实证明你可以说

寻找  文件名  [表达]

应用于你的问题,这变成

find "$1" -size "$2"c

作为健全性检查,我建议:

if [ -f "$1" ]  &&  find "$1" -size "$2"c | grep -q .
then
    echo OK
fi

以避免在指定的文件根本不存在时收到错误消息find (并防止上述恶作剧的用户为脚本提供目录名称)。

答案3

与其他地方提供的解决方案类似grep,但也许更简单,您只需readfind.这将确保find退出(因为read肯定会)在第一场比赛中,给你一个可靠的回报值。

find . -name test.txt -size 156c | 
read -r na && echo ok || ! echo shite

...应该工作得很好。如果find打印任何内容,它将有一个尾随换行符,因此read即使是来自 的单个匹配也将返回 true find,但如果find不打印任何内容,则将在读取换行符之前read到达,因此它将返回错误。EOF\n

相关内容